client.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package upgrade
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. "net/http"
  7. "net/url"
  8. "os"
  9. "os/exec"
  10. "path/filepath"
  11. "runtime"
  12. "scd_check_tools/conf"
  13. "scd_check_tools/global"
  14. "scd_check_tools/logger"
  15. "scd_check_tools/models/bo"
  16. "scd_check_tools/tools"
  17. httpService "scd_check_tools/tools"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. //当前版本号
  23. var CurrentVersion = ""
  24. //是否有新版本
  25. var IsNewVersion = 0
  26. var versionInfo = map[string]interface{}{}
  27. //新版本检查
  28. func CheckVersion() {
  29. logger.Logger.Println("启动版本检查进程")
  30. updateZipDir := "./static/newversion"
  31. _, err := os.Stat(updateZipDir)
  32. if err != nil {
  33. logger.Logger.Error(err)
  34. return
  35. }
  36. if os.IsNotExist(err) {
  37. os.MkdirAll(updateZipDir, 0777)
  38. }
  39. vurl := tools.IsEmpty(conf.GlobalConfig["check_version_url"])
  40. if vurl == "" {
  41. logger.Logger.Error("未配置版本检查接口地址,进程退出")
  42. return
  43. }
  44. GetVersion()
  45. if CurrentVersion == "" {
  46. return
  47. }
  48. logger.Logger.Info("当前版本:" + CurrentVersion)
  49. //检查本地有没有需要更新的包
  50. //有新包,则提示用户需要更新
  51. flist, err := ioutil.ReadDir(updateZipDir)
  52. if err != nil {
  53. logger.Logger.Error("检查更新包时异常:" + err.Error())
  54. return
  55. }
  56. currentVersion := strings.Replace(CurrentVersion, "-", "", 1)
  57. clientVersionInt, _ := strconv.Atoi(currentVersion)
  58. maxVersion := 0
  59. for _, fp := range flist {
  60. if fp.IsDir() {
  61. continue
  62. }
  63. f2 := strings.Split(fp.Name(), ".")
  64. if len(f2) == 1 || f2[1] != "zip" {
  65. continue
  66. }
  67. vvv, err := strconv.Atoi(f2[0])
  68. if err != nil {
  69. continue
  70. }
  71. if vvv > maxVersion {
  72. maxVersion = vvv
  73. }
  74. }
  75. if maxVersion != 0 && maxVersion > clientVersionInt {
  76. //发现更新包
  77. logger.Logger.Println("发现更新包,版本号:" + strconv.Itoa(maxVersion))
  78. //先清除残留的更新程序,如果有.避免启动多个更新程序
  79. if string(runtime.GOOS) == "windows" {
  80. //检查是否存在更新程序
  81. _, er := os.Stat("./go_app_upgrade.exe")
  82. if er != nil && os.IsNotExist(er) {
  83. logger.Logger.Error("未发现更新程序go_app_upgrade.exe!")
  84. return
  85. }
  86. killcmd := exec.Command("taskkill.exe", "/f", "/im", "go_app_upgrade.exe")
  87. killcmd.Start()
  88. //启动更新程序
  89. logger.Logger.Println("5秒后将启动更新程序并关闭当前程序")
  90. exitTime := 5
  91. go func() {
  92. for {
  93. if exitTime <= 0 {
  94. //启动更新程序
  95. exename := conf.GlobalConfig["appid"]
  96. dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
  97. cmd := exec.Command("cmd.exe", "/c", "start "+dir+"/go_app_upgrade.exe "+exename+" "+strconv.Itoa(maxVersion))
  98. cmd.Start()
  99. //关闭当前程序
  100. os.Exit(0)
  101. }
  102. fmt.Println(exitTime)
  103. time.Sleep(1 * time.Second)
  104. exitTime = exitTime - 1
  105. }
  106. }()
  107. } else {
  108. //检查是否存在更新程序
  109. _, er := os.Stat("./go_app_upgrade")
  110. if er != nil && os.IsNotExist(er) {
  111. logger.Logger.Error("未发现更新程序go_app_upgrade!")
  112. return
  113. }
  114. exename := conf.GlobalConfig["appid"]
  115. killcmd := exec.Command("killall -9 " + exename)
  116. killcmd.Start()
  117. //启动更新程序
  118. logger.Logger.Println("5秒后将启动更新程序并关闭当前程序")
  119. exitTime := 5
  120. go func() {
  121. for {
  122. if exitTime <= 0 {
  123. //启动更新程序
  124. //dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
  125. cmd := exec.Command("./go_app_upgrade", exename+" "+strconv.Itoa(maxVersion))
  126. cmd.Start()
  127. //关闭当前程序
  128. os.Exit(0)
  129. }
  130. fmt.Println(exitTime)
  131. time.Sleep(1 * time.Second)
  132. exitTime = exitTime - 1
  133. }
  134. }()
  135. }
  136. return
  137. }
  138. //检查新版本
  139. tmpnewVersion := 0 //临时版本号
  140. for {
  141. result, err := httpService.Get(vurl + "?version=" + CurrentVersion)
  142. if err != nil {
  143. logger.Logger.Error("获取新版本信息时错误:" + err.Error())
  144. return
  145. }
  146. if tools.Typeof(result) == "string" {
  147. logger.Logger.Error(" 获取新版本信息时错误:" + tools.IsEmpty(result))
  148. return
  149. }
  150. result2 := result.(map[string]interface{})
  151. code := tools.IsEmpty(result2["returncode"])
  152. if code != "200" {
  153. logger.Logger.Error(" 获取新版本信息时错误:" + tools.IsEmpty(result2["msg"]))
  154. return
  155. }
  156. dataJson := result2["data"].(map[string]interface{})
  157. zipUrl := tools.IsEmpty(dataJson["url"])
  158. newVersion := tools.IsEmpty(dataJson["version"])
  159. if zipUrl != "" {
  160. newVersionInt, _ := strconv.Atoi(newVersion)
  161. if tmpnewVersion >= newVersionInt {
  162. if conf.GlobalConfig["runmode"] == "dev" {
  163. time.Sleep(1 * time.Minute) //开发模式每1分钟检查一次
  164. } else {
  165. time.Sleep(60 * time.Minute) //每1小时检查一次
  166. }
  167. continue
  168. }
  169. tmpnewVersion = newVersionInt
  170. logger.Logger.Println("发现新版本可以更新,版本号:" + newVersion)
  171. urls, _ := url.Parse(vurl)
  172. downHttp := http.DefaultClient
  173. downHttp.Timeout = 0
  174. res, err := downHttp.Get(urls.Scheme + "://" + urls.Host + "/" + zipUrl)
  175. if err != nil {
  176. logger.Logger.Error("新版本下载失败:" + err.Error())
  177. return
  178. }
  179. zip, err := os.Create(updateZipDir + "/" + newVersion + ".zip")
  180. if err != nil {
  181. logger.Logger.Error(" 新版本保存到本地失败:" + err.Error())
  182. return
  183. }
  184. fData := res.Body
  185. io.Copy(zip, fData)
  186. fData.Close()
  187. logger.Logger.Println("新版本下载成功!")
  188. IsNewVersion = 1
  189. versionInfo = dataJson
  190. }
  191. if conf.GlobalConfig["runmode"] == "dev" {
  192. time.Sleep(1 * time.Minute) //开发模式每1分钟检查一次
  193. } else {
  194. time.Sleep(60 * time.Minute) //每1小时检查一次
  195. }
  196. }
  197. }
  198. //获取当前程序版本号
  199. func GetVersion() string {
  200. //获取当前版本号
  201. CurrentVersion = tools.GetVersion()
  202. ccnow, _ := bo.GetSysParamValue("client_version_"+global.DeviceSN, "")
  203. if ccnow != CurrentVersion && CurrentVersion != "" {
  204. v := bo.Global_sys_param{Param_name: "client_version_" + global.DeviceSN, Param_memo: global.DeviceSN + "_客户端版本", Param_value: CurrentVersion}
  205. bo.SaveSysParam(v)
  206. return CurrentVersion
  207. }
  208. if ccnow != "" {
  209. CurrentVersion = ccnow
  210. return CurrentVersion
  211. }
  212. v := bo.Global_sys_param{Param_name: "client_version_" + global.DeviceSN, Param_memo: global.DeviceSN + "_客户端版本", Param_value: CurrentVersion}
  213. bo.SaveSysParam(v)
  214. return CurrentVersion
  215. }
  216. func GetNewVersionInfo() map[string]interface{} {
  217. return versionInfo
  218. }