upgrade.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package system
  2. import (
  3. "github.com/0xJacky/Nginx-UI/api"
  4. "github.com/0xJacky/Nginx-UI/internal/upgrader"
  5. "github.com/0xJacky/Nginx-UI/settings"
  6. "github.com/gin-gonic/gin"
  7. "github.com/gorilla/websocket"
  8. "github.com/uozi-tech/cosy/logger"
  9. "net/http"
  10. "os"
  11. )
  12. func GetRelease(c *gin.Context) {
  13. data, err := upgrader.GetRelease(c.Query("channel"))
  14. if err != nil {
  15. api.ErrHandler(c, err)
  16. return
  17. }
  18. runtimeInfo, err := upgrader.GetRuntimeInfo()
  19. if err != nil {
  20. api.ErrHandler(c, err)
  21. return
  22. }
  23. type resp struct {
  24. upgrader.TRelease
  25. upgrader.RuntimeInfo
  26. }
  27. c.JSON(http.StatusOK, resp{
  28. data, runtimeInfo,
  29. })
  30. }
  31. func GetCurrentVersion(c *gin.Context) {
  32. curVer, err := upgrader.GetCurrentVersion()
  33. if err != nil {
  34. api.ErrHandler(c, err)
  35. return
  36. }
  37. c.JSON(http.StatusOK, curVer)
  38. }
  39. const (
  40. UpgradeStatusInfo = "info"
  41. UpgradeStatusError = "error"
  42. UpgradeStatusProgress = "progress"
  43. )
  44. type CoreUpgradeResp struct {
  45. Status string `json:"status"`
  46. Progress float64 `json:"progress"`
  47. Message string `json:"message"`
  48. }
  49. func PerformCoreUpgrade(c *gin.Context) {
  50. var upGrader = websocket.Upgrader{
  51. CheckOrigin: func(r *http.Request) bool {
  52. return true
  53. },
  54. }
  55. // upgrade http to websocket
  56. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  57. if err != nil {
  58. logger.Error(err)
  59. return
  60. }
  61. defer ws.Close()
  62. var control struct {
  63. DryRun bool `json:"dry_run"`
  64. Channel string `json:"channel"`
  65. }
  66. err = ws.ReadJSON(&control)
  67. if err != nil {
  68. logger.Error(err)
  69. return
  70. }
  71. _ = ws.WriteJSON(CoreUpgradeResp{
  72. Status: UpgradeStatusInfo,
  73. Message: "Initialing core upgrader",
  74. })
  75. u, err := upgrader.NewUpgrader(control.Channel)
  76. if err != nil {
  77. _ = ws.WriteJSON(CoreUpgradeResp{
  78. Status: UpgradeStatusError,
  79. Message: "Initial core upgrader error",
  80. })
  81. _ = ws.WriteJSON(CoreUpgradeResp{
  82. Status: UpgradeStatusError,
  83. Message: err.Error(),
  84. })
  85. logger.Error(err)
  86. return
  87. }
  88. _ = ws.WriteJSON(CoreUpgradeResp{
  89. Status: UpgradeStatusInfo,
  90. Message: "Downloading latest release",
  91. })
  92. progressChan := make(chan float64)
  93. go func() {
  94. for progress := range progressChan {
  95. _ = ws.WriteJSON(CoreUpgradeResp{
  96. Status: UpgradeStatusProgress,
  97. Progress: progress,
  98. })
  99. }
  100. }()
  101. tarName, err := u.DownloadLatestRelease(progressChan)
  102. if err != nil {
  103. _ = ws.WriteJSON(CoreUpgradeResp{
  104. Status: UpgradeStatusError,
  105. Message: "Download latest release error",
  106. })
  107. _ = ws.WriteJSON(CoreUpgradeResp{
  108. Status: UpgradeStatusError,
  109. Message: err.Error(),
  110. })
  111. logger.Error(err)
  112. return
  113. }
  114. defer func() {
  115. _ = os.Remove(tarName)
  116. _ = os.Remove(tarName + ".digest")
  117. }()
  118. _ = ws.WriteJSON(CoreUpgradeResp{
  119. Status: UpgradeStatusInfo,
  120. Message: "Performing core upgrade",
  121. })
  122. // dry run
  123. if control.DryRun || settings.NodeSettings.Demo {
  124. return
  125. }
  126. // bye, will restart nginx-ui in performCoreUpgrade
  127. err = u.PerformCoreUpgrade(tarName)
  128. if err != nil {
  129. _ = ws.WriteJSON(CoreUpgradeResp{
  130. Status: UpgradeStatusError,
  131. Message: "Perform core upgrade error",
  132. })
  133. _ = ws.WriteJSON(CoreUpgradeResp{
  134. Status: UpgradeStatusError,
  135. Message: err.Error(),
  136. })
  137. logger.Error(err)
  138. return
  139. }
  140. }