19ffc80130
Маршруты, операциями которых продукт не владеет, отвечали заглушкой "managed by orchestrator" или пустым списком: POST /hysteria2ChangeVersion GET /listRelease POST /config/updateHysteria2Config POST /config/importHysteria2Config POST /config/restartServer POST /config/uploadCertFile GET /config/hysteria2AcmePath (не имел потребителя вовсе) Они удалены, а не оставлены заглушками. Причины две. API-контракт не должен обещать updater, которого у продукта принципиально нет: маршрут, всегда возвращающий отказ, вводит в заблуждение. И это лишняя attack surface плюс технический мусор от прежней архитектуры. Вместе с маршрутами убраны мёртвые сервисы (StartHysteria2, StopHysteria2, RestartHysteria2, SetHysteria2Config, UpdateHysteria2Config, GetAuthHttpUrl, Hysteria2AcmePath), неиспользуемые типы и клиентские функции фронтенда. Отдельно - кнопки. "Перезапустить панель" и загрузка сертификатов обращались к заглушкам, то есть гарантированно возвращали ошибку. Кнопка, которая всегда падает, - не точка расширения на будущее, а дефект UX. Удалены вместе со строками i18n. Конфигурация Hysteria остаётся доступной панели на чтение и на выгрузку: getHysteria2Config и exportHysteria2Config.
70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package router
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"hy2xs-admin/dao"
|
|
"hy2xs-admin/frontend"
|
|
"hy2xs-admin/middleware"
|
|
"hy2xs-admin/model/constant"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func Router(router *gin.Engine, huiWebContext *string) {
|
|
router.GET("/healthz", func(c *gin.Context) {
|
|
sqliteReady := dao.IsSqliteReady()
|
|
configReadable := false
|
|
if stat, err := os.Stat(constant.Hysteria2ConfigPath); err == nil {
|
|
configReadable = !stat.IsDir()
|
|
}
|
|
|
|
if !sqliteReady || !configReadable {
|
|
c.JSON(503, gin.H{
|
|
"ok": false,
|
|
"service": "hy2xs-admin",
|
|
"sqlite_ready": sqliteReady,
|
|
"config_readable": configReadable,
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(200, gin.H{
|
|
"ok": true,
|
|
"service": "hy2xs-admin",
|
|
"sqlite_ready": true,
|
|
"config_readable": true,
|
|
})
|
|
})
|
|
|
|
relativePath := "/"
|
|
if huiWebContext != nil && strings.HasPrefix(*huiWebContext, "/") {
|
|
relativePath = *huiWebContext
|
|
}
|
|
|
|
frontend.InitFrontend(router, relativePath)
|
|
|
|
globalGroup := router.Group(relativePath)
|
|
|
|
machineApi := globalGroup.Group("/hui")
|
|
machineApi.Use(middleware.LocalOnlyHandler(), middleware.MachineAuthHandler(), middleware.LogHandler())
|
|
initHysteria2MachineAuthRouter(machineApi)
|
|
|
|
authApi := globalGroup.Group("/hui")
|
|
authApi.Use(middleware.FilterHandler(), middleware.LogHandler(), middleware.RateLimiterHandler())
|
|
initAuthRouter(authApi)
|
|
|
|
huiAdminApi := globalGroup.Group("/hui")
|
|
huiAdminApi.Use(
|
|
middleware.FilterHandler(),
|
|
middleware.LogHandler(),
|
|
middleware.RateLimiterHandler(),
|
|
middleware.JWTHandler(),
|
|
middleware.AdminHandler(),
|
|
)
|
|
initAdminRouter(huiAdminApi)
|
|
initDashboardRouter(huiAdminApi)
|
|
initPeerRouter(huiAdminApi)
|
|
initConfigRouter(huiAdminApi)
|
|
initLogRouter(huiAdminApi)
|
|
}
|