123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- package upgrade
- import (
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "net/url"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "scd_check_tools/conf"
- "scd_check_tools/global"
- "scd_check_tools/logger"
- "scd_check_tools/models/bo"
- "scd_check_tools/tools"
- httpService "scd_check_tools/tools"
- "strconv"
- "strings"
- "time"
- )
- //当前版本号
- var CurrentVersion = ""
- //是否有新版本
- var IsNewVersion = 0
- var versionInfo = map[string]interface{}{}
- //新版本检查
- func CheckVersion() {
- logger.Logger.Println("启动版本检查进程")
- updateZipDir := "./static/newversion"
- _, err := os.Stat(updateZipDir)
- if err != nil {
- logger.Logger.Error(err)
- return
- }
- if os.IsNotExist(err) {
- os.MkdirAll(updateZipDir, 0777)
- }
- vurl := tools.IsEmpty(conf.GlobalConfig["check_version_url"])
- if vurl == "" {
- logger.Logger.Error("未配置版本检查接口地址,进程退出")
- return
- }
- GetVersion()
- if CurrentVersion == "" {
- return
- }
- logger.Logger.Info("当前版本:" + CurrentVersion)
- //检查本地有没有需要更新的包
- //有新包,则提示用户需要更新
- flist, err := ioutil.ReadDir(updateZipDir)
- if err != nil {
- logger.Logger.Error("检查更新包时异常:" + err.Error())
- return
- }
- currentVersion := strings.Replace(CurrentVersion, "-", "", 1)
- clientVersionInt, _ := strconv.Atoi(currentVersion)
- maxVersion := 0
- for _, fp := range flist {
- if fp.IsDir() {
- continue
- }
- f2 := strings.Split(fp.Name(), ".")
- if len(f2) == 1 || f2[1] != "zip" {
- continue
- }
- vvv, err := strconv.Atoi(f2[0])
- if err != nil {
- continue
- }
- if vvv > maxVersion {
- maxVersion = vvv
- }
- }
- if maxVersion != 0 && maxVersion > clientVersionInt {
- //发现更新包
- logger.Logger.Println("发现更新包,版本号:" + strconv.Itoa(maxVersion))
- //先清除残留的更新程序,如果有.避免启动多个更新程序
- if string(runtime.GOOS) == "windows" {
- //检查是否存在更新程序
- _, er := os.Stat("./go_app_upgrade.exe")
- if er != nil && os.IsNotExist(er) {
- logger.Logger.Error("未发现更新程序go_app_upgrade.exe!")
- return
- }
- killcmd := exec.Command("taskkill.exe", "/f", "/im", "go_app_upgrade.exe")
- killcmd.Start()
- //启动更新程序
- logger.Logger.Println("5秒后将启动更新程序并关闭当前程序")
- exitTime := 5
- go func() {
- for {
- if exitTime <= 0 {
- //启动更新程序
- exename := conf.GlobalConfig["appid"]
- dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
- cmd := exec.Command("cmd.exe", "/c", "start "+dir+"/go_app_upgrade.exe "+exename+" "+strconv.Itoa(maxVersion))
- cmd.Start()
- //关闭当前程序
- os.Exit(0)
- }
- fmt.Println(exitTime)
- time.Sleep(1 * time.Second)
- exitTime = exitTime - 1
- }
- }()
- } else {
- //检查是否存在更新程序
- _, er := os.Stat("./go_app_upgrade")
- if er != nil && os.IsNotExist(er) {
- logger.Logger.Error("未发现更新程序go_app_upgrade!")
- return
- }
- exename := conf.GlobalConfig["appid"]
- killcmd := exec.Command("killall -9 " + exename)
- killcmd.Start()
- //启动更新程序
- logger.Logger.Println("5秒后将启动更新程序并关闭当前程序")
- exitTime := 5
- go func() {
- for {
- if exitTime <= 0 {
- //启动更新程序
- //dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
- cmd := exec.Command("./go_app_upgrade", exename+" "+strconv.Itoa(maxVersion))
- cmd.Start()
- //关闭当前程序
- os.Exit(0)
- }
- fmt.Println(exitTime)
- time.Sleep(1 * time.Second)
- exitTime = exitTime - 1
- }
- }()
- }
- return
- }
- //检查新版本
- tmpnewVersion := 0 //临时版本号
- for {
- result, err := httpService.Get(vurl + "?version=" + CurrentVersion)
- if err != nil {
- logger.Logger.Error("获取新版本信息时错误:" + err.Error())
- return
- }
- if tools.Typeof(result) == "string" {
- logger.Logger.Error(" 获取新版本信息时错误:" + tools.IsEmpty(result))
- return
- }
- result2 := result.(map[string]interface{})
- code := tools.IsEmpty(result2["returncode"])
- if code != "200" {
- logger.Logger.Error(" 获取新版本信息时错误:" + tools.IsEmpty(result2["msg"]))
- return
- }
- dataJson := result2["data"].(map[string]interface{})
- zipUrl := tools.IsEmpty(dataJson["url"])
- newVersion := tools.IsEmpty(dataJson["version"])
- if zipUrl != "" {
- newVersionInt, _ := strconv.Atoi(newVersion)
- if tmpnewVersion >= newVersionInt {
- if conf.GlobalConfig["runmode"] == "dev" {
- time.Sleep(1 * time.Minute) //开发模式每1分钟检查一次
- } else {
- time.Sleep(60 * time.Minute) //每1小时检查一次
- }
- continue
- }
- tmpnewVersion = newVersionInt
- logger.Logger.Println("发现新版本可以更新,版本号:" + newVersion)
- urls, _ := url.Parse(vurl)
- downHttp := http.DefaultClient
- downHttp.Timeout = 0
- res, err := downHttp.Get(urls.Scheme + "://" + urls.Host + "/" + zipUrl)
- if err != nil {
- logger.Logger.Error("新版本下载失败:" + err.Error())
- return
- }
- zip, err := os.Create(updateZipDir + "/" + newVersion + ".zip")
- if err != nil {
- logger.Logger.Error(" 新版本保存到本地失败:" + err.Error())
- return
- }
- fData := res.Body
- io.Copy(zip, fData)
- fData.Close()
- logger.Logger.Println("新版本下载成功!")
- IsNewVersion = 1
- versionInfo = dataJson
- }
- if conf.GlobalConfig["runmode"] == "dev" {
- time.Sleep(1 * time.Minute) //开发模式每1分钟检查一次
- } else {
- time.Sleep(60 * time.Minute) //每1小时检查一次
- }
- }
- }
- //获取当前程序版本号
- func GetVersion() string {
- //获取当前版本号
- CurrentVersion = tools.GetVersion()
- ccnow, _ := bo.GetSysParamValue("client_version_"+global.DeviceSN, "")
- if ccnow != CurrentVersion && CurrentVersion != "" {
- v := bo.Global_sys_param{Param_name: "client_version_" + global.DeviceSN, Param_memo: global.DeviceSN + "_客户端版本", Param_value: CurrentVersion}
- bo.SaveSysParam(v)
- return CurrentVersion
- }
- if ccnow != "" {
- CurrentVersion = ccnow
- return CurrentVersion
- }
- v := bo.Global_sys_param{Param_name: "client_version_" + global.DeviceSN, Param_memo: global.DeviceSN + "_客户端版本", Param_value: CurrentVersion}
- bo.SaveSysParam(v)
- return CurrentVersion
- }
- func GetNewVersionInfo() map[string]interface{} {
- return versionInfo
- }
|