gohttp/admin/admin.go

151 lines
3.5 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.pyer.club/kingecg/gohttpd/model"
"git.pyer.club/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 := data.(model.HttpServerConfig)
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
}
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 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)
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)
server.StartServer(name, serverConf.Port)
c.Writer.WriteHeader(http.StatusOK)
data := "started"
c.Writer.Write(server.NewSuccessResult(data))
return
}
}
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(":name", getServerConfigure)
}
api.GET("status", getStatus)
serverGroup := api.Group("server")
{
serverGroup.POST("stop/:name", stop)
serverGroup.POST("start/:name", start)
}
api.POST("login", login)
}
// 将路由器赋值给全局变量
AdminServerMux = router
}