From 0905eb936d66cf8543da4f96d129cbf854263028 Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期五, 23 八月 2019 11:12:19 +0800 Subject: [PATCH] add model download so --- config/so.yaml | 3 service/SdkDownLoad.go | 112 ++++++++++++++++++ util/zip_test.go | 36 ++++++ extend/config/config.go | 12 + controllers/sdk.go | 44 +++++++ util/zip.go | 118 +++++++++++++++++++ router/router.go | 1 7 files changed, 323 insertions(+), 3 deletions(-) diff --git a/config/so.yaml b/config/so.yaml new file mode 100644 index 0000000..c3f5239 --- /dev/null +++ b/config/so.yaml @@ -0,0 +1,3 @@ +sopath: + ip: 192.168.1.182 + port: 8008 \ No newline at end of file diff --git a/controllers/sdk.go b/controllers/sdk.go index b54307c..c95e36f 100644 --- a/controllers/sdk.go +++ b/controllers/sdk.go @@ -2,9 +2,13 @@ import ( "basic.com/dbapi.git" + uuid "github.com/satori/go.uuid" "webserver/extend/code" + "webserver/extend/config" + "webserver/extend/logger" "webserver/extend/util" "github.com/gin-gonic/gin" + "webserver/service" ) type SdkController struct { @@ -138,4 +142,44 @@ } else { util.ResponseFormat(c,code.ComError,sdks) } +} + +func (sc SdkController) SdkDownLoad(c *gin.Context) { + path,exist := c.GetQuery("path") + if !exist { + util.ResponseFormat(c,code.ComError,"涓嬭浇鐨勭畻娉曞弬鏁版湁璇�") + } + logger.Info(path) + 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") + if err != nil { + logger.Info(err) + } + if !flag1 { + 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 diff --git a/extend/config/config.go b/extend/config/config.go index a4edba7..488ce86 100644 --- a/extend/config/config.go +++ b/extend/config/config.go @@ -1,9 +1,8 @@ package config import ( - "log" - "github.com/spf13/viper" + "log" ) type server struct { @@ -54,11 +53,17 @@ Dbtablepersons index `mapstructure:"dbtablepersons"` Personaction index `mapstructure:"personaction"` } - type index struct { IndexName string `mapstructure:"index"` IndexType string `mapstructure:"type"` } + +type sopath struct { + Ip string `mapstructure:"ip"` + Port string `mapstructure:"port"` +} + +var SoPath = &sopath{} var EsInfo = &esinfo{} @@ -89,4 +94,5 @@ viper.UnmarshalKey("database", DBconf) viper.UnmarshalKey("weedfs", WeedFs) viper.UnmarshalKey("compare", CompServerInfo) + viper.UnmarshalKey("sopath",SoPath) } diff --git a/router/router.go b/router/router.go index 453d013..95b892e 100644 --- a/router/router.go +++ b/router/router.go @@ -188,6 +188,7 @@ sdkApi.GET("/findAllSdk", sdkController.FindAllSdk) sdkApi.GET("/findByTaskId", sdkController.FindByTaskId) sdkApi.GET("/getById", sdkController.GetById) + sdkApi.GET("/sdkDownload",sdkController.SdkDownLoad) } //绠楁硶鍙傛暟 diff --git a/service/SdkDownLoad.go b/service/SdkDownLoad.go new file mode 100644 index 0000000..56ed6e2 --- /dev/null +++ b/service/SdkDownLoad.go @@ -0,0 +1,112 @@ +package service + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "strings" + "webserver/extend/logger" + + "webserver/util" +) +// 浠庢湇鍔″櫒涓婁笅杞芥枃浠跺埌涓存椂鐩綍锛屾牎楠屼箣鍚庡鏋滃畬鏁村皢鍏舵嫹璐濆埌鐩爣鐩綍涓� +func DownSo(url string)(bool,error) { + resp, err := http.Get(url) + if err != nil { + logger.Error("鑾峰彇鏂囦欢澶辫触") + 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 + } + 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") + if err1 != nil { + logger.Error(err1) + return false,err1 + } + md5str_origin,err2 := ioutil.ReadFile("/opt/temp/"+fileName+".txt") + if err2 != nil { + logger.Error("璇诲彇瑙e帇鍚庣殑md5鏂囦欢澶辫触") + return false,err2 + } + flag := CompareMd5([]byte(md5str),md5str_origin) + if flag { + logger.Info("涓ゆMD5缂栫爜涓�鑷达紒") + } else { + logger.Debug("涓ゆMD5缂栫爜涓嶄竴鑷达紝璇烽噸鏂颁笅杞�") + return false,nil + } + // 浠巙rl涓埅鍙杝oName + soName := GetFileNameFromUrl(url,true) + f, err := os.Create("/opt/workspace/ruleprocess/algorithm/" + soName) + if err != nil { + logger.Error("鍦ㄩ」鐩洰褰曚笅鍒涘缓so鏂囦欢澶辫触") + return false,err + } + data,_ := ioutil.ReadFile("/opt/temp/"+soName) + _,err4 := f.Write(data) + if err4 != nil { + logger.Error("澶嶅埗鏂囦欢鍑洪敊") + return false,err4 + } + return true,nil +} + +func CopyFile(byte []byte, dst string) (w int64, err error) { + dstFile, err := os.Create(dst) + if err != nil { + fmt.Println(err.Error()) + return + } + defer dstFile.Close() + return io.Copy(dstFile, bytes.NewReader(byte)) +} + +// 鎸囧畾鐩綍鐨勬枃浠剁敓鎴愮浉搴旂殑MD5鐮佹枃浠� +func File2md5 (filename string) (string, error) { + // 鏂囦欢鐢熸垚MD5鍔犲瘑鍔犲瘑鏂囦欢 + file, err := os.Open(filename) + if err != nil { + fmt.Println("os Open error") + return "", err + } + md5 := md5.New() + _, err = io.Copy(md5, file) + if err != nil { + fmt.Println("io copy error") + return "", err + } + md5Str := hex.EncodeToString(md5.Sum(nil)) + return md5Str,nil +} +// 浠巙rl涓埅鍙栧嚭鏂囦欢鍚嶏紝鍙傛暟鏄槸鍚﹀甫鍚庣紑 +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] + return withoutSuffix + } +} + +// 姣旇緝涓や釜MD5缂栫爜鏄惁涓�鑷� +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 diff --git a/util/zip.go b/util/zip.go new file mode 100644 index 0000000..166173d --- /dev/null +++ b/util/zip.go @@ -0,0 +1,118 @@ +package util + +import ( + "archive/zip" + "io" + "os" + "strings" +) + +//鍘嬬缉鏂囦欢 +//files 鏂囦欢鏁扮粍锛屽彲浠ユ槸涓嶅悓dir涓嬬殑鏂囦欢鎴栬�呮枃浠跺す +//dest 鍘嬬缉鏂囦欢瀛樻斁鍦板潃 +func Compress2Zip(files []*os.File, dest string) error { + d, _ := os.Create(dest) + defer d.Close() + w := zip.NewWriter(d) + defer w.Close() + for _, file := range files { + err := compress(file, "", w) + if err != nil { + return err + } + } + return nil +} + +func compress(file *os.File, prefix string, zw *zip.Writer) error { + info, err := file.Stat() + if err != nil { + return err + } + if info.IsDir() { + prefix = prefix + "/" + info.Name() + fileInfos, err := file.Readdir(-1) + if err != nil { + return err + } + for _, fi := range fileInfos { + f, err := os.Open(file.Name() + "/" + fi.Name()) + if err != nil { + return err + } + err = compress(f, prefix, zw) + if err != nil { + return err + } + } + } else { + header, err := zip.FileInfoHeader(info) + header.Name = prefix + "/" + header.Name + if err != nil { + return err + } + writer, err := zw.CreateHeader(header) + if err != nil { + return err + } + _, err = io.Copy(writer, file) + file.Close() + if err != nil { + return err + } + } + return nil +} + +//瑙e帇 +func DeCompress(zipFile, dest string) error { + reader, err := zip.OpenReader(zipFile) + if err != nil { + return err + } + defer reader.Close() + for _, file := range reader.File { + rc, err := file.Open() + if err != nil { + return err + } + defer rc.Close() + filename := dest + file.Name + err = os.MkdirAll(getDir(filename), 0755) + if err != nil { + return err + } + w, err := os.Create(filename) + if err != nil { + return err + } + defer w.Close() + _, err = io.Copy(w, rc) + if err != nil { + return err + } + w.Close() + rc.Close() + } + return nil +} + +func getDir(path string) string { + return subString(path, 0, strings.LastIndex(path, "/")) +} + +func subString(str string, start, end int) string { + rs := []rune(str) + length := len(rs) + + if start < 0 || start > length { + panic("start is wrong") + } + + if end < start || end > length { + panic("end is wrong") + } + + return string(rs[start:end]) +} + diff --git a/util/zip_test.go b/util/zip_test.go new file mode 100644 index 0000000..9ed0d33 --- /dev/null +++ b/util/zip_test.go @@ -0,0 +1,36 @@ +package util + +import ( + "os" + "testing" +) + +func TestCompress(t *testing.T) { + f1, err := os.Open("D://test/130.png") + if err != nil { + t.Fatal(err) + } + defer f1.Close() + f2, err := os.Open("D://test/file.exe") + if err != nil { + t.Fatal(err) + } + defer f2.Close() + f3, err := os.Open("D://test/face.txt") + if err != nil { + t.Fatal(err) + } + defer f3.Close() + var files = []*os.File{f1, f2, f3} + dest := "D://test/test.zip" + err = Compress(files, dest) + if err != nil { + t.Fatal(err) + } +} +func TestDeCompress(t *testing.T) { + err := DeCompress("D://test/test.zip", "D://test") + if err != nil { + t.Fatal(err) + } +} -- Gitblit v1.8.0