完成xray启动

This commit is contained in:
sprov
2021-05-27 23:04:39 +08:00
parent 56ed8f355c
commit 3cd25ce5ea
42 changed files with 3627 additions and 229 deletions

116
web/controller/server.go Normal file
View 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)
}