package upgrade import ( "fmt" "io" "io/ioutil" "net/http" "net/url" "os" "os/exec" "path/filepath" "rtzh_elec_temperature/conf" "rtzh_elec_temperature/global" "rtzh_elec_temperature/logger" httpService "rtzh_elec_temperature/models" "rtzh_elec_temperature/models/bo" "rtzh_elec_temperature/tools" "runtime" "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 { //获取当前版本号 var exist = true if _, err := os.Stat("./version.txt"); os.IsNotExist(err) { exist = false } lastVersionStr := "" if exist { lastVersionTmp, _ := ioutil.ReadFile("./version.txt") lastVersionStr = string(lastVersionTmp) os.Remove("./version.txt") } ccnow, _ := bo.GetSysParamValue("client_version_"+global.DeviceSN, "") if ccnow != lastVersionStr && lastVersionStr != "" { CurrentVersion = lastVersionStr 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 } CurrentVersion = tools.GetVersion() 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 }