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