version.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package config
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "goseg/defaults"
  6. "goseg/structs"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "path/filepath"
  11. "time"
  12. )
  13. var (
  14. VersionServerReady = false
  15. VersionInfo structs.Channel
  16. )
  17. // check the version server and return struct
  18. func CheckVersion() (structs.Channel, bool) {
  19. versMutex.Lock()
  20. defer versMutex.Unlock()
  21. conf := Conf()
  22. releaseChannel := conf.UpdateBranch
  23. const retries = 10
  24. const delay = time.Second
  25. url := globalConfig.UpdateUrl
  26. var fetchedVersion structs.Version
  27. for i := 0; i < retries; i++ {
  28. resp, err := http.Get(url)
  29. if err != nil {
  30. errmsg := fmt.Sprintf("Unable to connect to update server: %v", err)
  31. Logger.Warn(errmsg)
  32. if i < retries-1 {
  33. time.Sleep(delay)
  34. continue
  35. } else {
  36. VersionServerReady = false
  37. return VersionInfo, false
  38. }
  39. }
  40. // read the body bytes
  41. body, err := ioutil.ReadAll(resp.Body)
  42. resp.Body.Close()
  43. if err != nil {
  44. errmsg := fmt.Sprintf("Error reading version info: %v", err)
  45. Logger.Warn(errmsg)
  46. if i < retries-1 {
  47. time.Sleep(delay)
  48. continue
  49. } else {
  50. VersionServerReady = false
  51. return VersionInfo, false
  52. }
  53. }
  54. // unmarshal values into Version struct
  55. err = json.Unmarshal(body, &fetchedVersion)
  56. if err != nil {
  57. errmsg := fmt.Sprintf("Error unmarshalling JSON: %v", err)
  58. Logger.Warn(errmsg)
  59. if i < retries-1 {
  60. time.Sleep(delay)
  61. continue
  62. } else {
  63. VersionServerReady = false
  64. return VersionInfo, false
  65. }
  66. }
  67. VersionInfo = fetchedVersion.Groundseg[releaseChannel]
  68. // debug: re-marshal and write the entire fetched version to disk
  69. confPath := filepath.Join(BasePath, "settings", "version_info.json")
  70. file, err := os.Create(confPath)
  71. if err != nil {
  72. errmsg := fmt.Sprintf("Failed to create file: %v", err)
  73. Logger.Error(errmsg)
  74. VersionServerReady = false
  75. return VersionInfo, false
  76. }
  77. defer file.Close()
  78. encoder := json.NewEncoder(file)
  79. encoder.SetIndent("", " ")
  80. if err := encoder.Encode(&fetchedVersion); err != nil {
  81. errmsg := fmt.Sprintf("Failed to write JSON: %v", err)
  82. Logger.Error(errmsg)
  83. }
  84. VersionServerReady = true
  85. return VersionInfo, true
  86. }
  87. VersionServerReady = false
  88. return VersionInfo, false
  89. }
  90. func CheckVersionLoop() {
  91. ticker := time.NewTicker(checkInterval)
  92. conf := Conf()
  93. releaseChannel := conf.UpdateBranch
  94. for {
  95. select {
  96. case <-ticker.C:
  97. latestVersion, _ := CheckVersion()
  98. currentChannelVersion := VersionInfo
  99. latestChannelVersion := latestVersion
  100. if latestChannelVersion != currentChannelVersion {
  101. fmt.Printf("New version available in %s channel! Current: %+v, Latest: %+v\n", releaseChannel, currentChannelVersion, latestChannelVersion)
  102. VersionInfo = latestVersion
  103. // Handle the update logic here
  104. }
  105. }
  106. }
  107. }
  108. // write the defaults.VersionInfo value to disk
  109. func CreateDefaultVersion() error {
  110. var versionInfo structs.Version
  111. err := json.Unmarshal([]byte(defaults.DefaultVersionText), &versionInfo)
  112. if err != nil {
  113. return err
  114. }
  115. prettyJSON, err := json.MarshalIndent(versionInfo, "", " ")
  116. if err != nil {
  117. return err
  118. }
  119. filePath := filepath.Join(BasePath, "settings", "version_info.json")
  120. err = ioutil.WriteFile(filePath, prettyJSON, 0644)
  121. if err != nil {
  122. return err
  123. }
  124. return nil
  125. }
  126. // return the existing local version info or create default
  127. func LocalVersion() structs.Version {
  128. confPath := filepath.Join(BasePath, "settings", "version_info.json")
  129. _, err := os.Open(confPath)
  130. if err != nil {
  131. // create a default if it doesn't exist
  132. err = CreateDefaultVersion()
  133. if err != nil {
  134. // panic if we can't create it
  135. errmsg := fmt.Sprintf("Unable to write version info! %v", err)
  136. Logger.Error(errmsg)
  137. panic(errmsg)
  138. }
  139. }
  140. file, err := ioutil.ReadFile(confPath)
  141. if err != nil {
  142. errmsg := fmt.Sprintf("Unable to load version info: %v", err)
  143. panic(errmsg)
  144. }
  145. var versionStruct structs.Version
  146. if err := json.Unmarshal(file, &versionStruct); err != nil {
  147. errmsg := fmt.Sprintf("Error decoding version JSON: %v", err)
  148. panic(errmsg)
  149. }
  150. return versionStruct
  151. }