package service
|
|
import (
|
"bytes"
|
"crypto/md5"
|
"encoding/hex"
|
"fmt"
|
"io"
|
"io/ioutil"
|
"net/http"
|
"os"
|
"strings"
|
"basic.com/valib/logger.git"
|
|
"webserver/util"
|
)
|
// 从服务器上下载文件到临时目录,校验之后如果完整将其拷贝到目标目录下
|
func DownSo(url string)(bool,error) {
|
resp, err := http.Get(url)
|
if err != nil {
|
logger.Error("获取文件失败")
|
return false,err
|
}
|
// 从resp中读出zip文件解压缩,解出face.so,face.txt,然后把解压出的so用MD5编码出一个temp.txt文件,与解压出的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("读取解压后的md5文件失败")
|
return false,err2
|
}
|
flag := CompareMd5([]byte(md5str),md5str_origin)
|
if flag {
|
logger.Info("两次MD5编码一致!")
|
} else {
|
logger.Debug("两次MD5编码不一致,请重新下载")
|
return false,nil
|
}
|
// 从url中截取soName
|
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
|
}
|
// 从url中截取出文件名,参数是是否带后缀
|
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
|
}
|
}
|