LingxinMeng 9 月之前
父節點
當前提交
234388112d

+ 3 - 3
aarch64/pjibot_guide/common/config/c_cloud.go

@@ -60,9 +60,9 @@ type CollectLimitStruct struct {
 }
 }
 
 
 type DataDirStruct struct {
 type DataDirStruct struct {
-	Src     string `yaml:"src"`
-	Dest    string `yaml:"dest"`
-	Exclude string `yaml:"exclude"`
+	Src     string   `yaml:"src"`
+	Dest    string   `yaml:"dest"`
+	Exclude []string `yaml:"exclude"`
 }
 }
 
 
 type cloudConfig struct {
 type cloudConfig struct {

+ 41 - 32
aarch64/pjibot_guide/common/service/rosbag_upload.go

@@ -8,7 +8,6 @@ import (
 	"cicv-data-closedloop/common/entity"
 	"cicv-data-closedloop/common/entity"
 	"cicv-data-closedloop/common/util"
 	"cicv-data-closedloop/common/util"
 	"fmt"
 	"fmt"
-	"io/fs"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
 	"strings"
 	"strings"
@@ -157,42 +156,52 @@ outLoop:
 			}
 			}
 		}
 		}
 
 
-		// 额外采集data目录
-		//err = util.ZipDir(commonConfig.CloudConfig.DataDir.Src, commonConfig.CloudConfig.DataDir.Dest, commonConfig.CloudConfig.DataDir.Exclude)
-		//if err != nil {
-		//	c_log.GlobalLogger.Error("压缩data目录失败:", err)
-		//}
-		var filePaths []string                                                                                           // 初始化一个切片来保存文件路径
-		err = filepath.WalkDir(commonConfig.CloudConfig.DataDir.Src, func(path string, d fs.DirEntry, err error) error { // 使用filepath.WalkDir遍历目录
+		// 压缩采集data目录
+		{
+			err = util.ZipDir(commonConfig.CloudConfig.DataDir.Src, commonConfig.CloudConfig.DataDir.Dest, commonConfig.CloudConfig.DataDir.Exclude)
 			if err != nil {
 			if err != nil {
-				return err // 如果有错误,返回错误
-			}
-
-			// 检查是否为文件(跳过目录)
-			if !d.IsDir() {
-				filePaths = append(filePaths, path) // 将文件路径添加到切片中
+				c_log.GlobalLogger.Error("压缩data目录失败:", err)
 			}
 			}
-			return nil
-		})
-		if err != nil {
-			c_log.GlobalLogger.Error("扫描 data 目录失败:", err)
-			goto outLoop
-		}
-
-		// 不压缩上传所有文件
-		for _, path := range filePaths {
-			if strings.Contains(path, commonConfig.CloudConfig.DataDir.Exclude) {
-				continue
-			}
-			relativePath := strings.Replace(path, commonConfig.CloudConfig.DataDir.Src, "", 1)
-			ossKey := objectKey3 + "data/" + relativePath
-			err = commonConfig.OssBucket.PutObjectFromFile(ossKey, path)
+			err = commonConfig.OssBucket.PutObjectFromFile(objectKey3+"data.zip", commonConfig.CloudConfig.DataDir.Dest)
 			if err != nil {
 			if err != nil {
-				c_log.GlobalLogger.Errorf("上传 data 目录内文件【%v】->【%v】失败:%v", path, ossKey, err)
-				goto outLoop
+				c_log.GlobalLogger.Error("上传 data 目录压缩文件失败:", err)
 			}
 			}
+			commonConfig.OssMutex.Unlock()
+		}
+		// todo 不压缩采集data目录
+		{
+			//var filePaths []string                                                                                           // 初始化一个切片来保存文件路径
+			//err = filepath.WalkDir(commonConfig.CloudConfig.DataDir.Src, func(path string, d fs.DirEntry, err error) error { // 使用filepath.WalkDir遍历目录
+			//	if err != nil {
+			//		return err // 如果有错误,返回错误
+			//	}
+			//
+			//	// 检查是否为文件(跳过目录)
+			//	if !d.IsDir() {
+			//		filePaths = append(filePaths, path) // 将文件路径添加到切片中
+			//	}
+			//	return nil
+			//})
+			//if err != nil {
+			//	c_log.GlobalLogger.Error("扫描 data 目录失败:", err)
+			//	goto outLoop
+			//}
+			//
+			//// 不压缩上传所有文件
+			//for _, path := range filePaths {
+			//	if strings.Contains(path, commonConfig.CloudConfig.DataDir.Exclude) {
+			//		continue
+			//	}
+			//	relativePath := strings.Replace(path, commonConfig.CloudConfig.DataDir.Src, "", 1)
+			//	ossKey := objectKey3 + "data/" + relativePath
+			//	err = commonConfig.OssBucket.PutObjectFromFile(ossKey, path)
+			//	if err != nil {
+			//		c_log.GlobalLogger.Errorf("上传 data 目录内文件【%v】->【%v】失败:%v", path, ossKey, err)
+			//		goto outLoop
+			//	}
+			//}
+			//commonConfig.OssMutex.Unlock()
 		}
 		}
-		commonConfig.OssMutex.Unlock()
 
 
 		// 删除本地所有已上传的bag文件
 		// 删除本地所有已上传的bag文件
 		c_log.GlobalLogger.Infof("结束处理窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", currentTimeWindow.Labels, currentTimeWindow.FaultTime, currentTimeWindow.Length)
 		c_log.GlobalLogger.Infof("结束处理窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", currentTimeWindow.Labels, currentTimeWindow.FaultTime, currentTimeWindow.Length)

+ 4 - 1
aarch64/pjibot_guide/引导机器人默认配置文件-cloud-config.yaml

@@ -18,7 +18,10 @@ disk:
   used: 20000000000 # 磁盘占用阈值,单位bytes
   used: 20000000000 # 磁盘占用阈值,单位bytes
 data-dir:
 data-dir:
   src: /root/pjirobot/data/ # 需要额外采集的 data 目录
   src: /root/pjirobot/data/ # 需要额外采集的 data 目录
-  exclude: /root/pjirobot/data/cicv-data-closedloop # 采集data目录时排除的子目录
+  dest: /root/pjirobot/data.zip
+  exclude:
+    - /root/pjirobot/data/cicv-data-closedloop/ # 采集data目录时排除的子目录
+    - /root/pjirobot/data/logs/
 map-buf-files:
 map-buf-files:
   - /root/pjirobot/data/mapBuf/forbid_area.json
   - /root/pjirobot/data/mapBuf/forbid_area.json
   - /root/pjirobot/data/mapBuf/forbid_area.yaml
   - /root/pjirobot/data/mapBuf/forbid_area.yaml

+ 23 - 10
common/util/u_io.go

@@ -1,6 +1,7 @@
 package util
 package util
 
 
 import (
 import (
+	"bytes"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 	"io/fs"
 	"io/fs"
@@ -12,23 +13,35 @@ import (
 )
 )
 
 
 // 压缩指定目录到ZIP文件,并排除一个指定的子目录
 // 压缩指定目录到ZIP文件,并排除一个指定的子目录
-func ZipDir(src, dest, excludeDir string) error {
-	// 获取相对路径,以便用于排除目录
-	relExcludeDir, err := filepath.Rel(src, excludeDir)
-	if err != nil {
-		return err
+func ZipDir(src, dest string, excludeDirs []string) error {
+	// 构造排除参数的字符串
+	excludeArgs := make([]string, 0, len(excludeDirs))
+	for _, excludeDir := range excludeDirs {
+		relExcludeDir, err := filepath.Rel(src, excludeDir)
+		if err != nil {
+			return err
+		}
+		// 确保排除路径以 '*' 结尾,以匹配目录下的所有内容
+		excludeArgs = append(excludeArgs, filepath.Join(relExcludeDir, "*"))
 	}
 	}
 
 
+	// 拼接 -x 参数
+	excludeStr := strings.Join(excludeArgs, " -x ")
+
 	// 构建zip命令
 	// 构建zip命令
-	cmd := exec.Command("zip", "-r", dest, ".", "-x", filepath.Join(relExcludeDir, "*"))
+	cmd := exec.Command("zip", append([]string{"-r", dest, "."}, strings.Split(excludeStr, " ")...)...)
 
 
 	// 设置工作目录为要压缩的源目录
 	// 设置工作目录为要压缩的源目录
 	cmd.Dir = src
 	cmd.Dir = src
 
 
-	// 运行命令并捕获输出
-	output, err := cmd.CombinedOutput()
-	if err != nil {
-		return fmt.Errorf("zip command failed: %v, output: %s", err, string(output))
+	// 捕获命令的标准输出和标准错误输出
+	var out bytes.Buffer
+	cmd.Stdout = &out
+	cmd.Stderr = &out
+
+	// 运行命令
+	if err := cmd.Run(); err != nil {
+		return fmt.Errorf("zip command failed: %v, output: %s", err, out.String())
 	}
 	}
 
 
 	return nil
 	return nil