upgrade.go 2.6 KB

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