server.go 1.8 KB

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