version.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package config
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "goseg/structs"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "time"
  11. )
  12. var (
  13. VersionServerReady = false
  14. VersionInfo structs.Channel
  15. )
  16. // check the version server and return struct
  17. func CheckVersion() (structs.Channel, bool) {
  18. versMutex.Lock()
  19. defer versMutex.Unlock()
  20. conf := Conf()
  21. releaseChannel := conf.UpdateBranch
  22. const retries = 10
  23. const delay = time.Second
  24. url := globalConfig.UpdateUrl
  25. var fetchedVersion structs.Version
  26. for i := 0; i < retries; i++ {
  27. resp, err := http.Get(url)
  28. if err != nil {
  29. errmsg := fmt.Sprintf("Unable to connect to update server: %v", err)
  30. logger.Warn(errmsg)
  31. if i < retries-1 {
  32. time.Sleep(delay)
  33. continue
  34. } else {
  35. VersionServerReady = false
  36. return VersionInfo, false
  37. }
  38. }
  39. // read the body bytes
  40. body, err := ioutil.ReadAll(resp.Body)
  41. resp.Body.Close()
  42. if err != nil {
  43. errmsg := fmt.Sprintf("Error reading version info: %v", err)
  44. logger.Warn(errmsg)
  45. if i < retries-1 {
  46. time.Sleep(delay)
  47. continue
  48. } else {
  49. VersionServerReady = false
  50. return VersionInfo, false
  51. }
  52. }
  53. // unmarshal values into Version struct
  54. err = json.Unmarshal(body, &fetchedVersion)
  55. if err != nil {
  56. errmsg := fmt.Sprintf("Error unmarshalling JSON: %v", err)
  57. logger.Warn(errmsg)
  58. if i < retries-1 {
  59. time.Sleep(delay)
  60. continue
  61. } else {
  62. VersionServerReady = false
  63. return VersionInfo, false
  64. }
  65. }
  66. VersionInfo = fetchedVersion.Groundseg[releaseChannel]
  67. // debug: re-marshal and write the entire fetched version to disk
  68. confPath := filepath.Join(BasePath, "settings", "version_info.json")
  69. file, err := os.Create(confPath)
  70. if err != nil {
  71. errmsg := fmt.Sprintf("Failed to create file: %v", err)
  72. logger.Error(errmsg)
  73. VersionServerReady = false
  74. return VersionInfo, false
  75. }
  76. defer file.Close()
  77. encoder := json.NewEncoder(file)
  78. encoder.SetIndent("", " ")
  79. if err := encoder.Encode(&fetchedVersion); err != nil {
  80. errmsg := fmt.Sprintf("Failed to write JSON: %v", err)
  81. logger.Error(errmsg)
  82. }
  83. VersionServerReady = true
  84. return VersionInfo, true
  85. }
  86. VersionServerReady = false
  87. return VersionInfo, false
  88. }
  89. func CheckVersionLoop() {
  90. ticker := time.NewTicker(checkInterval)
  91. conf := Conf()
  92. releaseChannel := conf.UpdateBranch
  93. for {
  94. select {
  95. case <-ticker.C:
  96. latestVersion, _ := CheckVersion()
  97. currentChannelVersion := VersionInfo
  98. latestChannelVersion := latestVersion
  99. if latestChannelVersion != currentChannelVersion {
  100. fmt.Printf("New version available in %s channel! Current: %+v, Latest: %+v\n", releaseChannel, currentChannelVersion, latestChannelVersion)
  101. VersionInfo = latestVersion
  102. // Handle the update logic here
  103. }
  104. }
  105. }
  106. }