355 lines
9.0 KiB
Go
355 lines
9.0 KiB
Go
package admin
|
||
|
||
import (
|
||
"errors"
|
||
"net/http"
|
||
"runtime"
|
||
|
||
"git.kingecg.top/kingecg/gohttpd/handler"
|
||
"git.kingecg.top/kingecg/gohttpd/model"
|
||
"git.kingecg.top/kingecg/gohttpd/server"
|
||
"github.com/gin-gonic/gin" // 添加Gin框架导入
|
||
)
|
||
|
||
type RunStatus struct {
|
||
Goroutines int `json:"goroutines"`
|
||
}
|
||
|
||
func about(c *gin.Context) {
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write([]byte("About Page"))
|
||
|
||
}
|
||
|
||
func setConfig(c *gin.Context) {
|
||
ctx := c.Request.Context()
|
||
ctxData := ctx.Value(server.RequestCtxKey("data")).(map[string]interface{})
|
||
data, ok := ctxData["data"]
|
||
if !ok {
|
||
c.Writer.WriteHeader(http.StatusBadRequest)
|
||
return
|
||
}
|
||
t, ok := data.(model.HttpServerConfig)
|
||
if ok {
|
||
if t.Name == "admin" {
|
||
c.Writer.WriteHeader(http.StatusForbidden)
|
||
resp := server.NewErrorResult(errors.New("不能通过api设置管理服务器"))
|
||
c.Writer.Write(resp)
|
||
return
|
||
}
|
||
er := model.SetServerConfig(&t)
|
||
if er != nil {
|
||
c.Writer.WriteHeader(http.StatusBadRequest)
|
||
c.Writer.Write(server.NewErrorResult(er))
|
||
return
|
||
}
|
||
} else {
|
||
tcpProxy, ok := data.(model.TcpProxyConfig)
|
||
if ok {
|
||
er := model.SetTcpProxyConfig(&tcpProxy)
|
||
if er != nil {
|
||
c.Writer.WriteHeader(http.StatusBadRequest)
|
||
c.Writer.Write(server.NewErrorResult(er))
|
||
return
|
||
}
|
||
}
|
||
}
|
||
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult(t))
|
||
}
|
||
|
||
func getServerConfigure(c *gin.Context) {
|
||
// ctx := c.Request.Context()
|
||
// get url param
|
||
// g.
|
||
//ctxData := ctx.Value(server.RequestCtxKey("data")).(map[string]interface{})
|
||
id := c.Param("name")
|
||
if id != "" {
|
||
if id == "admin" {
|
||
c.Writer.WriteHeader(http.StatusForbidden)
|
||
resp := server.NewErrorResult(errors.New("不能通过api获取管理服务器配置信息"))
|
||
c.Writer.Write(resp)
|
||
return
|
||
}
|
||
data := model.GetServerConfig(id)
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult(data))
|
||
} else {
|
||
http.NotFound(c.Writer, c.Request)
|
||
}
|
||
}
|
||
func listConfig(c *gin.Context) {
|
||
data := model.GetConfig().Servers
|
||
// c.JSON(http.StatusOK, server.NewSuccessResult(data))
|
||
|
||
c.JSON(http.StatusOK, server.NewResultObj(data))
|
||
}
|
||
|
||
func getStatus(c *gin.Context) {
|
||
runtime := runtime.NumGoroutine()
|
||
ret := RunStatus{
|
||
Goroutines: runtime,
|
||
}
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult(ret))
|
||
}
|
||
|
||
func stop(c *gin.Context) {
|
||
// ctx := c.Request.Context()
|
||
// ctxData := ctx.Value(server.RequestCtxKey("data")).(map[string]interface{})
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
serverConf := model.GetServerConfig(name)
|
||
if serverConf == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("server not found")))
|
||
return
|
||
}
|
||
server.StopServer(name, serverConf.Port)
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
data := "stopped"
|
||
c.Writer.Write(server.NewSuccessResult(data))
|
||
return
|
||
}
|
||
http.NotFound(c.Writer, c.Request)
|
||
}
|
||
|
||
func start(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
serverConf := model.GetServerConfig(name)
|
||
if serverConf == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("server not found")))
|
||
return
|
||
}
|
||
server.StartServer(name, serverConf.Port)
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
data := "started"
|
||
c.Writer.Write(server.NewSuccessResult(data))
|
||
return
|
||
}
|
||
}
|
||
|
||
func restart(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
serverConf := model.GetServerConfig(name)
|
||
if serverConf == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("server not found")))
|
||
return
|
||
}
|
||
// 先停止再启动
|
||
server.StopServer(name, serverConf.Port)
|
||
server.StartServer(name, serverConf.Port)
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
data := "restarted"
|
||
c.Writer.Write(server.NewSuccessResult(data))
|
||
return
|
||
}
|
||
}
|
||
|
||
func deleteServer(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
serverConf := model.GetServerConfig(name)
|
||
if serverConf == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("server not found")))
|
||
return
|
||
}
|
||
// 先停止服务器
|
||
server.StopServer(name, serverConf.Port)
|
||
// 从配置中删除
|
||
err := model.DeleteServerConfig(name)
|
||
if err != nil {
|
||
c.Writer.WriteHeader(http.StatusInternalServerError)
|
||
c.Writer.Write(server.NewErrorResult(err))
|
||
return
|
||
}
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult("deleted"))
|
||
return
|
||
}
|
||
}
|
||
|
||
// TCP代理相关API
|
||
|
||
func listTcpProxy(c *gin.Context) {
|
||
data := model.GetConfig().TcpProxys
|
||
c.JSON(http.StatusOK, server.NewResultObj(data))
|
||
}
|
||
|
||
func setTcpProxy(c *gin.Context) {
|
||
ctx := c.Request.Context()
|
||
ctxData := ctx.Value(server.RequestCtxKey("data")).(map[string]interface{})
|
||
data, ok := ctxData["data"]
|
||
if !ok {
|
||
c.Writer.WriteHeader(http.StatusBadRequest)
|
||
return
|
||
}
|
||
tcpProxy, ok := data.(model.TcpProxyConfig)
|
||
if !ok {
|
||
c.Writer.WriteHeader(http.StatusBadRequest)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("invalid tcp proxy config")))
|
||
return
|
||
}
|
||
er := model.SetTcpProxyConfig(&tcpProxy)
|
||
if er != nil {
|
||
c.Writer.WriteHeader(http.StatusBadRequest)
|
||
c.Writer.Write(server.NewErrorResult(er))
|
||
return
|
||
}
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult(tcpProxy))
|
||
}
|
||
|
||
func getTcpProxy(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
data := model.GetTcpProxyConfig(name)
|
||
if data == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found")))
|
||
return
|
||
}
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult(data))
|
||
return
|
||
}
|
||
http.NotFound(c.Writer, c.Request)
|
||
}
|
||
|
||
func deleteTcpProxy(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
tcpProxy := model.GetTcpProxyConfig(name)
|
||
if tcpProxy == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found")))
|
||
return
|
||
}
|
||
// 如果正在运行,先停止
|
||
if proxy, ok := server.TcpProxyManager[name]; ok {
|
||
proxy.Stop()
|
||
delete(server.TcpProxyManager, name)
|
||
}
|
||
// 从配置中删除
|
||
err := model.DeleteTcpProxyConfig(name)
|
||
if err != nil {
|
||
c.Writer.WriteHeader(http.StatusInternalServerError)
|
||
c.Writer.Write(server.NewErrorResult(err))
|
||
return
|
||
}
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult("deleted"))
|
||
return
|
||
}
|
||
http.NotFound(c.Writer, c.Request)
|
||
}
|
||
|
||
func startTcpProxy(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
tcpProxy := model.GetTcpProxyConfig(name)
|
||
if tcpProxy == nil {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found")))
|
||
return
|
||
}
|
||
if _, ok := server.TcpProxyManager[name]; ok {
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult("already started"))
|
||
return
|
||
}
|
||
proxy := handler.NewTcpProxyHandler(tcpProxy.Name, tcpProxy.Listen, tcpProxy.Target)
|
||
server.AddTcpProxy(name, proxy)
|
||
proxy.Start()
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult("started"))
|
||
return
|
||
}
|
||
http.NotFound(c.Writer, c.Request)
|
||
}
|
||
|
||
func stopTcpProxy(c *gin.Context) {
|
||
name := c.Param("name")
|
||
if name != "" {
|
||
proxy, ok := server.TcpProxyManager[name]
|
||
if !ok {
|
||
c.Writer.WriteHeader(http.StatusNotFound)
|
||
c.Writer.Write(server.NewErrorResult(errors.New("tcp proxy not found or not running")))
|
||
return
|
||
}
|
||
proxy.Stop()
|
||
delete(server.TcpProxyManager, name)
|
||
c.Writer.WriteHeader(http.StatusOK)
|
||
c.Writer.Write(server.NewSuccessResult("stopped"))
|
||
return
|
||
}
|
||
http.NotFound(c.Writer, c.Request)
|
||
}
|
||
|
||
var AdminServerMux *gin.Engine
|
||
|
||
// InitAdminApi 初始化管理API路由
|
||
// 参数:
|
||
//
|
||
// conf: 指向HttpServerConfig的指针,包含服务器配置信息。
|
||
//
|
||
// 返回值:
|
||
//
|
||
// 无直接返回值,初始化全局AdminServerMux变量。
|
||
func InitAdminApi(conf *model.HttpServerConfig) {
|
||
// 创建Gin路由器实例
|
||
router := gin.Default()
|
||
|
||
// 根据认证类型添加中间件
|
||
if conf.AuthType == "jwt" {
|
||
router.Use(jwtAuth) // 使用JWT认证中间件
|
||
} else if conf.AuthType == "basic" {
|
||
router.Use(ginBashiAuth) // 使用基础认证中间件
|
||
}
|
||
|
||
// 注册路由处理函数
|
||
api := router.Group("/")
|
||
{
|
||
api.GET("about", about)
|
||
|
||
configGroup := api.Group("config")
|
||
{
|
||
configGroup.POST("", setConfig)
|
||
configGroup.GET("", listConfig)
|
||
configGroup.GET(":name", getServerConfigure)
|
||
}
|
||
|
||
api.GET("status", getStatus)
|
||
|
||
serverGroup := api.Group("server")
|
||
{
|
||
serverGroup.POST("stop/:name", stop)
|
||
serverGroup.POST("start/:name", start)
|
||
serverGroup.POST("restart/:name", restart)
|
||
serverGroup.DELETE(":name", deleteServer)
|
||
}
|
||
|
||
// TCP代理路由
|
||
tcpGroup := api.Group("tcp")
|
||
{
|
||
tcpGroup.GET("", listTcpProxy)
|
||
tcpGroup.POST("", setTcpProxy)
|
||
tcpGroup.GET(":name", getTcpProxy)
|
||
tcpGroup.DELETE(":name", deleteTcpProxy)
|
||
tcpGroup.POST("start/:name", startTcpProxy)
|
||
tcpGroup.POST("stop/:name", stopTcpProxy)
|
||
}
|
||
|
||
api.POST("login", login)
|
||
}
|
||
|
||
// 将路由器赋值给全局变量
|
||
AdminServerMux = router
|
||
}
|