mirror of
https://github.com/alireza0/x-ui.git
synced 2026-03-14 05:23:09 +00:00
完成xray启动
This commit is contained in:
116
web/controller/server.go
Normal file
116
web/controller/server.go
Normal file
@@ -0,0 +1,116 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/gin-gonic/gin"
|
||||
"runtime"
|
||||
"time"
|
||||
"x-ui/web/service"
|
||||
)
|
||||
|
||||
func stopServerController(a *ServerController) {
|
||||
a.stopTask()
|
||||
}
|
||||
|
||||
type ServerController struct {
|
||||
*serverController
|
||||
}
|
||||
|
||||
func NewServerController(g *gin.RouterGroup) *ServerController {
|
||||
a := &ServerController{
|
||||
serverController: newServerController(g),
|
||||
}
|
||||
runtime.SetFinalizer(a, stopServerController)
|
||||
return a
|
||||
}
|
||||
|
||||
type serverController struct {
|
||||
BaseController
|
||||
|
||||
serverService service.ServerService
|
||||
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
|
||||
lastStatus *service.Status
|
||||
lastGetStatusTime time.Time
|
||||
|
||||
lastVersions []string
|
||||
lastGetVersionsTime time.Time
|
||||
}
|
||||
|
||||
func newServerController(g *gin.RouterGroup) *serverController {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
a := &serverController{
|
||||
ctx: ctx,
|
||||
cancel: cancel,
|
||||
lastGetStatusTime: time.Now(),
|
||||
}
|
||||
a.initRouter(g)
|
||||
a.startTask()
|
||||
return a
|
||||
}
|
||||
|
||||
func (a *serverController) initRouter(g *gin.RouterGroup) {
|
||||
g.POST("/server/status", a.status)
|
||||
g.POST("/server/getXrayVersion", a.getXrayVersion)
|
||||
g.POST("/server/installXray/:version", a.installXray)
|
||||
}
|
||||
|
||||
func (a *serverController) refreshStatus() {
|
||||
status := a.serverService.GetStatus(a.lastStatus)
|
||||
a.lastStatus = status
|
||||
}
|
||||
|
||||
func (a *serverController) startTask() {
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-a.ctx.Done():
|
||||
break
|
||||
default:
|
||||
}
|
||||
now := time.Now()
|
||||
if now.Sub(a.lastGetStatusTime) > time.Minute*3 {
|
||||
time.Sleep(time.Second * 2)
|
||||
continue
|
||||
}
|
||||
a.refreshStatus()
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (a *serverController) stopTask() {
|
||||
a.cancel()
|
||||
}
|
||||
|
||||
func (a *serverController) status(c *gin.Context) {
|
||||
a.lastGetStatusTime = time.Now()
|
||||
|
||||
jsonObj(c, a.lastStatus, nil)
|
||||
}
|
||||
|
||||
func (a *serverController) getXrayVersion(c *gin.Context) {
|
||||
now := time.Now()
|
||||
if now.Sub(a.lastGetVersionsTime) <= time.Minute {
|
||||
jsonObj(c, a.lastVersions, nil)
|
||||
return
|
||||
}
|
||||
|
||||
versions, err := a.serverService.GetXrayVersions()
|
||||
if err != nil {
|
||||
jsonMsg(c, "获取版本", err)
|
||||
return
|
||||
}
|
||||
|
||||
a.lastVersions = versions
|
||||
a.lastGetVersionsTime = time.Now()
|
||||
|
||||
jsonObj(c, versions, nil)
|
||||
}
|
||||
|
||||
func (a *serverController) installXray(c *gin.Context) {
|
||||
version := c.Param("version")
|
||||
err := a.serverService.UpdateXray(version)
|
||||
jsonMsg(c, "安装 xray", err)
|
||||
}
|
||||
Reference in New Issue
Block a user