151 lines
3.5 KiB
Go
151 lines
3.5 KiB
Go
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
|
||
}
|