controllers/sdk.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
go.mod | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
go.sum | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service/SdkDownLoad.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service/SdkDownLoad_test.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
service/SdkInstall.go | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
controllers/sdk.go
@@ -81,8 +81,10 @@ // @Router /data/api-v/sdk/findAllSdk [GET] func (sc SdkController) FindAllSdk(c *gin.Context) { sdkName := c.Query("sdkName") logger.Debug("FindAllSdk sdkName:", sdkName) sdks := service.GetSdkList(sdkName) sdks := service.GetSdkList("") //本机已安装的算法 util.ResponseFormat(c, code.Success, sdks) } go.mod
@@ -8,7 +8,7 @@ basic.com/gb28181api.git v0.0.0-20191028082253-472438a8407b basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48 basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777 basic.com/pubsub/protomsg.git v0.0.0-20200306071852-76af8d2ca810 basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337 basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051 basic.com/valib/godraw.git v0.0.0-20191122082247-26e9987cd183 @@ -17,7 +17,7 @@ basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28 basic.com/valib/logger.git v0.0.0-20190928113028-4907b08c4159 github.com/Microsoft/go-winio v0.4.12 // indirect github.com/ajg/form v1.5.1 // indirect github.com/ajg/form v1.5.1 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/disintegration/imaging v1.6.2 // indirect go.sum
@@ -10,9 +10,8 @@ basic.com/pubsub/esutil.git v0.0.0-20191120125514-865efa73a9ae/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw= basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777 h1:gTeuhepfLgOchD6bqydsGGV6KCj/UaseQQgo4DFyhGQ= basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw= basic.com/pubsub/protomsg.git v0.0.0-20200304101716-2f4c0110fab2/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU= basic.com/pubsub/protomsg.git v0.0.0-20200306071852-76af8d2ca810 h1:xGOKeo8E89NxioWCFySRhom9i8zWvu3Gsi9IYu6LYJw= basic.com/pubsub/protomsg.git v0.0.0-20200306071852-76af8d2ca810/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU= basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337 h1:6LTdIfHUZkfemhkuQnXXaeXRdnm4459PyxMd36AXV20= basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU= basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe h1:uh3u7DuSOw6AwzvPC1EM19sw1Skks1EUJddcbHDKI9M= basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe/go.mod h1:y+h7VUnoSQ3jOtf2K3twXNA8fYDfyUsifSswcyKLgNw= basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051/go.mod h1:bkYiTUGzckyNOjAgn9rB/DOjFzwoSHJlruuWQ6hu6IY= service/SdkDownLoad.go
@@ -12,6 +12,9 @@ "os" "path/filepath" "strings" "webserver/extend/config" reqUtil "webserver/extend/util" "webserver/util" @@ -127,30 +130,59 @@ } } func GetSdkList(sdkName string) []map[string]interface{} { // 待返回的数据 sdks, idsCache := queryDatabase(sdkName) // 查询本地已经存在的算法和远端的全部算法, 然后和已安装的比对, 返回全部可用的算法组. 未安装的算法在前端走下载流程 localSdks := GetLocalSdks() for _, sdk := range localSdks { id := sdk["id"].(string) if !idsCache[id] { idsCache[id] = true sdk["enable"] = false sdk["installed"] = false // 不返回参数信息 delete(sdk, "args") sdks = append(sdks, sdk) func GetSdkList(sdkName string) []SdkInsOrUpgrade { var api dbapi.SdkApi localSdks := api.FindAll(sdkName) //本地已安装所有算法 localSdkM := make(map[string]SdkInsOrUpgrade) for _,ls :=range localSdks { siou := SdkInsOrUpgrade{ Installed: true, } siou.Sdk = Sdk{ Id: ls.Id, IpcId: ls.IpcId, SdkType: ls.SdkType, SdkName: ls.SdkName, Icon: ls.Icon, Url: ls.Url, CreateTime: ls.CreateTime, CreateBy: ls.CreateBy, UpdateTime: ls.UpdateTime, Enable: ls.Enable, DelFlag: int(ls.DelFlag), IconBlob: ls.IconBlob, Version: ls.Version, } localSdkM[siou.Id] = siou } // 目前还没有远端算法库, // remoteSdks := getRemoteSdks() //远端可用的算法 remoteSdks := findAllMySdk() for sdkId,sdk := range remoteSdks { if v,ok := localSdkM[sdkId];ok { //本地已安装 ls := v if shouldVersionBeUpgrade(ls.Version, sdk.Version) { //判断版本号是否需要升级 ls.Installed = true ls.IsUpgrade = true //需要升级 ls.RemoteVersion = sdk.Version //远端的版本号 } localSdkM[sdkId] = ls } else { //本地未安装,需要安装 bIns := SdkInsOrUpgrade{ RemoteVersion: sdk.Version, IsUpgrade: false, Installed: false, } bIns.Sdk = sdk localSdkM[sdkId] = bIns } } sdks := make([]SdkInsOrUpgrade, 0) for _,v := range localSdkM { sdks = append(sdks, v) } return sdks } @@ -177,6 +209,42 @@ return sdks, ids } type shopSdks struct { Sdks []Sdk `json:"sdks"` } func findAllMySdk() map[string]Sdk { token := "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTEzODA3ODksInVzZXIiOiJ7XCJpZFwiOlwiZTZjY2QzNmQtNGYxNi00NmZjLTg4ZDUtMDczNjU4NjZkMjA1XCIsXCJwZXJtaXNzaW9uc1wiOltcIm9yZGVyTWFuZ2U6ZG93bmxvYWRcIixcImRldmljZU1hbmFnZTp1bmJpbmRcIixcImNvZGVNYW5nZVwiLFwidmlwTWFuYWdlOmFkZFwiLFwiYWRtaW5NYW5hZ2U6ZWRpdFwiLFwiY29kZU1hbmdlOnZpZXdcIixcImNvZGVNYW5nZTphZGRcIixcImFkbWluTWFuYWdlXCIsXCJvcmRlck1hbmdlOmNhbmNlbFwiLFwicHJvZHVjdENlbnRlcjpidXlcIixcInByb2R1Y3RDZW50ZXJcIixcInByb2R1Y3RNYW5nZTp2aWV3XCIsXCJ2aXBNYW5hZ2U6dmlld1wiLFwib3JkZXJNYW5nZVwiLFwicHJvZHVjdENlbnRlcjp2aWV3XCIsXCJkZXZpY2VNYW5hZ2VcIixcImFkbWluTWFuYWdlOmFkZFwiLFwicHJvZHVjdE1hbmdlOmFkZFwiLFwiYWRtaW5NYW5hZ2U6dmlld1wiLFwicHJvZHVjdE1hbmdlXCIsXCJvcmRlck1hbmdlOnZpZXdcIixcImRldmljZU1hbmFnZTp2aWV3XCIsXCJvcmRlck1hbmdlOnBheVwiLFwidmlwTWFuYWdlOmVkaXRcIixcInZpcE1hbmFnZVwiLFwicHJvZHVjdE1hbmdlOmVkaXRcIixcInByb2R1Y3RNYW5nZTpwdWJsaXNoXCIsXCJkZXZpY2VNYW5hZ2U6YWRkXCIsXCJhcGlcIixcImhvbWVcIixcInByb2R1Y3RNYW5nZTpvZmZTYWxlXCIsXCJwcm9kdWN0Q2VudGVyOmRvd25sb2FkXCJdLFwidXNlcm5hbWVcIjpcImJhc2ljXCJ9In0.HwRobdFLtMK7ni5OKk4_NAyqpKGuUlUbqF3HBJMJuOk" url := "http://192.168.20.10:7004/data/api-s/sdk/findAllMySdk" fmt.Println("token:", token, "url:", url) paramBody := map[string]interface{} { "serverId": config.Server.AnalyServerId, "machineCode": "", } header := map[string]string { "Authorization": token, } respBody, err := reqUtil.DoPostRequest(url, reqUtil.CONTENT_TYPE_JSON, paramBody, nil, header) if err != nil { return nil } var res dbapi.Result if err = json.Unmarshal(respBody, &res); err != nil { return nil } bytes, _ := json.Marshal(res.Data) var ss shopSdks if err := json.Unmarshal(bytes, &ss);err != nil { return nil } m := make(map[string]Sdk) for _,s := range ss.Sdks { m[s.Id] = s } return m } func GetLocalSdks() []map[string]interface{} { var algos = []map[string]interface{}{} service/SdkDownLoad_test.go
@@ -1 +1,11 @@ package service import ( "fmt" "testing" ) func TestGetSdkList(t *testing.T) { list := GetSdkList("") fmt.Println("sdks:", list) } service/SdkInstall.go
@@ -9,6 +9,8 @@ "os" "path" "path/filepath" "strconv" "strings" "webserver/extend/config" "webserver/extend/util" ) @@ -23,17 +25,21 @@ if config.Server.PatchPath != "" { configPatchPath = config.Server.PatchPath } else { configPatchPath = "/opt/vasystem/patch" configPatchPath = "../patch" } filenameWithSuffix := path.Base(filename) ext := path.Ext(filenameWithSuffix) zipFilePath := configPatchPath + "/"+identifier+ext unPackTargetPath := configPatchPath+"/"+identifier+"_basic/" if util.Exists(zipFilePath) { strMd5, e := util.FileMd5(zipFilePath) if e !=nil || strMd5 == "" { go os.Remove(zipFilePath) if util.DirExists(unPackTargetPath) { go os.RemoveAll(unPackTargetPath) } return false,errors.New("获取安装包md5失败") } if strMd5 == identifier { @@ -44,6 +50,9 @@ } else { go os.Remove(zipFilePath) if util.DirExists(unPackTargetPath) { go os.RemoveAll(unPackTargetPath) } logger.Debug("strMd5 is", strMd5,"identifier is",identifier,"not equal") return false,errors.New("校验安装文件失败") } @@ -58,7 +67,7 @@ if config.Server.PatchPath != "" { configPatchPath = config.Server.PatchPath } else { configPatchPath = "/opt/vasystem/patch" configPatchPath = "../patch" } //1.解压缩更新包 unPackTargetPath := configPatchPath+"/"+identifier+"_basic/" @@ -122,44 +131,76 @@ //3.将算法so、依赖文件、zconf、 soM := make(map[string]SdkDef) var skDefArr []SdkDef nInsM := make(map[string]string) aInsM := make(map[string]string) if err = json.Unmarshal(defB, &skDefArr);err == nil { //注册算法信息和算法参数到dbserver var sdkApi dbapi.SdkApi for _,skd := range skDefArr { //注册算法信息和算法参数到dbserver //先看此算法有没有注册,如果已安装,比对版本号 bf, curDbSdk := sdkApi.GetById(skd.Def.Id) if bf { bytes, _ := json.Marshal(curDbSdk) var sm map[string]interface{} unE := json.Unmarshal(bytes, &sm) if unE != nil { continue } sdkVersion, ok := sm["version"] if ok { //有版本号 vStr := sdkVersion.(string) if shouldVersionBeUpgrade(vStr, skd.Def.Version) { nInsM[skd.Def.SdkType] = skd.Def.SdkType aInsM[skd.Def.Id] = skd.Def.Id } } else { nInsM[skd.Def.SdkType] = skd.Def.SdkType aInsM[skd.Def.Id] = skd.Def.Id } } else { nInsM[skd.Def.SdkType] = skd.Def.SdkType aInsM[skd.Def.Id] = skd.Def.Id } 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, if _,ok := aInsM[skd.Def.Id]; ok { srv := SdkRegisterVo{ Id: skd.Def.Id, SdkType: skd.Def.SdkType, SdkName: skd.Def.SdkName, Icon: skd.Def.Icon, Url: skd.Def.Url, IconBlob: skd.Def.IconBlob, Version: skd.Def.Version, } 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, 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) } srv.Args = append(srv.Args, sra) paramBody := util.Struct2Map(srv) logger.Debug("sdkApi.Register paramBody:", paramBody) sdkApi.Register(paramBody) //将算法注册到数据库中 } paramBody := util.Struct2Map(srv) logger.Debug("sdkApi.Register paramBody:", paramBody) sdkApi.Register(paramBody) //将算法注册到数据库中 } zconfPath := "/opt/vasystem/bin/zconf/" libPath := "/opt/vasystem/libs/" zconfPath := "./zconf/" libPath := "../libs/" if !util.DirExists(zconfPath) { os.MkdirAll(zconfPath, 0777) } @@ -167,24 +208,28 @@ os.MkdirAll(libPath, 0777) } for sdkType,_ := range soM { //先解压SdkType.tar.gz文件 if unTarGzE := util.UnTarGz(unPackPath+sdkType+".tar.gz", unPackPath);unTarGzE == nil { //复制json启动文件 if util.Exists(unPackPath+sdkType+"/zconf/"+sdkType+".json") { util.CopyFile(unPackPath+sdkType+"/zconf/"+sdkType+".json", zconfPath+sdkType+".json") } if util.DirExists(unPackPath+sdkType) { if _,cE := util.CopyDirByCmd(unPackPath+sdkType, libPath);cE != nil { return false, cE if _,iOk := nInsM[sdkType];iOk { //先解压SdkType.tar.gz文件 if unTarGzE := util.UnTarGz(unPackPath+sdkType+".tar.gz", unPackPath);unTarGzE == nil { //复制json启动文件 if util.Exists(unPackPath+sdkType+"/zconf/"+sdkType+".json") { util.CopyFile(unPackPath+sdkType+"/zconf/"+sdkType+".json", zconfPath+sdkType+".json") } } if util.DirExists(unPackPath+sdkType+"/models") { if _,cE := util.CopyDirByCmd(unPackPath+sdkType+"/models", "/opt/vasystem/bin/zconf"); cE != nil { return false, cE if util.DirExists(unPackPath+sdkType) { if _,cE := util.CopyDirByCmd(unPackPath+sdkType, libPath);cE != nil { return false, cE } } if util.DirExists(unPackPath+sdkType+"/models") { if _,cE := util.CopyDirByCmd(unPackPath+sdkType+"/models", "./zconf"); cE != nil { return false, cE } } } else { logger.Debug("unTarGzE sdkType.tar.gz err:", unTarGzE) } } else { logger.Debug("unTarGzE sdkType.tar.gz err:", unTarGzE) logger.Debug("upper version has been installed") } } @@ -208,6 +253,49 @@ } return true, nil } func shouldVersionBeUpgrade(curVersion,dstVersion string) bool { if curVersion == "" { return true } if dstVersion == "" { return false } curIVArr := strings.Split(curVersion, ".") dstIVArr := strings.Split(dstVersion, ".") if len(curIVArr) !=3 || len(dstIVArr) != 3{ return false } cH,cEH := strconv.Atoi(curIVArr[0]) cM,cEM := strconv.Atoi(curIVArr[1]) cL,cEL := strconv.Atoi(curIVArr[2]) dH,dEH := strconv.Atoi(curIVArr[0]) dM,dEM := strconv.Atoi(curIVArr[1]) dL,dEL := strconv.Atoi(curIVArr[2]) if cEH !=nil || cEM != nil || cEL != nil || dEH != nil ||dEM !=nil || dEL !=nil { return false } if cH > dH { return false } else if cH == dH { if cM > dM { return false } else if cM == dM { if cL > dL { return false } else if cL == dL { return false } else { return true } } else { return true } } else { return true } } @@ -243,6 +331,15 @@ 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格式,包含so_file_path,runtime,param,depends(cuda版本,opencv版本,tensorflow版本等) IconBlob string `gorm:"column:iconBlob;type:text;" json:"iconBlob"` //图片 Version string `gorm:"column:version;type:varchar(50);default:'1.0';" json:"version"` //版本号 } type SdkInsOrUpgrade struct { Sdk RemoteVersion string `json:"remoteVersion"` //商城仓库版本号 Installed bool `json:"installed"` //是否已安装 IsUpgrade bool `json:"isUpgrade"` //是否需要升级 } type SdkArgEntity struct { @@ -267,23 +364,25 @@ type SdkRegisterVo struct { Id string `json:"id"` SdkType string `json:"sdk_type"`//人脸检测:FaceDetect,人脸提取:FaceExtract,人脸比对:FaceCompare,行为:Yolo SdkName string `json:"sdk_name"` //算法名称 Args []SdkRegisterArgVo `json:"args"` //算法参数 Icon string `json:"icon"` //算法图标 Url string `json:"url"` //算法下载地址 Id string `json:"id"` SdkType string `json:"sdk_type"`//人脸检测:FaceDetect,人脸提取:FaceExtract,人脸比对:FaceCompare,行为:Yolo SdkName string `json:"sdk_name"` //算法名称 Args []SdkRegisterArgVo `json:"args"` //算法参数 Icon string `json:"icon"` //算法图标 Url string `json:"url"` //算法下载地址 IconBlob string `json:"iconBlob"` //图片 Version string `json:"version"` //版本号 } type SdkRegisterArgVo struct { Scope string `json:"scope"` Scope string `json:"scope"` SdkArg Dics []SdkArgDic `json:"dics"` //如果此算法参数是被选项,需要将参数枚举值写入到字典表中 Dics []SdkArgDic `json:"dics"` //如果此算法参数是被选项,需要将参数枚举值写入到字典表中 } type SdkArgDic struct { Value string `json:"value"` Name string `json:"name"` Sort int `json:"sort"` Value string `json:"value"` Name string `json:"name"` Sort int `json:"sort"` }