Browse Source

feat:添加吉利编译接口

HeWang 6 days ago
parent
commit
6336f8ede4

+ 6 - 0
deploy/plugin-compile-application.yaml

@@ -10,6 +10,12 @@ accessKeyId2: "n8glvFGS25MrLY7j"
 accessKeySecret2: "xZ2Fozoarpfw0z28FUhtg8cu0yDc5d"
 bucketName2: "pji-bucket1"
 
+cname3: "http://36.110.106.156:20204"
+endpoint3: "oss-cn-beijing-gqzl-d01-a.ops.gqzl-cloud.com"
+accessKeyId3: "n8glvFGS25MrLY7j"
+accessKeySecret3: "xZ2Fozoarpfw0z28FUhtg8cu0yDc5d"
+bucketName3: "dcl"
+
 codeDir: "/root/cicv-data-closedloop/trigger/"
 vaildateCmd: "/root/cicv-data-closedloop/deploy/exe/plugin-vaildate.exe"
 

+ 2 - 0
tools/plugin-compile/main/main.go

@@ -17,11 +17,13 @@ func main() {
 		c_log.InitLog(config.ApplicationYaml.LogDir, config.ApplicationYaml.ServiceName)
 		config.InitOss(false)
 		config.InitOss2(false)
+		config.InitOss3(false)
 	}
 	go func() {
 		mux := http.NewServeMux()
 		mux.Handle("/compile", h_validate_request_header.HeaderValidationMiddleware(&handler.CompileHandler{}))
 		mux.Handle("/pji_compile", h_validate_request_header.HeaderValidationMiddleware(&handler.PjiCompileHandler{}))
+		mux.Handle("/jili_compile", h_validate_request_header.HeaderValidationMiddleware(&handler.JiliCompileHandler{}))
 		err := http.ListenAndServe(":"+util.ToString(config.ApplicationYaml.ServicePort), mux) // 这里是阻塞并监听HTTP端口
 		if err != nil {
 			c_log.GlobalLogger.Error("程序崩溃监听端口 " + util.ToString(config.ApplicationYaml.ServicePort) + " 失败。")

+ 21 - 0
tools/plugin-compile/package/config/c_oss.go

@@ -22,6 +22,9 @@ var (
 	//bucketName2      = "pji-bucket1"
 	OssClient2 *oss.Client
 	OssBucket2 *oss.Bucket
+
+	OssClient3 *oss.Client
+	OssBucket3 *oss.Bucket
 )
 
 func InitOss(isUseCname bool) {
@@ -59,3 +62,21 @@ func InitOss2(isUseCname bool) {
 		os.Exit(-1)
 	}
 }
+
+func InitOss3(isUseCname bool) {
+	var err error
+	if isUseCname {
+		OssClient3, err = oss.New(ApplicationYaml.Cname3, ApplicationYaml.AccessKeyId3, ApplicationYaml.AccessKeySecret3, oss.UseCname(true)) // 公网
+	} else {
+		OssClient3, err = oss.New(ApplicationYaml.Endpoint3, ApplicationYaml.AccessKeyId3, ApplicationYaml.AccessKeySecret3, oss.UseCname(false)) // 内网
+	}
+	if err != nil {
+		fmt.Println("无法创建阿里云client:", err)
+		os.Exit(-1)
+	}
+	OssBucket3, err = OssClient3.Bucket(ApplicationYaml.BucketName3)
+	if err != nil {
+		fmt.Println("无法创建阿里云bucket:", err)
+		os.Exit(-1)
+	}
+}

+ 5 - 0
tools/plugin-compile/package/config/i_application.go

@@ -18,6 +18,11 @@ type ApplicationYamlStruct struct {
 	AccessKeyId2     string `yaml:"accessKeyId2"`
 	AccessKeySecret2 string `yaml:"accessKeySecret2"`
 	BucketName2      string `yaml:"bucketName2"`
+	Cname3           string `yaml:"cname3"`
+	Endpoint3        string `yaml:"endpoint3"`
+	AccessKeyId3     string `yaml:"accessKeyId3"`
+	AccessKeySecret3 string `yaml:"accessKeySecret3"`
+	BucketName3      string `yaml:"bucketName3"`
 	CodeDir          string `yaml:"codeDir"`
 	VaildateCmd      string `yaml:"vaildateCmd"`
 	ServicePort      string `yaml:"servicePort"`

+ 86 - 0
tools/plugin-compile/package/handler/compile_plugin.go

@@ -194,3 +194,89 @@ func (h *PjiCompileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	result, _ := json.Marshal(entity.HttpResult{Status: true, Code: "2000", Message: "编译插件" + goObjectKey + "成功。"})
 	_, _ = fmt.Fprintf(w, string(result))
 }
+
+// JiliCompileHandler implements http.Handler
+type JiliCompileHandler struct{}
+
+func (h *JiliCompileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	codeDir := config.ApplicationYaml.CodeDir
+	vaildateCmd := config.ApplicationYaml.VaildateCmd // /root/cicv-data-closedloop/plugin-vaildate/plugin-vaildate.exe /root/rosbag-handle-pji/trigger/431a4254/main/431a4254.so
+
+	c_log.GlobalLogger.Error("JiliCompileHandler 开始处理。")
+	// 1 校验参数
+	queryParams := r.URL.Query()
+	goObjectKey := queryParams.Get("goObjectKey")
+	if goObjectKey == "" {
+		c_log.GlobalLogger.Error("参数 goObjectKey 不能为空。")
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1003", Message: "参数 goObjectKey 不能为空。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+	soObjectKey := queryParams.Get("soObjectKey")
+	if soObjectKey == "" {
+		c_log.GlobalLogger.Error("参数 soObjectKey 不能为空。")
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1003", Message: "参数 soObjectKey 不能为空。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+	//c_log.GlobalLogger.Infof("接收到参数【deviceType】=%v,【goObjectKey】=%v,【soObjectKey】=%v", deviceType, goObjectKey, soObjectKey)
+	c_log.GlobalLogger.Infof("接收到参数【goObjectKey】=%v,【soObjectKey】=%v", goObjectKey, soObjectKey)
+
+	// 2 从 oss 上下载 go 文件
+	tempMiddlePath := uuid.New().String()[:8]
+	goLocalPath := codeDir + tempMiddlePath + "/main/" + tempMiddlePath + ".go"
+	c_log.GlobalLogger.Infof("下载源代码 %v --> %v", goObjectKey, goLocalPath)
+	if err := util2.LimitDownload(config.OssBucket3, 41943040, goObjectKey, goLocalPath); err != nil {
+		c_log.GlobalLogger.Error("下载源代码 ", goObjectKey, " 出错:", err)
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1004", Message: "下载源代码 " + goObjectKey + " 出错。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+	// 修改文件权限为 777
+	if err := os.Chmod(goLocalPath, 0777); err != nil {
+		c_log.GlobalLogger.Error("修改文件权限 "+goLocalPath+" 出错:", err)
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1005", Message: "修改文件权限 " + goLocalPath + " 出错。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+
+	// 3 编译 go 文件
+	soLocalPath := codeDir + tempMiddlePath + "/main/" + tempMiddlePath + ".so"
+	copiedCompileCmdArgs := make([]string, len(compileCmdArgs))
+	copy(copiedCompileCmdArgs, compileCmdArgs)
+	copiedCompileCmdArgs = append(copiedCompileCmdArgs, "-o", soLocalPath, goLocalPath)
+	if _, output, err := util2.ExecuteWithEnvAndDir(os.Environ(), codeDir, compileCmd, copiedCompileCmdArgs...); err != nil {
+		c_log.GlobalLogger.Error("编译插件 ", goLocalPath, " 出错:【命令】=", compileCmd, " ", copiedCompileCmdArgs, "【output】=", output, ",【err】=", err)
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1006", Message: "编译插件 " + goObjectKey + " 出错。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+
+	// 4 校验插件是否能用
+	if _, output, err := util2.Execute(vaildateCmd, soLocalPath); err != nil || output != "0" {
+		c_log.GlobalLogger.Error("插件 ", goLocalPath, " 校验失败:【命令】=", vaildateCmd, " ", soLocalPath, "【output】=", output)
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1007", Message: "插件 " + soObjectKey + " 校验失败。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+	c_log.GlobalLogger.Error("插件 ", soLocalPath, " 校验成功。")
+	// 5 如果插件能用,将插件上传到 oss
+	if err := util2.LimitUpload(config.OssBucket3, 41943040, soObjectKey, soLocalPath); err != nil {
+		c_log.GlobalLogger.Error("上传插件 ", soObjectKey, " 出错:", err)
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1008", Message: "上传插件 " + soObjectKey + " 出错。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+	// 6 删除本地缓存的源代码和插件
+	if err := util2.RemoveDir(codeDir + tempMiddlePath + "/"); err != nil {
+		c_log.GlobalLogger.Error("删除本地缓存目录 ", codeDir+tempMiddlePath+"/", " 出错:", err)
+		result, _ := json.Marshal(entity.HttpResult{Status: false, Code: "1009", Message: "删除本地缓存出错。"})
+		_, _ = fmt.Fprintf(w, string(result))
+		return
+	}
+
+	// 7 返回成功数据
+	c_log.GlobalLogger.Error("编译插件 ", goLocalPath, " 成功。")
+	result, _ := json.Marshal(entity.HttpResult{Status: true, Code: "2000", Message: "编译插件" + goObjectKey + "成功。"})
+	_, _ = fmt.Fprintf(w, string(result))
+}