From 20ed84cad4fd237cca40619d0fe7ed39c5e030cd Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@iotlink.com> Date: 星期日, 19 一月 2020 20:00:51 +0800 Subject: [PATCH] feat: add sdk download and regiter --- service/SdkDownLoad.go | 162 +++++++++++++++++++++++++++----- go.mod | 2 controllers/sdk.go | 136 +++++++++++++------------- 3 files changed, 207 insertions(+), 93 deletions(-) diff --git a/controllers/sdk.go b/controllers/sdk.go index f44cd0d..58cb37c 100644 --- a/controllers/sdk.go +++ b/controllers/sdk.go @@ -1,43 +1,43 @@ package controllers import ( - "basic.com/dbapi.git" - uuid "github.com/satori/go.uuid" "webserver/extend/code" "webserver/extend/config" - "basic.com/valib/logger.git" "webserver/extend/util" - "github.com/gin-gonic/gin" "webserver/service" + + "basic.com/dbapi.git" + "basic.com/valib/logger.git" + "github.com/gin-gonic/gin" ) type SdkController struct { } type SdkVo struct { - Id string `json:"id"` - SdkType string `json:"sdk_type"`//浜鸿劯妫�娴嬶細FaceDetect,浜鸿劯鎻愬彇锛欶aceExtract,浜鸿劯姣斿锛欶aceCompare,琛屼负锛歒olo - SdkName string `json:"sdk_name"` //绠楁硶鍚嶇О - Args []SdkArgVo `json:"args"` //绠楁硶鍙傛暟 - Icon string `json:"icon"` //绠楁硶鍥炬爣 - Url string `json:"url"` //绠楁硶涓嬭浇鍦板潃 - CreateTime string `json:"create_time"` - CreateBy string `json:"create_by"` - UpdateTime string `json:"update_time"` - Enable bool `json:"enable"`//鏄惁鍚敤 - DelFlag bool `json:"del_flag"`//閫昏緫鍒犻櫎 + Id string `json:"id"` + SdkType string `json:"sdk_type"` //浜鸿劯妫�娴嬶細FaceDetect,浜鸿劯鎻愬彇锛欶aceExtract,浜鸿劯姣斿锛欶aceCompare,琛屼负锛歒olo + SdkName string `json:"sdk_name"` //绠楁硶鍚嶇О + Args []SdkArgVo `json:"args"` //绠楁硶鍙傛暟 + Icon string `json:"icon"` //绠楁硶鍥炬爣 + Url string `json:"url"` //绠楁硶涓嬭浇鍦板潃 + CreateTime string `json:"create_time"` + CreateBy string `json:"create_by"` + UpdateTime string `json:"update_time"` + Enable bool `json:"enable"` //鏄惁鍚敤 + DelFlag bool `json:"del_flag"` //閫昏緫鍒犻櫎 } //绠楁硶鍙傛暟瀹氫箟 type SdkArgVo struct { - Alias string `json:"alias"` //鍙傛暟鐨勫埆鍚� - Name string `json:"name"` //鍙傛暟鍚嶇О - Type string `json:"type"` //鍙傛暟绫诲瀷(鏁存暟锛屽瓧绗︿覆鎴栨暟缁�) - Must bool `json:"must"` //鏄惁蹇呭~ - Unit string `json:"unit"` - Range string `json:"range"` //鍊肩殑鑼冨洿锛宔g锛�0,100琛ㄧず浠�0鍒�100 + Alias string `json:"alias"` //鍙傛暟鐨勫埆鍚� + Name string `json:"name"` //鍙傛暟鍚嶇О + Type string `json:"type"` //鍙傛暟绫诲瀷(鏁存暟锛屽瓧绗︿覆鎴栨暟缁�) + Must bool `json:"must"` //鏄惁蹇呭~ + Unit string `json:"unit"` + Range string `json:"range"` //鍊肩殑鑼冨洿锛宔g锛�0,100琛ㄧず浠�0鍒�100 DefaultValue string `json:"default_value"` - Sort int `json:"sort"` //鍙傛暟椤哄簭 + Sort int `json:"sort"` //鍙傛暟椤哄簭 } // @Security ApiKeyAuth @@ -54,13 +54,13 @@ var sdk SdkVo var api dbapi.SdkApi - if err := c.BindJSON(&sdk);err !=nil { - util.ResponseFormat(c,code.RequestParamError,"鍙傛暟閿欒") + if err := c.BindJSON(&sdk); err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟閿欒") return } paramBody := util.Struct2Map(sdk) flag, data := api.Save(paramBody) - if flag{ + if flag { util.ResponseFormat(c, code.Success, data) } else { util.ResponseFormat(c, code.ComError, data) @@ -77,10 +77,9 @@ // @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"[]",success:false}" // @Router /data/api-v/sdk/findAllSdk [GET] func (sc SdkController) FindAllSdk(c *gin.Context) { - var api dbapi.SdkApi - sdkName := c.Query("sdkName") - sdks := api.FindAll(sdkName) + + sdks := service.GetSdkList(sdkName) util.ResponseFormat(c, code.Success, sdks) } @@ -96,17 +95,17 @@ func (sc SdkController) GetById(c *gin.Context) { var api dbapi.SdkApi sdkId := c.Query("id") - if sdkId == ""{ - util.ResponseFormat(c,code.RequestParamError,"sdkId涓嶈兘涓虹┖") + if sdkId == "" { + util.ResponseFormat(c, code.RequestParamError, "sdkId涓嶈兘涓虹┖") return } flag, sdk := api.GetById(sdkId) if flag { - util.ResponseFormat(c,code.Success,sdk) + util.ResponseFormat(c, code.Success, sdk) } else { - util.ResponseFormat(c,code.ComError,sdk) + util.ResponseFormat(c, code.ComError, sdk) } } @@ -114,16 +113,16 @@ func (sc SdkController) GetSdkArgs(c *gin.Context) { sdkId := c.Query("sdkId") scope := c.Query("scope") - if sdkId== "" || scope == ""{ - util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎") + if sdkId == "" || scope == "" { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎") return } var api dbapi.SdkApi - b,d := api.GetSdkArgs(sdkId, scope) - if b{ - util.ResponseFormat(c,code.Success,d) + b, d := api.GetSdkArgs(sdkId, scope) + if b { + util.ResponseFormat(c, code.Success, d) } else { - util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触") + util.ResponseFormat(c, code.ComError, "鏌ヨ澶辫触") } } @@ -140,53 +139,56 @@ var api dbapi.SdkApi taskId := c.Query("taskId") if taskId == "" { - util.ResponseFormat(c,code.ComError,"浠诲姟id涓嶈兘涓虹┖") + util.ResponseFormat(c, code.ComError, "浠诲姟id涓嶈兘涓虹┖") return } - flag,sdks := api.FindByTaskId(taskId) + flag, sdks := api.FindByTaskId(taskId) if flag { - util.ResponseFormat(c,code.Success,sdks) + util.ResponseFormat(c, code.Success, sdks) } else { - util.ResponseFormat(c,code.ComError,sdks) + util.ResponseFormat(c, code.ComError, sdks) } } func (sc SdkController) SdkDownLoad(c *gin.Context) { - path,exist := c.GetQuery("path") + var soApi dbapi.SoApi + var sdkConfig map[string]interface{} + + path, exist := c.GetQuery("path") if !exist { - util.ResponseFormat(c,code.ComError,"涓嬭浇鐨勭畻娉曞弬鏁版湁璇�") + util.ResponseFormat(c, code.ComError, "涓嬭浇鐨勭畻娉曞弬鏁版湁璇�") } + logger.Info(path) + + // 鍏堟煡鎵炬湰鍦扮洰褰曞唴鏄惁宸插瓨鍦ㄧ畻娉晄o, 娌℃湁璧颁簯绔笅杞� + if sdkConfig = service.FindLocalSdkSoById(path); sdkConfig == nil { + sdkConfig = service.DownSdk(path) + } + + if sdkConfig != nil { + regSdkSuccess, _ := soApi.Add(sdkConfig) + regArgsSuccess, _ := soApi.Add(sdkConfig) + + if regSdkSuccess && regArgsSuccess { + util.ResponseFormat(c, code.Success, "涓嬭浇绠楁硶鎴愬姛锛�") + return + } + } + flag := c.Query("needUpdateMiddle") // 涓嬭浇绠楁硶锛堟湁鏃跺�欎篃闇�瑕佹妸涓棿浠朵竴璧蜂笅杞戒笅鏉ワ級 if flag == "true" { // 涓嬭浇骞舵洿鏂颁腑闂翠欢,甯︿笂MD5鏍¢獙 - flag1,err := service.DownSo("http://"+config.SoPath.Ip+":"+config.SoPath.Port+"/"+"middleware.so") - logger.Debug("涓棿浠惰矾寰勶細","http://"+config.SoPath.Ip+":"+config.SoPath.Port+"/"+"middleware.so") + flag1, err := service.DownSo("http://" + config.SoPath.Ip + ":" + config.SoPath.Port + "/" + "middleware.so") + logger.Debug("涓棿浠惰矾寰勶細", "http://"+config.SoPath.Ip+":"+config.SoPath.Port+"/"+"middleware.so") if err != nil { logger.Info(err) } if !flag1 { - util.ResponseFormat(c,code.ComError,"璇烽噸鏂颁笅杞界畻娉�") + util.ResponseFormat(c, code.ComError, "璇烽噸鏂颁笅杞界畻娉�") } } - // 涓嬭浇绠楁硶锛屾牎楠岋紝骞跺啓鍏ュ埌鐩爣鐩綍涓� - flag2,err2 := service.DownSo(path) - if err2 != nil { - logger.Info(err2) - } - if !flag2 { - util.ResponseFormat(c,code.ComError,"璇烽噸鏂颁笅杞界畻娉�") - } - // 灏嗙畻娉曞拰so鍚嶇О瀛樺埌瑙勫垯绉佹湁鐨勬敞鍐岃〃 - var soApi dbapi.SoApi - param := make(map[string]interface{}) - param["id"] = uuid.NewV4().String() - sdkId := uuid.NewV4().String() - param["sdkId"] = sdkId - param["soName"] = service.GetFileNameFromUrl(path,true) - flag3,_ := soApi.Add(param) - if flag3 { - util.ResponseFormat(c,code.Success,"涓嬭浇绠楁硶鎴愬姛锛�") - } -} \ No newline at end of file + + util.ResponseFormat(c, code.ComError, "绠楁硶涓嬭浇澶辫触,璇烽噸璇�") +} diff --git a/go.mod b/go.mod index 9ee1fe0..250d5f9 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ basic.com/fileServer/WeedFSClient.git v0.0.0-20190919054037-0182b6c3f5cb // indirect basic.com/gb28181api.git v0.0.0-20191028082253-472438a8407b // indirect basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48 // indirect - basic.com/pubsub/esutil.git v0.0.0-20191120125514-865efa73a9ae // indirect + basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777 // indirect basic.com/pubsub/protomsg.git v0.0.0-20191223033758-3fd9a59b8137 // indirect basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe // indirect basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051 diff --git a/service/SdkDownLoad.go b/service/SdkDownLoad.go index 00715d9..ed364ca 100644 --- a/service/SdkDownLoad.go +++ b/service/SdkDownLoad.go @@ -4,63 +4,78 @@ "bytes" "crypto/md5" "encoding/hex" + "encoding/json" "fmt" "io" "io/ioutil" "net/http" "os" + "path/filepath" "strings" - "basic.com/valib/logger.git" "webserver/util" + + "basic.com/dbapi.git" + "basic.com/valib/logger.git" ) + +func DownSdk(id string) map[string]interface{} { + // 涓嬭浇绠楁硶 + if ok, err := DownSo(id); !ok { + logger.Error("涓嬭浇绠楁硶澶辫触", err) + return nil + } + + return FindLocalSdkSoById(id) +} + // 浠庢湇鍔″櫒涓婁笅杞芥枃浠跺埌涓存椂鐩綍锛屾牎楠屼箣鍚庡鏋滃畬鏁村皢鍏舵嫹璐濆埌鐩爣鐩綍涓� -func DownSo(url string)(bool,error) { +func DownSo(url string) (bool, error) { resp, err := http.Get(url) if err != nil { logger.Error("鑾峰彇鏂囦欢澶辫触") - return false,err + return false, err } // 浠巖esp涓鍑簔ip鏂囦欢瑙e帇缂╋紝瑙e嚭face.so,face.txt,鐒跺悗鎶婅В鍘嬪嚭鐨剆o鐢∕D5缂栫爜鍑轰竴涓猼emp.txt鏂囦欢锛屼笌瑙e帇鍑虹殑so.txt鏂囦欢姣斿锛� body, err := ioutil.ReadAll(resp.Body) if err != nil { logger.Error("璇诲彇resp.body澶辫触") - return false,err + return false, err } CopyFile(body, "/opt/temp/temp.zip") util.DeCompress("/opt/temp/temp.zip", "/opt/temp") - fileName := GetFileNameFromUrl(url,false) - md5str,err1 := File2md5("/opt/temp/"+fileName+".so") + fileName := GetFileNameFromUrl(url, false) + md5str, err1 := File2md5("/opt/temp/" + fileName + ".so") if err1 != nil { logger.Error(err1) - return false,err1 + return false, err1 } - md5str_origin,err2 := ioutil.ReadFile("/opt/temp/"+fileName+".txt") + md5str_origin, err2 := ioutil.ReadFile("/opt/temp/" + fileName + ".txt") if err2 != nil { logger.Error("璇诲彇瑙e帇鍚庣殑md5鏂囦欢澶辫触") - return false,err2 + return false, err2 } - flag := CompareMd5([]byte(md5str),md5str_origin) + flag := CompareMd5([]byte(md5str), md5str_origin) if flag { logger.Info("涓ゆMD5缂栫爜涓�鑷达紒") } else { logger.Debug("涓ゆMD5缂栫爜涓嶄竴鑷达紝璇烽噸鏂颁笅杞�") - return false,nil + return false, nil } // 浠巙rl涓埅鍙杝oName - soName := GetFileNameFromUrl(url,true) + soName := GetFileNameFromUrl(url, true) f, err := os.Create("/opt/workspace/ruleprocess/algorithm/" + soName) if err != nil { logger.Error("鍦ㄩ」鐩洰褰曚笅鍒涘缓so鏂囦欢澶辫触") - return false,err + return false, err } - data,_ := ioutil.ReadFile("/opt/temp/"+soName) - _,err4 := f.Write(data) + data, _ := ioutil.ReadFile("/opt/temp/" + soName) + _, err4 := f.Write(data) if err4 != nil { logger.Error("澶嶅埗鏂囦欢鍑洪敊") - return false,err4 + return false, err4 } - return true,nil + return true, nil } func CopyFile(byte []byte, dst string) (w int64, err error) { @@ -74,7 +89,7 @@ } // 鎸囧畾鐩綍鐨勬枃浠剁敓鎴愮浉搴旂殑MD5鐮佹枃浠� -func File2md5 (filename string) (string, error) { +func File2md5(filename string) (string, error) { // 鏂囦欢鐢熸垚MD5鍔犲瘑鍔犲瘑鏂囦欢 file, err := os.Open(filename) if err != nil { @@ -88,25 +103,122 @@ return "", err } md5Str := hex.EncodeToString(md5.Sum(nil)) - return md5Str,nil + return md5Str, nil } + // 浠巙rl涓埅鍙栧嚭鏂囦欢鍚嶏紝鍙傛暟鏄槸鍚﹀甫鍚庣紑 -func GetFileNameFromUrl(url string,withSuffix bool)string { - fileName := strings.Split(url,"/")[len(strings.Split(url,"/"))-1] +func GetFileNameFromUrl(url string, withSuffix bool) string { + fileName := strings.Split(url, "/")[len(strings.Split(url, "/"))-1] if withSuffix { return fileName } else { - withoutSuffix := strings.Split(fileName,".")[0] + withoutSuffix := strings.Split(fileName, ".")[0] return withoutSuffix } } // 姣旇緝涓や釜MD5缂栫爜鏄惁涓�鑷� -func CompareMd5(value1 []byte,value2 []byte) bool{ - num := bytes.Compare(value1,value2) +func CompareMd5(value1 []byte, value2 []byte) bool { + num := bytes.Compare(value1, value2) if num == 0 { return true } else { return false } -} \ No newline at end of file +} + +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) + } + + } + + // 鐩墠杩樻病鏈夎繙绔畻娉曞簱, + // remoteSdks := getRemoteSdks() + + return sdks +} + +func queryDatabase(sdkName string) ([]map[string]interface{}, map[string]bool) { + var api dbapi.SdkApi + ids := make(map[string]bool) + sdks := []map[string]interface{}{} + + // 鏌ヨ宸茬粡瀹夎鐨勭畻娉� + data := api.FindAll(sdkName) + for _, sdk := range data { + ids[sdk.Id] = true + sdks = append(sdks, map[string]interface{}{ + "id": sdk.Id, + "ipc_id": sdk.IpcId, + "sdk_type": sdk.SdkType, + "sdk_name": sdk.SdkName, + "icon": sdk.Icon, + "enable": sdk.Enable, + "installed": true, + }) + } + + return sdks, ids +} + +func GetLocalSdks() []map[string]interface{} { + var algos = []map[string]interface{}{} + + AlgorithmFiles := "/opt/vasystem/bin/algorithm/*.json" + + files, err := filepath.Glob(AlgorithmFiles) + if err != nil { + fmt.Println("Cannot access algorithm json files: No such file or directory") + return algos + } + + for _, filename := range files { + algo := make(map[string]interface{}) + f, err := ioutil.ReadFile(filename) + if err != nil { + return algos + } + + if err := json.Unmarshal(f, &algo); err != nil { + return algos + } + + algos = append(algos, map[string]interface{}{ + "id": algo["sdkId"], + "ipc_id": algo["ipcId"], + "sdk_type": algo["sdkType"], + "sdk_name": algo["sdkName"], + "icon": algo["icon"], + "args": algo["sdkArgs"], + }) + } + + return algos +} + +func FindLocalSdkSoById(id string) map[string]interface{} { + localAlgos := GetLocalSdks() + for _, sdk := range localAlgos { + if sdk["id"].(string) == id { + return sdk + } + } + + return nil +} -- Gitblit v1.8.0