server.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package controller
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. "runtime"
  6. "time"
  7. "x-ui/web/service"
  8. )
  9. func stopServerController(a *ServerController) {
  10. a.stopTask()
  11. }
  12. type ServerController struct {
  13. *serverController
  14. }
  15. func NewServerController(g *gin.RouterGroup) *ServerController {
  16. a := &ServerController{
  17. serverController: newServerController(g),
  18. }
  19. runtime.SetFinalizer(a, stopServerController)
  20. return a
  21. }
  22. type serverController struct {
  23. BaseController
  24. serverService service.ServerService
  25. ctx context.Context
  26. cancel context.CancelFunc
  27. lastStatus *service.Status
  28. lastGetStatusTime time.Time
  29. lastVersions []string
  30. lastGetVersionsTime time.Time
  31. }
  32. func newServerController(g *gin.RouterGroup) *serverController {
  33. ctx, cancel := context.WithCancel(context.Background())
  34. a := &serverController{
  35. ctx: ctx,
  36. cancel: cancel,
  37. lastGetStatusTime: time.Now(),
  38. }
  39. a.initRouter(g)
  40. a.startTask()
  41. return a
  42. }
  43. func (a *serverController) initRouter(g *gin.RouterGroup) {
  44. g.POST("/server/status", a.status)
  45. g.POST("/server/getXrayVersion", a.getXrayVersion)
  46. g.POST("/server/installXray/:version", a.installXray)
  47. }
  48. func (a *serverController) refreshStatus() {
  49. status := a.serverService.GetStatus(a.lastStatus)
  50. a.lastStatus = status
  51. }
  52. func (a *serverController) startTask() {
  53. go func() {
  54. for {
  55. select {
  56. case <-a.ctx.Done():
  57. break
  58. default:
  59. }
  60. now := time.Now()
  61. if now.Sub(a.lastGetStatusTime) > time.Minute*3 {
  62. time.Sleep(time.Second * 2)
  63. continue
  64. }
  65. a.refreshStatus()
  66. }
  67. }()
  68. }
  69. func (a *serverController) stopTask() {
  70. a.cancel()
  71. }
  72. func (a *serverController) status(c *gin.Context) {
  73. a.lastGetStatusTime = time.Now()
  74. jsonObj(c, a.lastStatus, nil)
  75. }
  76. func (a *serverController) getXrayVersion(c *gin.Context) {
  77. now := time.Now()
  78. if now.Sub(a.lastGetVersionsTime) <= time.Minute {
  79. jsonObj(c, a.lastVersions, nil)
  80. return
  81. }
  82. versions, err := a.serverService.GetXrayVersions()
  83. if err != nil {
  84. jsonMsg(c, "获取版本", err)
  85. return
  86. }
  87. a.lastVersions = versions
  88. a.lastGetVersionsTime = time.Now()
  89. jsonObj(c, versions, nil)
  90. }
  91. func (a *serverController) installXray(c *gin.Context) {
  92. version := c.Param("version")
  93. err := a.serverService.UpdateXray(version)
  94. jsonMsg(c, "安装 xray", err)
  95. }