From 0bb9a4c37862e5098a596e121fb13fd12c2ca44f Mon Sep 17 00:00:00 2001 From: liuxiaolong <liuxiaolong@aiotlink.com> Date: 星期五, 29 五月 2020 14:14:15 +0800 Subject: [PATCH] install sdk tar.gz --- extend/util/zip.go | 85 +++++++++++++- controllers/fileController.go | 3 controllers/syssetcont.go | 26 ++++ service/SdkInstall.go | 229 ++++++++++++++++++++++++++++++++++++++ router/router.go | 2 5 files changed, 338 insertions(+), 7 deletions(-) diff --git a/controllers/fileController.go b/controllers/fileController.go index fb261b5..d6370fa 100644 --- a/controllers/fileController.go +++ b/controllers/fileController.go @@ -492,6 +492,9 @@ return } faceB = decodeF + } else { + util.ResponseFormat(c, code.ComError, "鏈潯浜鸿劯鎶撴媿鐗瑰緛涓虹┖锛岃妫�鏌�") + return } } diff --git a/controllers/syssetcont.go b/controllers/syssetcont.go index cfcbe72..396b781 100644 --- a/controllers/syssetcont.go +++ b/controllers/syssetcont.go @@ -635,3 +635,29 @@ util.ResponseFormat(c,code.UpgradeFail,err.Error()) } } + +// @Security ApiKeyAuth +// @Summary 绠楁硶瀹夎鍖呭紑濮嬪畨瑁� +// @Description 绠楁硶瀹夎鍖呭紑濮嬪畨瑁� +// @Accept multipart/form-data +// @Produce json +// @Tags sysset +// @Param identifier formData string true "鏁翠釜鏂囦欢鐨勫敮涓�鏍囪瘑锛岀洰鍓嶆槸md5" +// @Param filename formData string true "鏂囦欢鍚嶇О" +// @Success 200 {string} json "{"code":200, msg:"", success:true}" +// @Failure 500 {string} json "{"code":500, msg:"", success:false}" +// @Router /data/api-v/sysset/sdkInstall [post] +func (sset SysSetController) SdkInstall(c *gin.Context) { + identifier := c.Request.FormValue("identifier") + filename := c.Request.FormValue("filename") + if identifier == "" || filename == "" { + util.ResponseFormat(c,code.RequestParamError,"") + return + } + var sv service.SysService + if b,err := sv.SdkInstall(identifier, filename);b { + util.ResponseFormat(c,code.UpgradeSuccess,"绠楁硶瀹夎鎴愬姛") + } else { + util.ResponseFormat(c,code.UpgradeFail,err.Error()) + } +} diff --git a/extend/util/zip.go b/extend/util/zip.go index cb44ee3..f057359 100644 --- a/extend/util/zip.go +++ b/extend/util/zip.go @@ -5,10 +5,13 @@ "basic.com/valib/logger.git" "compress/gzip" "errors" + "fmt" "io" "io/ioutil" + "log" "os" "path" + "path/filepath" "strings" ) @@ -26,7 +29,7 @@ logger.Debug("鏂囦欢鍚嶇О鏄�", FileName) //鍒涘缓瀛樻斁鍘嬬缉鏂囦欢鐨勮矾寰�(濡傛灉鏂囦欢澶逛笉瀛樺湪) - if !dirExists(DesPathName) { + if !DirExists(DesPathName) { os.MkdirAll(DesPathName, 0777) } logger.Debug("鍒涘缓鏂囦欢") @@ -121,11 +124,11 @@ // 娓呯悊璺緞瀛楃涓� src = path.Clean(src) // 鍒ゆ柇瑕佹墦鍖呯殑鏂囦欢鎴栫洰褰曟槸鍚﹀瓨鍦� - if !exists(src) { + if !Exists(src) { return errors.New("瑕佹墦鍖呯殑鏂囦欢鎴栫洰褰曚笉瀛樺湪锛�" + src) } // 鍒ゆ柇鐩爣鏂囦欢鏄惁瀛樺湪 - if fileExists(dstTar) { + if FileExists(dstTar) { if failIfExist { // 涓嶈鐩栧凡瀛樺湪鐨勬枃浠� return errors.New("鐩爣鏂囦欢宸茬粡瀛樺湪锛�" + dstTar) } else { // 瑕嗙洊宸插瓨鍦ㄧ殑鏂囦欢 @@ -296,19 +299,87 @@ } // 鍒ゆ柇妗f鏄惁瀛樺湪 -func exists(name string) bool { +func Exists(name string) bool { _, err := os.Stat(name) return err == nil || os.IsExist(err) } // 鍒ゆ柇鏂囦欢鏄惁瀛樺湪 -func fileExists(filename string) bool { +func FileExists(filename string) bool { fi, err := os.Stat(filename) return (err == nil || os.IsExist(err)) && !fi.IsDir() } // 鍒ゆ柇鐩綍鏄惁瀛樺湪 -func dirExists(dirname string) bool { +func DirExists(dirname string) bool { fi, err := os.Stat(dirname) return (err == nil || os.IsExist(err)) && fi.IsDir() -} \ No newline at end of file +} + + +//鏂囦欢澶瑰鍒� +func CopyDir(src string, dest string) { + src_original := src + err := filepath.Walk(src, func(src string, f os.FileInfo, err error) error { + if f == nil { + return err + } + if f.IsDir() { + CopyDir(f.Name(), dest+"/"+f.Name()) + } else { + fmt.Println(src) + fmt.Println(src_original) + fmt.Println(dest) + + dest_new := strings.Replace(src, src_original, dest, -1) + fmt.Println(dest_new) + fmt.Println("CopyFile:" + src + " to " + dest_new) + CopyFile(src, dest_new) + } + return nil + }) + if err != nil { + fmt.Printf("filepath.Walk() returned %v\n", err) + } +} + +//澶ф枃浠跺鍒� +func CopyFile(srcFileName string, dstFileName string) { + //鎵撳紑婧愭枃浠� + srcFile, err := os.Open(srcFileName) + if err != nil { + log.Fatalf("婧愭枃浠惰鍙栧け璐�,鍘熷洜鏄�:%v\n", err) + } + defer func() { + err = srcFile.Close() + if err != nil { + log.Fatalf("婧愭枃浠跺叧闂け璐�,鍘熷洜鏄�:%v\n", err) + } + }() + + //鍒涘缓鐩爣鏂囦欢,绋嶅悗浼氬悜杩欎釜鐩爣鏂囦欢鍐欏叆鎷疯礉鍐呭 + distFile, err := os.Create(dstFileName) + if err != nil { + log.Fatalf("鐩爣鏂囦欢鍒涘缓澶辫触,鍘熷洜鏄�:%v\n", err) + } + defer func() { + err = distFile.Close() + if err != nil { + log.Fatalf("鐩爣鏂囦欢鍏抽棴澶辫触,鍘熷洜鏄�:%v\n", err) + } + }() + //瀹氫箟鎸囧畾闀垮害鐨勫瓧鑺傚垏鐗�,姣忔鏈�澶氳鍙栨寚瀹氶暱搴� + var tmp = make([]byte, 1024*4) + //寰幆璇诲彇骞跺啓鍏� + for { + n, err := srcFile.Read(tmp) + n, _ = distFile.Write(tmp[:n]) + if err != nil { + if err == io.EOF {//璇诲埌浜嗘枃浠舵湯灏�,骞朵笖鍐欏叆瀹屾瘯,浠诲姟瀹屾垚杩斿洖(鍏抽棴鏂囦欢鐨勬搷浣滅敱defer鏉ュ畬鎴�) + return + } else { + log.Fatalf("鎷疯礉杩囩▼涓彂鐢熼敊璇�,閿欒鍘熷洜涓�:%v\n", err) + } + } + } +} diff --git a/router/router.go b/router/router.go index 9c87a5f..12d5af8 100644 --- a/router/router.go +++ b/router/router.go @@ -257,6 +257,8 @@ vsset.GET("/patchUpdate", ssController.PatchUpdateCheck) vsset.POST("/patchUpdate", ssController.PatchUpdate) vsset.POST("/upgrade", ssController.Upgrade) + + vsset.POST("/sdkInstall", ssController.SdkInstall) } ic := r.Group(urlPrefix + "/info") diff --git a/service/SdkInstall.go b/service/SdkInstall.go index 6d43c33..3ad4557 100644 --- a/service/SdkInstall.go +++ b/service/SdkInstall.go @@ -1 +1,230 @@ package service + +import ( + "basic.com/dbapi.git" + "basic.com/valib/logger.git" + "encoding/json" + "errors" + "io/ioutil" + "os" + "path" + "webserver/extend/config" + "webserver/extend/util" +) + +//绠楁硶瀹夎鍖呭畨瑁� +func (sv SysService) SdkInstall(identifier string,filename string) (bool,error) { + configPatchPath := "" + if config.Server.PatchPath != "" { + configPatchPath = config.Server.PatchPath + } else { + configPatchPath = "/opt/vasystem/patch" + } + + filenameWithSuffix := path.Base(filename) + ext := path.Ext(filenameWithSuffix) + + zipFilePath := configPatchPath + "/"+identifier+ext + if util.Exists(zipFilePath) { + strMd5, e := util.FileMd5(zipFilePath) + if e !=nil || strMd5 == "" { + return false,errors.New("鑾峰彇瀹夎鍖卪d5澶辫触") + } + if strMd5 == identifier { + if !installSdk(identifier, ext) { + return false,errors.New("鎵ц瀹夎杩囩▼寮傚父,璇风‘瀹氫笂浼犵殑瀹夎鍖呮槸tar.gz鏍煎紡") + } + return true,nil + + } else { + logger.Debug("strMd5 is", strMd5,"identifier is",identifier,"not equal") + return false,errors.New("鏍¢獙瀹夎鏂囦欢澶辫触") + } + } else { + return false,errors.New("瀹夎鍖呭凡涓㈠け锛岃閲嶆柊涓婁紶") + } +} + +//瀹夎sdk +func installSdk(identifier string, ext string) bool { + configPatchPath := "" + if config.Server.PatchPath != "" { + configPatchPath = config.Server.PatchPath + } else { + configPatchPath = "/opt/vasystem/patch" + } + //1.瑙e帇缂╂洿鏂板寘 + unPackPath := configPatchPath+"/"+identifier+"_basic/" + if util.Exists(unPackPath) { + //姝ょ増鏈凡缁忔洿鏂拌繃 + rmErr := os.RemoveAll(unPackPath) + if rmErr !=nil { + return false + } + } + if !util.CreateDirectory(unPackPath) { + return false + } + + unPackFilePath := configPatchPath+"/"+identifier+ext + err := util.UnTarGz(unPackFilePath, unPackPath) + if err !=nil { + logger.Debug("UnPack err:",err,"unPackFile:",unPackFilePath) + return false + } + //瑙e帇瀹屾垚锛岃幏鍙栧畨瑁呭寘涓殑鏂囦欢锛屽紑濮嬪畨瑁� + //1.瑙f瀽瀹夎璇存槑ins.inc + incPath := unPackPath+"ins.inc" + ret := false + if util.Exists(incPath) { + if incB, err := ioutil.ReadFile(incPath);err == nil { + var ins InsInc + if err = json.Unmarshal(incB, &ins); err == nil { + //澶勭悊鎺堟潈淇℃伅 + + //2.瑙f瀽sdk.def,灏唖o鍜寊conf澶嶅埗鍒�/opt/vasystem/libs/鏂囦欢澶逛笅 + defPath := unPackPath + "sdk.def" + if util.Exists(defPath) { + if defB, err := ioutil.ReadFile(defPath); err == nil { + //3.灏嗙畻娉晄o銆佷緷璧栨枃浠躲�亃conf銆� + soM := make(map[string]SdkDef) + var skDefArr []SdkDef + if err = json.Unmarshal(defB, &skDefArr);err == nil { + var sdkApi dbapi.SdkApi + for _,skd := range skDefArr { + if _,ok := soM[skd.Def.SdkType];!ok { + soM[skd.Def.SdkType] = skd + } + srv := SdkRegisterVo{ + Id: skd.Def.Id, + SdkType: skd.Def.SdkType, + SdkName: skd.Def.SdkName, + Icon: skd.Def.Icon, + Url: skd.Def.Url, + } + for _,ag := range skd.Args { + sra := SdkRegisterArgVo{ + Scope: ag.Scope, + } + sra.SdkArg = SdkArg{ + Alias: ag.Alias, + Name: ag.Name, + Type: ag.Type, + ArgType: ag.ArgType, + Must: ag.Must, + Unit: ag.Unit, + Range: ag.Range, + DefaultValue: ag.DefaultValue, + DefaultOperator: ag.DefaultOperator, + Sort: ag.Sort, + } + srv.Args = append(srv.Args, sra) + } + paramBody := util.Struct2Map(srv) + sdkApi.Register(paramBody) //灏嗙畻娉曟敞鍐屽埌鏁版嵁搴撲腑 + } + + zconfPath := "/opt/vasystem/bin/zconf/" + libPath := "/opt/vasystem/libs/" + if !util.DirExists(zconfPath) { + os.MkdirAll(zconfPath, 0777) + } + if !util.DirExists(libPath) { + os.MkdirAll(libPath, 0777) + } + for sdkType,_ := range soM { + //澶嶅埗json鍚姩鏂囦欢 + util.CopyFile(unPackPath+sdkType+"/"+sdkType+".json", zconfPath) + util.CopyDir(unPackPath+sdkType+"/"+sdkType, libPath) + if util.DirExists(unPackPath+sdkType+"models") { + util.CopyDir(unPackPath+sdkType+"models", "/opt/vasystem/bin/") + } + } + ret = true + } + } + } + } + } + } + + return ret +} + + +type InsInc struct { + OrderId string `json:"orderId"` + ProductId string `json:"productId"` + ActivateCode string `json:"activateCode"` + MachineCode string `json:"machineCode"` + UserId string `json:"userId"` + SdkIds []string `json:"sdkIds"` + ModuleIds []string `json:"moduleIds"` + ChCount int `json:"chCount"` + AuthCount int `json:"authCount"` + ServeYear int `json:"serveYear"` +} + +//绠楁硶鍜屽弬鏁板畾涔� +type SdkDef struct { + Def Sdk `json:"def"` + Args []SdkArgEntity `json:"args"` +} + +type Sdk struct { + Id string `gorm:"column:id;primary_key;type:varchar(50);unique;not null;" json:"id"` + IpcId string `gorm:"column:ipc_id" json:"ipc_id"` + SdkType string `gorm:"column:sdk_type" json:"sdk_type"` + SdkName string `gorm:"column:sdk_name" json:"sdk_name" example:"浜鸿劯妫�娴�"` + Icon string `gorm:"column:icon" json:"icon,omitempty"` + Url string `gorm:"column:url" json:"url,omitempty" example:"http://ip:port/govideo/sdk/1"` + CreateTime string `gorm:"column:create_time" json:"create_time"` + CreateBy string `gorm:"column:create_by" json:"create_by"` + UpdateTime string `gorm:"column:update_time" json:"update_time"` + Enable bool `gorm:"column:enable;default:1" json:"enable"` + DelFlag int `gorm:"column:del_flag;default:0" json:"del_flag"` + Env string `gorm:"column:env" json:"env"` //杩愯鐜鍙婄粨鏋滆鏄庯紝json鏍煎紡锛屽寘鍚玸o_file_path,runtime,param,depends(cuda鐗堟湰锛宱pencv鐗堟湰锛宼ensorflow鐗堟湰绛�) +} + +type SdkArgEntity struct { + Id string `gorm:"primary_key;column:id" json:"id"` + SdkId string `gorm:"column:sdk_id" json:"sdk_id"` + Scope string `gorm:"column:scope" json:"scope"` + SdkArg +} + +type SdkArg struct { + Alias string `gorm:"column:alias" json:"alias"` //鍙傛暟鐨勫埆鍚� + Name string `gorm:"column:name" json:"name"` //鍙傛暟鍚嶇О + Type string `gorm:"column:type" json:"type"` //鍙傛暟绫诲瀷(鏁存暟锛屽瓧绗︿覆鎴栨暟缁�) + ArgType string `gorm:"column:arg_type" json:"arg_type"` + Must bool `gorm:"column:must" json:"must"` //鏄惁蹇呭~ + Unit string `gorm:"column:unit" json:"unit"` //鍗曚綅 + Range string `gorm:"column:range" json:"range"` //鍊肩殑鑼冨洿锛宔g锛�0,100琛ㄧず浠�0鍒�100 + DefaultValue string `gorm:"column:default_value" json:"default_value"` + DefaultOperator string `gorm:"column:default_operator" json:"default_operator"` + Sort int `gorm:"column:sort;default:1" json:"sort"` +} + + +type SdkRegisterVo struct { + Id string `json:"id"` + SdkType string `json:"sdk_type"`//浜鸿劯妫�娴嬶細FaceDetect,浜鸿劯鎻愬彇锛欶aceExtract,浜鸿劯姣斿锛欶aceCompare,琛屼负锛歒olo + SdkName string `json:"sdk_name"` //绠楁硶鍚嶇О + Args []SdkRegisterArgVo `json:"args"` //绠楁硶鍙傛暟 + Icon string `json:"icon"` //绠楁硶鍥炬爣 + Url string `json:"url"` //绠楁硶涓嬭浇鍦板潃 +} + +type SdkRegisterArgVo struct { + Scope string `json:"scope"` + SdkArg + + Dics []SdkArgDic `json:"dics"` //濡傛灉姝ょ畻娉曞弬鏁版槸琚�夐」锛岄渶瑕佸皢鍙傛暟鏋氫妇鍊煎啓鍏ュ埌瀛楀吀琛ㄤ腑 +} + +type SdkArgDic struct { + Value string `json:"value"` + Name string `json:"name"` + Sort int `json:"sort"` +} \ No newline at end of file -- Gitblit v1.8.0