gohttp/admin/admin.go

355 lines
9.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}