server.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. a.lastStatus = a.serverService.GetStatus(a.lastStatus)
  33. }
  34. func (a *ServerController) startTask() {
  35. webServer := global.GetWebServer()
  36. c := webServer.GetCron()
  37. c.AddFunc("@every 2s", func() {
  38. now := time.Now()
  39. if now.Sub(a.lastGetStatusTime) > time.Minute*3 {
  40. return
  41. }
  42. a.refreshStatus()
  43. })
  44. }
  45. func (a *ServerController) status(c *gin.Context) {
  46. a.lastGetStatusTime = time.Now()
  47. jsonObj(c, a.lastStatus, nil)
  48. }
  49. func (a *ServerController) getXrayVersion(c *gin.Context) {
  50. now := time.Now()
  51. if now.Sub(a.lastGetVersionsTime) <= time.Minute {
  52. jsonObj(c, a.lastVersions, nil)
  53. return
  54. }
  55. versions, err := a.serverService.GetXrayVersions()
  56. if err != nil {
  57. jsonMsg(c, I18n(c , "getVersion"), err)
  58. return
  59. }
  60. a.lastVersions = versions
  61. a.lastGetVersionsTime = time.Now()
  62. jsonObj(c, versions, nil)
  63. }
  64. func (a *ServerController) installXray(c *gin.Context) {
  65. version := c.Param("version")
  66. err := a.serverService.UpdateXray(version)
  67. jsonMsg(c, I18n(c , "install") + " xray", err)
  68. }