From 9303b69ea569bcb5e581147543a3fd58e90d0d25 Mon Sep 17 00:00:00 2001 From: sunty <1172534965@qq.com> Date: 星期四, 20 八月 2020 20:05:23 +0800 Subject: [PATCH] add get buckets contrl --- service/SdkDownLoad.go | 312 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 288 insertions(+), 24 deletions(-) diff --git a/service/SdkDownLoad.go b/service/SdkDownLoad.go index 56ed6e2..de7e82f 100644 --- a/service/SdkDownLoad.go +++ b/service/SdkDownLoad.go @@ -1,66 +1,87 @@ package service import ( + "basic.com/valib/licence.git" "bytes" "crypto/md5" "encoding/hex" + "encoding/json" + "errors" "fmt" "io" "io/ioutil" "net/http" "os" + "path" + "path/filepath" "strings" - "webserver/extend/logger" + "webserver/extend/config" + + reqUtil "webserver/extend/util" "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 +95,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 +109,268 @@ 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 } +} + +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 := findAllMySdk() + logger.Debug("remoteSdks:", remoteSdks) + + 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 +} + +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 +} + + +type shopSdks struct { + Sdks []Sdk `json:"sdks"` +} + +const ( + token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ3NDUwMjU5MjMsInVzZXIiOiJ7XCJpZFwiOlwiZTZjY2QzNmQtNGYxNi00NmZjLTg4ZDUtMDczNjU4NjZkMjA1XCIsXCJwZXJtaXNzaW9uc1wiOltcInByb2R1Y3RNYW5nZTpwdWJsaXNoXCIsXCJjb2RlTWFuZ2U6dmlld1wiLFwiZGV2aWNlTWFuYWdlOmFkZFwiLFwiYWRtaW5NYW5hZ2VcIixcIm9yZGVyTWFuZ2VcIixcImRldmljZU1hbmFnZTp2aWV3XCIsXCJwcm9kdWN0TWFuZ2U6YWRkXCIsXCJhZG1pbk1hbmFnZTp2aWV3XCIsXCJjb2RlTWFuZ2U6YWRkXCIsXCJwcm9kdWN0TWFuZ2U6b2ZmU2FsZVwiLFwib3JkZXJNYW5nZTpjYW5jZWxcIixcInByb2R1Y3RDZW50ZXI6ZG93bmxvYWRcIixcInByb2R1Y3RDZW50ZXI6YnV5XCIsXCJwcm9kdWN0TWFuZ2U6dmlld1wiLFwiYXBpXCIsXCJob21lXCIsXCJvcmRlck1hbmdlOnBheVwiLFwiYWRtaW5NYW5hZ2U6YWRkXCIsXCJvcmRlck1hbmdlOmRvd25sb2FkXCIsXCJwcm9kdWN0Q2VudGVyXCIsXCJkZXZpY2VNYW5hZ2U6dW5iaW5kXCIsXCJvcmRlck1hbmdlOnZpZXdcIixcImFkbWluTWFuYWdlOmVkaXRcIixcImRldmljZU1hbmFnZVwiLFwidmlwTWFuYWdlOmFkZFwiLFwidmlwTWFuYWdlOnZpZXdcIixcInByb2R1Y3RDZW50ZXI6dmlld1wiLFwidmlwTWFuYWdlOmVkaXRcIixcInZpcE1hbmFnZVwiLFwicHJvZHVjdE1hbmdlOmVkaXRcIixcImNvZGVNYW5nZVwiLFwicHJvZHVjdE1hbmdlXCJdLFwidXNlcm5hbWVcIjpcImJhc2ljXCJ9In0.vwjAFkWuEyadRLvIOGK8LFE3MjpY3SQ7j6AlTXnQDG8" +) + +func findAllMySdk() map[string]Sdk { + url := "http://"+config.ShopConf.Url+"/data/api-s/sdk/findAllMySdk" + machineCode := licence.GetMachineCode() + fmt.Println("url:", url, "machineCode:", machineCode) + paramBody := map[string]interface{} { + "serverId": config.Server.AnalyServerId, + "machineCode": machineCode, + } + header := map[string]string { + "Authorization": token, + } + respBody, err := reqUtil.DoPostRequest(url, reqUtil.CONTENT_TYPE_JSON, paramBody, nil, header) + if err != nil { + logger.Debug("DoPostRequest err:", err) + return nil + } + var res dbapi.Result + if err = json.Unmarshal(respBody, &res); err != nil { + logger.Debug("unmarshal err:", err) + return nil + } + bytes, _ := json.Marshal(res.Data) + var ss shopSdks + if err := json.Unmarshal(bytes, &ss);err != nil { + logger.Debug("unmarshal err:", err) + 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{}{} + + 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 +} + +type downOrUpResp struct { + Url string `json:"url"` + Md5 string `json:"md5"` +} + +//涓嬭浇鎴栬�呭崌绾х畻娉� +func DownloadOrUpgrade(sdkId string) (bool,error) { + url := "http://"+config.ShopConf.Url+"/data/api-s/sdk/downloadOrUpgrade" + machineCode := licence.GetMachineCode() + if machineCode == "" { + logger.Debug("鑾峰彇鏈哄櫒鐮佸け璐�") + return false, errors.New("鑾峰彇鏈哄櫒鐮佸け璐�") + } + paramBody := map[string]interface{}{ + "sdkId": sdkId, + "machineCode": machineCode, + } + header := map[string]string { + "Authorization": token, + } + respBody, err := reqUtil.DoPostRequest(url, reqUtil.CONTENT_TYPE_JSON, paramBody, nil, header) + if err != nil { + logger.Debug("DoPostRequest err:", err) + return false, err + } + var res dbapi.Result + if err = json.Unmarshal(respBody, &res); err != nil { + logger.Debug("unmarshal err:", err) + return false, err + } + if !res.Success { + logger.Debug("res.Data:", res.Data) + return false, errors.New("璇锋眰鍟嗗煄澶辫触") + } + bytes, _ := json.Marshal(res.Data) + var resp downOrUpResp + if err := json.Unmarshal(bytes, &resp);err != nil { + logger.Debug("unmarshal err:", err) + return false, err + } + logger.Debug("res.Data:", res.Data, "resp:", resp) + if resp.Url == "" || resp.Md5 == "" { + return false, errors.New("鑾峰彇涓嬭浇瀹夎鍖呭け璐�") + } + + //2.涓嬭浇瀹夎锛堝崌绾э級鍖咃紝楠岃瘉md5鍚庡畨瑁� + configPatchPath := "" + if config.Server.PatchPath != "" { + configPatchPath = config.Server.PatchPath + } else { + configPatchPath = "../patch" + } + if !reqUtil.DirExists(configPatchPath) { + os.Mkdir(configPatchPath, 0777) + } + filenameWithSuffix := path.Base(resp.Url) + ext := path.Ext(filenameWithSuffix) + downUrl := "http://"+config.ShopConf.Url+"/files/"+resp.Url + + gzFilePath := configPatchPath + "/" + resp.Md5+ext + err = reqUtil.DownloadFile(gzFilePath, downUrl) + if err != nil { + logger.Debug("DownloadFile err:", err) + return false, err + } + b, err := installSdk(resp.Md5, ext) + if b { + return true, nil + } + + return false, err } \ No newline at end of file -- Gitblit v1.8.0