mirror of
https://github.com/gazer-x/komari.git
synced 2026-06-22 00:05:52 +08:00
90aad4b48a
- Moved API route registration to dedicated init files for better organization. - Introduced event listeners for server initialization to dynamically register routes. - Removed redundant configuration loading in routers.go. - Added new API routes for various functionalities including client management, admin tasks, and notifications. - Implemented a standardized response structure for API responses. - Established WebSocket connections for terminal sessions and improved session management. - Created a new database initialization for default admin account creation. - Enhanced gRPC server setup for Nezha compatibility with dynamic configuration updates.
200 lines
7.0 KiB
Go
200 lines
7.0 KiB
Go
package api_v1
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gookit/event"
|
|
"github.com/komari-monitor/komari/internal/api_v1/admin"
|
|
"github.com/komari-monitor/komari/internal/api_v1/admin/clipboard"
|
|
log_api "github.com/komari-monitor/komari/internal/api_v1/admin/log"
|
|
"github.com/komari-monitor/komari/internal/api_v1/admin/notification"
|
|
"github.com/komari-monitor/komari/internal/api_v1/admin/test"
|
|
"github.com/komari-monitor/komari/internal/api_v1/admin/update"
|
|
"github.com/komari-monitor/komari/internal/api_v1/client"
|
|
"github.com/komari-monitor/komari/internal/api_v1/record"
|
|
"github.com/komari-monitor/komari/internal/api_v1/resp"
|
|
"github.com/komari-monitor/komari/internal/api_v1/task"
|
|
"github.com/komari-monitor/komari/internal/api_v1/terminal"
|
|
"github.com/komari-monitor/komari/internal/conf"
|
|
"github.com/komari-monitor/komari/internal/eventType"
|
|
)
|
|
|
|
func init() {
|
|
event.On(eventType.ServerInitializeStart, event.ListenerFunc(func(e event.Event) error {
|
|
r := e.Get("engine").(*gin.Engine)
|
|
config, _ := conf.GetWithV1Format()
|
|
LoadApiV1Routes(r, config)
|
|
return nil
|
|
}), event.Normal)
|
|
|
|
event.On(eventType.SchedulerEveryMinute, event.ListenerFunc(func(e event.Event) error {
|
|
SaveClientReportToDB()
|
|
return nil
|
|
}))
|
|
}
|
|
|
|
func LoadApiV1Routes(r *gin.Engine, conf conf.V1Struct) {
|
|
r.Use(func(c *gin.Context) {
|
|
if len(c.Request.URL.Path) >= 4 && c.Request.URL.Path[:4] == "/api" {
|
|
c.Header("Cache-Control", "no-store")
|
|
}
|
|
c.Next()
|
|
})
|
|
|
|
r.Use(PrivateSiteMiddleware())
|
|
|
|
r.Any("/ping", func(c *gin.Context) {
|
|
c.String(200, "pong")
|
|
})
|
|
// #region 公开路由
|
|
r.POST("/api/login", Login)
|
|
r.GET("/api/me", GetMe)
|
|
r.GET("/api/clients", GetClients)
|
|
r.GET("/api/nodes", GetNodesInformation)
|
|
r.GET("/api/public", GetPublicSettings)
|
|
r.GET("/api/oauth", OAuth)
|
|
r.GET("/api/oauth_callback", OAuthCallback)
|
|
r.GET("/api/logout", Logout)
|
|
r.GET("/api/version", resp.GetVersion)
|
|
r.GET("/api/recent/:uuid", GetClientRecentRecords)
|
|
r.GET("/api/records/load", record.GetRecordsByUUID)
|
|
r.GET("/api/records/ping", record.GetPingRecords)
|
|
r.GET("/api/task/ping", task.GetPublicPingTasks)
|
|
|
|
// #region Agent
|
|
r.POST("/api/clients/register", client.RegisterClient)
|
|
tokenAuthrized := r.Group("/api/clients", TokenAuthMiddleware())
|
|
{
|
|
tokenAuthrized.GET("/report", client.WebSocketReport) // websocket
|
|
tokenAuthrized.POST("/uploadBasicInfo", client.UploadBasicInfo)
|
|
tokenAuthrized.POST("/report", client.UploadReport)
|
|
tokenAuthrized.GET("/terminal", client.EstablishConnection)
|
|
tokenAuthrized.POST("/task/result", client.TaskResult)
|
|
}
|
|
// #region 管理员
|
|
adminAuthrized := r.Group("/api/admin", AdminAuthMiddleware())
|
|
{
|
|
adminAuthrized.GET("/download/backup", admin.DownloadBackup)
|
|
adminAuthrized.POST("/upload/backup", admin.UploadBackup)
|
|
// test
|
|
testGroup := adminAuthrized.Group("/test")
|
|
{
|
|
testGroup.GET("/geoip", test.TestGeoIp)
|
|
testGroup.POST("/sendMessage", test.TestSendMessage)
|
|
}
|
|
// update
|
|
updateGroup := adminAuthrized.Group("/update")
|
|
{
|
|
updateGroup.POST("/mmdb", update.UpdateMmdbGeoIP)
|
|
updateGroup.POST("/user", update.UpdateUser)
|
|
updateGroup.PUT("/favicon", update.UploadFavicon)
|
|
updateGroup.POST("/favicon", update.DeleteFavicon)
|
|
}
|
|
// tasks
|
|
taskGroup := adminAuthrized.Group("/task")
|
|
{
|
|
taskGroup.GET("/all", admin.GetTasks)
|
|
taskGroup.POST("/exec", admin.Exec)
|
|
taskGroup.GET("/:task_id", admin.GetTaskById)
|
|
taskGroup.GET("/:task_id/result", admin.GetTaskResultsByTaskId)
|
|
taskGroup.GET("/:task_id/result/:uuid", admin.GetSpecificTaskResult)
|
|
taskGroup.GET("/client/:uuid", admin.GetTasksByClientId)
|
|
}
|
|
// settings
|
|
settingsGroup := adminAuthrized.Group("/settings")
|
|
{
|
|
settingsGroup.GET("/", admin.GetSettings)
|
|
settingsGroup.POST("/", admin.EditSettings)
|
|
settingsGroup.POST("/oidc", admin.SetOidcProvider)
|
|
settingsGroup.GET("/oidc", admin.GetOidcProvider)
|
|
settingsGroup.POST("/message-sender", admin.SetMessageSenderProvider)
|
|
settingsGroup.GET("/message-sender", admin.GetMessageSenderProvider)
|
|
}
|
|
// themes
|
|
themeGroup := adminAuthrized.Group("/theme")
|
|
{
|
|
themeGroup.PUT("/upload", admin.UploadTheme)
|
|
themeGroup.GET("/list", admin.ListThemes)
|
|
themeGroup.POST("/delete", admin.DeleteTheme)
|
|
themeGroup.GET("/set", admin.SetTheme)
|
|
themeGroup.POST("/update", admin.UpdateTheme)
|
|
themeGroup.POST("/settings", admin.UpdateThemeSettings)
|
|
}
|
|
// clients
|
|
clientGroup := adminAuthrized.Group("/client")
|
|
{
|
|
clientGroup.POST("/add", admin.AddClient)
|
|
clientGroup.GET("/list", admin.ListClients)
|
|
clientGroup.GET("/:uuid", admin.GetClient)
|
|
clientGroup.POST("/:uuid/edit", admin.EditClient)
|
|
clientGroup.POST("/:uuid/remove", admin.RemoveClient)
|
|
clientGroup.GET("/:uuid/token", admin.GetClientToken)
|
|
clientGroup.POST("/order", admin.OrderWeight)
|
|
// client terminal
|
|
clientGroup.GET("/:uuid/terminal", terminal.RequestTerminal)
|
|
}
|
|
|
|
// records
|
|
recordGroup := adminAuthrized.Group("/record")
|
|
{
|
|
recordGroup.POST("/clear", admin.ClearRecord)
|
|
recordGroup.POST("/clear/all", admin.ClearAllRecords)
|
|
}
|
|
// oauth2
|
|
oauth2Group := adminAuthrized.Group("/oauth2")
|
|
{
|
|
oauth2Group.GET("/bind", admin.BindingExternalAccount)
|
|
oauth2Group.POST("/unbind", admin.UnbindExternalAccount)
|
|
}
|
|
sessionGroup := adminAuthrized.Group("/session")
|
|
{
|
|
sessionGroup.GET("/get", admin.GetSessions)
|
|
sessionGroup.POST("/remove", admin.DeleteSession)
|
|
sessionGroup.POST("/remove/all", admin.DeleteAllSession)
|
|
}
|
|
two_factorGroup := adminAuthrized.Group("/2fa")
|
|
{
|
|
two_factorGroup.GET("/generate", admin.Generate2FA)
|
|
two_factorGroup.POST("/enable", admin.Enable2FA)
|
|
two_factorGroup.POST("/disable", admin.Disable2FA)
|
|
}
|
|
adminAuthrized.GET("/logs", log_api.GetLogs)
|
|
|
|
// clipboard
|
|
clipboardGroup := adminAuthrized.Group("/clipboard")
|
|
{
|
|
clipboardGroup.GET("/:id", clipboard.GetClipboard)
|
|
clipboardGroup.GET("", clipboard.ListClipboard)
|
|
clipboardGroup.POST("", clipboard.CreateClipboard)
|
|
clipboardGroup.POST("/:id", clipboard.UpdateClipboard)
|
|
clipboardGroup.POST("/remove", clipboard.BatchDeleteClipboard)
|
|
clipboardGroup.POST("/:id/remove", clipboard.DeleteClipboard)
|
|
}
|
|
|
|
notificationGroup := adminAuthrized.Group("/notification")
|
|
{
|
|
// offline notifications
|
|
notificationGroup.GET("/offline", notification.ListOfflineNotifications)
|
|
notificationGroup.POST("/offline/edit", notification.EditOfflineNotification)
|
|
notificationGroup.POST("/offline/enable", notification.EnableOfflineNotification)
|
|
notificationGroup.POST("/offline/disable", notification.DisableOfflineNotification)
|
|
loadAlertGroup := notificationGroup.Group("/load")
|
|
{
|
|
loadAlertGroup.GET("/", notification.GetAllLoadNotifications)
|
|
loadAlertGroup.POST("/add", notification.AddLoadNotification)
|
|
loadAlertGroup.POST("/delete", notification.DeleteLoadNotification)
|
|
loadAlertGroup.POST("/edit", notification.EditLoadNotification)
|
|
}
|
|
}
|
|
|
|
pingTaskGroup := adminAuthrized.Group("/ping")
|
|
{
|
|
pingTaskGroup.GET("/", admin.GetAllPingTasks)
|
|
pingTaskGroup.POST("/add", admin.AddPingTask)
|
|
pingTaskGroup.POST("/delete", admin.DeletePingTask)
|
|
pingTaskGroup.POST("/edit", admin.EditPingTask)
|
|
|
|
}
|
|
|
|
}
|
|
}
|