2023-02-09 22:18:06 +03:00
|
|
|
package controller
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
"x-ui/web/global"
|
|
|
|
"x-ui/web/service"
|
2023-03-24 16:44:26 +03:00
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
2023-02-09 22:18:06 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
type ServerController struct {
|
|
|
|
BaseController
|
|
|
|
|
|
|
|
serverService service.ServerService
|
|
|
|
|
|
|
|
lastStatus *service.Status
|
|
|
|
lastGetStatusTime time.Time
|
|
|
|
|
|
|
|
lastVersions []string
|
|
|
|
lastGetVersionsTime time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewServerController(g *gin.RouterGroup) *ServerController {
|
|
|
|
a := &ServerController{
|
|
|
|
lastGetStatusTime: time.Now(),
|
|
|
|
}
|
|
|
|
a.initRouter(g)
|
|
|
|
a.startTask()
|
|
|
|
return a
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *ServerController) initRouter(g *gin.RouterGroup) {
|
|
|
|
g = g.Group("/server")
|
|
|
|
|
|
|
|
g.Use(a.checkLogin)
|
|
|
|
g.POST("/status", a.status)
|
|
|
|
g.POST("/getXrayVersion", a.getXrayVersion)
|
2023-03-17 01:01:14 +03:00
|
|
|
g.POST("/stopXrayService", a.stopXrayService)
|
|
|
|
g.POST("/restartXrayService", a.restartXrayService)
|
2023-02-09 22:18:06 +03:00
|
|
|
g.POST("/installXray/:version", a.installXray)
|
2023-04-09 22:43:18 +03:00
|
|
|
g.POST("/logs/:count", a.getLogs)
|
2023-04-11 15:11:04 +03:00
|
|
|
g.POST("/getConfigJson", a.getConfigJson)
|
|
|
|
g.GET("/getDb", a.getDb)
|
2023-05-05 21:19:42 +03:00
|
|
|
g.POST("/importDB", a.importDB)
|
2023-04-18 21:04:06 +03:00
|
|
|
g.POST("/getNewX25519Cert", a.getNewX25519Cert)
|
2023-02-09 22:18:06 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func (a *ServerController) refreshStatus() {
|
|
|
|
a.lastStatus = a.serverService.GetStatus(a.lastStatus)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *ServerController) startTask() {
|
|
|
|
webServer := global.GetWebServer()
|
|
|
|
c := webServer.GetCron()
|
|
|
|
c.AddFunc("@every 2s", func() {
|
|
|
|
now := time.Now()
|
|
|
|
if now.Sub(a.lastGetStatusTime) > time.Minute*3 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
a.refreshStatus()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2023-02-18 15:37:32 +03:00
|
|
|
jsonMsg(c, I18n(c, "getVersion"), err)
|
2023-02-09 22:18:06 +03:00
|
|
|
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)
|
2023-02-18 15:37:32 +03:00
|
|
|
jsonMsg(c, I18n(c, "install")+" xray", err)
|
2023-02-09 22:18:06 +03:00
|
|
|
}
|
2023-03-17 01:01:14 +03:00
|
|
|
|
|
|
|
func (a *ServerController) stopXrayService(c *gin.Context) {
|
2023-03-24 16:44:26 +03:00
|
|
|
a.lastGetStatusTime = time.Now()
|
2023-03-17 01:01:14 +03:00
|
|
|
err := a.serverService.StopXrayService()
|
|
|
|
if err != nil {
|
|
|
|
jsonMsg(c, "", err)
|
|
|
|
return
|
|
|
|
}
|
2023-03-24 16:44:26 +03:00
|
|
|
jsonMsg(c, "Xray stoped", err)
|
2023-03-17 01:01:14 +03:00
|
|
|
}
|
2023-05-05 21:19:42 +03:00
|
|
|
|
2023-03-17 01:01:14 +03:00
|
|
|
func (a *ServerController) restartXrayService(c *gin.Context) {
|
|
|
|
err := a.serverService.RestartXrayService()
|
|
|
|
if err != nil {
|
|
|
|
jsonMsg(c, "", err)
|
|
|
|
return
|
|
|
|
}
|
2023-03-24 16:44:26 +03:00
|
|
|
jsonMsg(c, "Xray restarted", err)
|
|
|
|
}
|
2023-03-17 01:01:14 +03:00
|
|
|
|
2023-03-24 16:44:26 +03:00
|
|
|
func (a *ServerController) getLogs(c *gin.Context) {
|
2023-04-09 22:43:18 +03:00
|
|
|
count := c.Param("count")
|
|
|
|
logs, err := a.serverService.GetLogs(count)
|
2023-03-24 16:44:26 +03:00
|
|
|
if err != nil {
|
2023-04-18 21:04:06 +03:00
|
|
|
jsonMsg(c, "getLogs", err)
|
2023-03-24 16:44:26 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
jsonObj(c, logs, nil)
|
|
|
|
}
|
2023-04-11 15:11:04 +03:00
|
|
|
|
|
|
|
func (a *ServerController) getConfigJson(c *gin.Context) {
|
|
|
|
configJson, err := a.serverService.GetConfigJson()
|
|
|
|
if err != nil {
|
2023-04-18 21:04:06 +03:00
|
|
|
jsonMsg(c, "get config.json", err)
|
2023-04-11 15:11:04 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
jsonObj(c, configJson, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *ServerController) getDb(c *gin.Context) {
|
|
|
|
db, err := a.serverService.GetDb()
|
|
|
|
if err != nil {
|
2023-04-18 21:04:06 +03:00
|
|
|
jsonMsg(c, "get Database", err)
|
2023-04-11 15:11:04 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
// Set the headers for the response
|
|
|
|
c.Header("Content-Type", "application/octet-stream")
|
2023-04-13 18:12:51 +03:00
|
|
|
c.Header("Content-Disposition", "attachment; filename=x-ui.db")
|
2023-04-11 15:11:04 +03:00
|
|
|
|
|
|
|
// Write the file contents to the response
|
|
|
|
c.Writer.Write(db)
|
|
|
|
}
|
2023-04-18 21:04:06 +03:00
|
|
|
|
2023-05-05 21:19:42 +03:00
|
|
|
func (a *ServerController) importDB(c *gin.Context) {
|
|
|
|
// Get the file from the request body
|
|
|
|
file, _, err := c.Request.FormFile("db")
|
|
|
|
if err != nil {
|
|
|
|
jsonMsg(c, "Error reading db file", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
// Import it
|
|
|
|
err = a.serverService.ImportDB(file)
|
|
|
|
if err != nil {
|
|
|
|
jsonMsg(c, "", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
a.lastGetStatusTime = time.Now()
|
|
|
|
jsonObj(c, "Import DB", nil)
|
|
|
|
}
|
|
|
|
|
2023-04-18 21:04:06 +03:00
|
|
|
func (a *ServerController) getNewX25519Cert(c *gin.Context) {
|
|
|
|
cert, err := a.serverService.GetNewX25519Cert()
|
|
|
|
if err != nil {
|
|
|
|
jsonMsg(c, "get x25519 certificate", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
jsonObj(c, cert, nil)
|
|
|
|
}
|