feat: add openconnect
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
// "github.com/engigu/baihu-panel/internal/controllers"
|
||||
"github.com/engigu/baihu-panel/internal/middleware"
|
||||
"runtime"
|
||||
|
||||
"github.com/engigu/baihu-panel/internal/middleware"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
@@ -13,6 +13,12 @@ func initPublicAPIRoutes(api *gin.RouterGroup, c *Controllers) {
|
||||
ctx.JSON(200, gin.H{"message": "pong"})
|
||||
})
|
||||
|
||||
api.GET("/debug/goroutines", func(ctx *gin.Context) {
|
||||
buf := make([]byte, 1024*1024)
|
||||
n := runtime.Stack(buf, true)
|
||||
ctx.Data(200, "text/plain; charset=utf-8", buf[:n])
|
||||
})
|
||||
|
||||
// Authentication routes (无需认证)
|
||||
auth := api.Group("/auth")
|
||||
{
|
||||
@@ -24,6 +30,11 @@ func initPublicAPIRoutes(api *gin.RouterGroup, c *Controllers) {
|
||||
// 公开的站点设置(无需认证)
|
||||
api.GET("/settings/public", c.Settings.GetPublicSiteSettings)
|
||||
|
||||
// 隧道模式 (被控端反向连入,使用独立 Token 做 WebSocket 鉴权)
|
||||
api.GET("/interconnect/tunnel", c.Interconnect.HandleTunnel)
|
||||
// 子节点主动上报监控数据 (无中间件鉴权,内部鉴权)
|
||||
api.POST("/interconnect/report", c.Interconnect.ReportMonitorData)
|
||||
|
||||
// 内部使用的 API(仅限本地调用,无需 Bearer 认证)
|
||||
internalAPI := api.Group("/internal")
|
||||
internalAPI.Use(middleware.LocalhostOnly())
|
||||
@@ -66,6 +77,7 @@ func initAuthorizedAPIRoutes(api *gin.RouterGroup, c *Controllers) {
|
||||
registerSystemWSRoutes(adminOnly, c)
|
||||
registerWebUIRoutes(adminOnly, c)
|
||||
registerMonitorRoutes(adminOnly, c)
|
||||
registerInterconnectRoutes(adminOnly, c)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +95,7 @@ func registerTaskRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
tasks.POST("", c.Task.CreateTask)
|
||||
tasks.GET("", c.Task.GetTasks)
|
||||
tasks.GET("/:id", c.Task.GetTask)
|
||||
tasks.POST("/bulk_save", c.Task.BulkSaveTask)
|
||||
tasks.PUT("/:id", c.Task.UpdateTask)
|
||||
tasks.DELETE("/:id", c.Task.DeleteTask)
|
||||
tasks.POST("/batch-delete", c.Task.BatchDeleteTasks)
|
||||
@@ -273,7 +286,7 @@ func registerMonitorRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
monitor := g.Group("/monitor")
|
||||
{
|
||||
monitor.GET("", c.Monitor.GetSystemMonitor)
|
||||
monitor.GET("/ws", c.Monitor.MonitorWS)
|
||||
monitor.GET("/sse", c.Monitor.MonitorSSE)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,3 +311,22 @@ func registerWebUIRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
webuiGroup.DELETE("/:name", c.WebUI.DeleteWebUI)
|
||||
}
|
||||
}
|
||||
|
||||
func registerInterconnectRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
interconnect := g.Group("/interconnect")
|
||||
{
|
||||
interconnect.GET("/nodes", c.Interconnect.GetNodes)
|
||||
interconnect.POST("/nodes", c.Interconnect.CreateNode)
|
||||
interconnect.PUT("/nodes/:id", c.Interconnect.UpdateNode)
|
||||
interconnect.DELETE("/nodes/:id", c.Interconnect.DeleteNode)
|
||||
interconnect.GET("/nodes/:id/status", c.Interconnect.GetNodeStatus)
|
||||
interconnect.POST("/sync/script", c.Interconnect.SyncScript)
|
||||
interconnect.POST("/sync/env", c.Interconnect.SyncEnv)
|
||||
interconnect.POST("/sync/task", c.Interconnect.SyncTask)
|
||||
|
||||
interconnect.GET("/child/status", c.Interconnect.GetChildStatus)
|
||||
|
||||
// 代理模式 (面板穿越)
|
||||
interconnect.Any("/proxy/:node_id/*path", c.Interconnect.ProxyRequest)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,13 @@ package router
|
||||
|
||||
import (
|
||||
// "fmt"
|
||||
"time"
|
||||
|
||||
// "github.com/engigu/baihu-panel/internal/constant"
|
||||
"github.com/engigu/baihu-panel/internal/eventbus"
|
||||
// "github.com/engigu/baihu-panel/internal/logger"
|
||||
// "github.com/engigu/baihu-panel/internal/models"
|
||||
"github.com/engigu/baihu-panel/internal/services"
|
||||
"github.com/engigu/baihu-panel/internal/executor"
|
||||
)
|
||||
|
||||
func setupEventHandlers(subscribers ...eventbus.Subscriber) {
|
||||
@@ -21,12 +21,8 @@ func setupEventHandlers(subscribers ...eventbus.Subscriber) {
|
||||
}
|
||||
|
||||
func startAppLogCleanup(appLogSvc *services.AppLogService) {
|
||||
// 初始化时执行一次清理
|
||||
appLogSvc.CleanUp()
|
||||
|
||||
// 定期清理(每隔1小时执行一次巡检)
|
||||
ticker := time.NewTicker(1 * time.Hour)
|
||||
for range ticker.C {
|
||||
// 注册到内部系统定时器(并立即执行第一次)
|
||||
executor.GetSysCron().AddJobWithRun("@every 1h", func() {
|
||||
appLogSvc.CleanUp()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ func RegisterControllers() *Controllers {
|
||||
// 创建任务执行服务(需要依赖注入)
|
||||
notifyService := services.NewNotificationService()
|
||||
appLogService := services.NewAppLogService()
|
||||
interconnectService := services.NewInterconnectService()
|
||||
|
||||
// 清理 task 运行状态的任务可以直接由 executorService 承担或在此处通过 Database 直接清理
|
||||
// 简单期间,我们使用一个新方法 tasks.CleanupRunningTasks() 或者让 executorService 启动时清理
|
||||
@@ -42,7 +43,7 @@ func RegisterControllers() *Controllers {
|
||||
|
||||
// 初始化所有关注系统总线的服务
|
||||
setupEventHandlers(appLogService, notifyService, loginLogService, systemWSManager)
|
||||
go startAppLogCleanup(appLogService)
|
||||
startAppLogCleanup(appLogService)
|
||||
|
||||
// 初始化并返回控制器
|
||||
return &Controllers{
|
||||
@@ -65,6 +66,7 @@ func RegisterControllers() *Controllers {
|
||||
SystemWS: controllers.NewSystemWSController(),
|
||||
WebUI: controllers.NewWebUIController(services.NewWebUIService(settingsService)),
|
||||
Monitor: controllers.NewMonitorController(executorService),
|
||||
Interconnect: controllers.NewInterconnectController(interconnectService),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ type Controllers struct {
|
||||
SystemWS *controllers.SystemWSController
|
||||
WebUI *controllers.WebUIController
|
||||
Monitor *controllers.MonitorController
|
||||
Interconnect *controllers.InterconnectController
|
||||
}
|
||||
|
||||
func Setup(c *Controllers) *gin.Engine {
|
||||
@@ -40,6 +41,7 @@ func Setup(c *Controllers) *gin.Engine {
|
||||
}
|
||||
router := gin.New()
|
||||
router.Use(middleware.GinLogger(), middleware.GinRecovery())
|
||||
router.Use(middleware.TravelProxyMiddleware())
|
||||
|
||||
// 获取 URL 前缀
|
||||
cfg := services.GetConfig()
|
||||
|
||||
Reference in New Issue
Block a user