diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 875c444..46605fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -101,7 +101,7 @@ jobs: fi VERSION="${{ github.sha }}" VERSION_HASH="${{ github.sha }}" - go build -trimpath -ldflags="-s -w -X github.com/komari-monitor/komari/utils.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/utils.VersionHash=${VERSION_HASH}" -o $BINARY_NAME + go build -trimpath -ldflags="-s -w -X github.com/komari-monitor/komari/internal/version.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/internal/version.VersionHash=${VERSION_HASH}" -o $BINARY_NAME - name: Upload binary as artifact uses: actions/upload-artifact@v4 diff --git a/.github/workflows/development.yml b/.github/workflows/development.yml index 973d050..65d9c8a 100644 --- a/.github/workflows/development.yml +++ b/.github/workflows/development.yml @@ -40,7 +40,7 @@ jobs: GOARCH: amd64 run: | VERSION_SHA="${{ github.sha }}" - go build -ldflags "-X github.com/komari-monitor/komari/utils.CurrentVersion=dev -X github.com/komari-monitor/komari/utils.VersionHash=${VERSION_SHA}" -o komari . + go build -ldflags "-X github.com/komari-monitor/komari/internal/version.CurrentVersion=dev -X github.com/komari-monitor/komari/internal/version.VersionHash=${VERSION_SHA}" -o komari . - name: Upload binary as artifact uses: actions/upload-artifact@v4 diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 8cb82ec..97641c5 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -55,7 +55,7 @@ jobs: run: | VERSION="${{ github.ref_name }}" VERSION_HASH="${{ github.sha }}" - LDFLAGS="-s -w -X github.com/komari-monitor/komari/utils.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/utils.VersionHash=${VERSION_HASH}" + LDFLAGS="-s -w -X github.com/komari-monitor/komari/internal/version.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/internal/version.VersionHash=${VERSION_HASH}" echo "Building for linux/amd64..." GOARCH=amd64 CC="zig cc -target x86_64-linux-musl" go build -trimpath -ldflags="$LDFLAGS" -o komari-linux-amd64 diff --git a/.github/workflows/release-docker.yml b/.github/workflows/release-docker.yml index 088340a..4b99865 100644 --- a/.github/workflows/release-docker.yml +++ b/.github/workflows/release-docker.yml @@ -58,7 +58,7 @@ jobs: run: | VERSION="${{ github.event.release.tag_name }}" VERSION_HASH="${{ github.sha }}" - LDFLAGS="-s -w -X github.com/komari-monitor/komari/utils.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/utils.VersionHash=${VERSION_HASH}" + LDFLAGS="-s -w -X github.com/komari-monitor/komari/internal/version.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/internal/version.VersionHash=${VERSION_HASH}" echo "Building for linux/amd64..." GOARCH=amd64 CC="zig cc -target x86_64-linux-musl" go build -trimpath -ldflags="$LDFLAGS" -o komari-linux-amd64 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 44e1592..e665eb2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,7 +103,7 @@ jobs: fi VERSION="${{ github.event.release.tag_name }}" VERSION_HASH="${{ github.sha }}" # Use commit SHA for hash - go build -trimpath -ldflags="-s -w -X github.com/komari-monitor/komari/utils.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/utils.VersionHash=${VERSION_HASH}" -o $BINARY_NAME + go build -trimpath -ldflags="-s -w -X github.com/komari-monitor/komari/internal/version.CurrentVersion=${VERSION} -X github.com/komari-monitor/komari/internal/version.VersionHash=${VERSION_HASH}" -o $BINARY_NAME - name: Upload binary to release env: diff --git a/cmd/chpasswd.go b/cmd/chpasswd.go index 8573233..c9be203 100644 --- a/cmd/chpasswd.go +++ b/cmd/chpasswd.go @@ -4,9 +4,9 @@ import ( "os" "github.com/komari-monitor/komari/cmd/flags" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "github.com/spf13/cobra" ) diff --git a/cmd/disable2FA.go b/cmd/disable2FA.go index 484bd1c..26d09dc 100644 --- a/cmd/disable2FA.go +++ b/cmd/disable2FA.go @@ -3,8 +3,8 @@ package cmd import ( "os" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "github.com/spf13/cobra" "gorm.io/gorm" ) diff --git a/cmd/nezha_compat.go b/cmd/nezha_compat.go index dd00c69..12c4eb8 100644 --- a/cmd/nezha_compat.go +++ b/cmd/nezha_compat.go @@ -11,17 +11,17 @@ import ( "sync" "time" - apiClient "github.com/komari-monitor/komari/api/client" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/geoip" - "github.com/komari-monitor/komari/utils/notifier" - "github.com/komari-monitor/komari/ws" + apiClient "github.com/komari-monitor/komari/internal/api_v1/client" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/geoip" + "github.com/komari-monitor/komari/internal/notifier" + "github.com/komari-monitor/komari/internal/ws" - "github.com/komari-monitor/komari/compat/nezha/proto" + "github.com/komari-monitor/komari/internal/nezha/proto" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" diff --git a/cmd/permitPasswordLogin.go b/cmd/permitPasswordLogin.go index 0b50822..c4ad7a3 100644 --- a/cmd/permitPasswordLogin.go +++ b/cmd/permitPasswordLogin.go @@ -3,8 +3,8 @@ package cmd import ( "os" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "github.com/spf13/cobra" "gorm.io/gorm" ) diff --git a/cmd/server.go b/cmd/server.go index 5925663..81eae2c 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -12,42 +12,28 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/api/admin" - "github.com/komari-monitor/komari/api/admin/clipboard" - log_api "github.com/komari-monitor/komari/api/admin/log" - "github.com/komari-monitor/komari/api/admin/notification" - "github.com/komari-monitor/komari/api/admin/test" - "github.com/komari-monitor/komari/api/admin/update" - "github.com/komari-monitor/komari/api/client" - "github.com/komari-monitor/komari/api/jsonRpc" - "github.com/komari-monitor/komari/api/record" - "github.com/komari-monitor/komari/api/task" "github.com/komari-monitor/komari/cmd/flags" - "github.com/komari-monitor/komari/database" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - d_notification "github.com/komari-monitor/komari/database/notification" - "github.com/komari-monitor/komari/database/records" - "github.com/komari-monitor/komari/database/tasks" - "github.com/komari-monitor/komari/public" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/cloudflared" - "github.com/komari-monitor/komari/utils/geoip" - logutil "github.com/komari-monitor/komari/utils/log" - "github.com/komari-monitor/komari/utils/messageSender" - "github.com/komari-monitor/komari/utils/notifier" - "github.com/komari-monitor/komari/utils/oauth" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + d_notification "github.com/komari-monitor/komari/internal/database/notification" + "github.com/komari-monitor/komari/internal/database/records" + "github.com/komari-monitor/komari/internal/database/tasks" + "github.com/komari-monitor/komari/internal/geoip" + logutil "github.com/komari-monitor/komari/internal/log" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/internal/notifier" + "github.com/komari-monitor/komari/internal/oauth" + "github.com/komari-monitor/komari/internal/version" + "github.com/komari-monitor/komari/pkg/cloudflared" + "github.com/komari-monitor/komari/server" "github.com/spf13/cobra" ) -var ( - DynamicCorsEnabled bool = false -) - var ServerCmd = &cobra.Command{ Use: "server", Short: "Start the server", @@ -66,15 +52,12 @@ func init() { func RunServer() { // #region 初始化 - if err := os.MkdirAll("./data", os.ModePerm); err != nil { - log.Fatalf("Failed to create data directory: %v", err) - } - // 创建主题目录 + // 创建目录 if err := os.MkdirAll("./data/theme", os.ModePerm); err != nil { log.Fatalf("Failed to create theme directory: %v", err) } InitDatabase() - if utils.VersionHash != "unknown" { + if version.VersionHash != "unknown" { gin.SetMode(gin.ReleaseMode) } conf, err := config.Get() @@ -84,16 +67,10 @@ func RunServer() { go geoip.InitGeoIp() go DoScheduledWork() go messageSender.Initialize() - // oidcInit go oauth.Initialize() if conf.NezhaCompatEnabled { - go func() { - if err := StartNezhaCompat(conf.NezhaCompatListen); err != nil { - log.Printf("Nezha compat server error: %v", err) - auditlog.EventLog("error", fmt.Sprintf("Nezha compat server error: %v", err)) - } - }() + server.StartNezhaGRPCServer(conf.NezhaCompatListen) } config.Subscribe(func(event config.ConfigEvent) { @@ -112,21 +89,8 @@ func RunServer() { if event.New.NotificationMethod != event.Old.NotificationMethod { messageSender.Initialize() } - if event.New.NezhaCompatEnabled != event.Old.NezhaCompatEnabled { - if event.New.NezhaCompatEnabled { - if err := StartNezhaCompat(event.New.NezhaCompatListen); err != nil { - log.Printf("start Nezha compat server error: %v", err) - auditlog.EventLog("error", fmt.Sprintf("start Nezha compat server error: %v", err)) - } - } else { - if err := StopNezhaCompat(); err != nil { - log.Printf("stop Nezha compat server error: %v", err) - auditlog.EventLog("error", fmt.Sprintf("stop Nezha compat server error: %v", err)) - } - } - } - }) + // 初始化 cloudflared if strings.ToLower(GetEnv("KOMARI_ENABLE_CLOUDFLARED", "false")) == "true" { err := cloudflared.RunCloudflared() // 阻塞,确保cloudflared跑起来 @@ -138,210 +102,7 @@ func RunServer() { r := gin.New() r.Use(logutil.GinLogger()) r.Use(logutil.GinRecovery()) - - // 动态 CORS 中间件 - - DynamicCorsEnabled = conf.AllowCors - config.Subscribe(func(event config.ConfigEvent) { - DynamicCorsEnabled = event.New.AllowCors - if event.New.GeoIpProvider != event.Old.GeoIpProvider { - go geoip.InitGeoIp() - } - if event.New.NotificationMethod != event.Old.NotificationMethod { - go messageSender.Initialize() - } - }) - r.Use(func(c *gin.Context) { - if DynamicCorsEnabled { - c.Header("Access-Control-Allow-Origin", "*") - c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS") - c.Header("Access-Control-Allow-Headers", "Origin, Content-Length, Content-Type, Authorization, Accept, X-CSRF-Token, X-Requested-With, Set-Cookie") - c.Header("Access-Control-Expose-Headers", "Content-Length, Authorization, Set-Cookie") - c.Header("Access-Control-Allow-Credentials", "true") - c.Header("Access-Control-Max-Age", "43200") // 12 hours - if c.Request.Method == "OPTIONS" { - c.AbortWithStatus(204) - return - } - } - c.Next() - }) - - r.Use(api.PrivateSiteMiddleware()) - - 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.Any("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - // #region 公开路由 - r.POST("/api/login", api.Login) - r.GET("/api/me", api.GetMe) - r.GET("/api/clients", api.GetClients) - r.GET("/api/nodes", api.GetNodesInformation) - r.GET("/api/public", api.GetPublicSettings) - r.GET("/api/oauth", api.OAuth) - r.GET("/api/oauth_callback", api.OAuthCallback) - r.GET("/api/logout", api.Logout) - r.GET("/api/version", api.GetVersion) - r.GET("/api/recent/:uuid", api.GetClientRecentRecords) - - r.GET("/api/records/load", record.GetRecordsByUUID) - r.GET("/api/records/ping", record.GetPingRecords) - r.GET("/api/task/ping", task.GetPublicPingTasks) - r.GET("/api/rpc2", jsonRpc.OnRpcRequest) - r.POST("/api/rpc2", jsonRpc.OnRpcRequest) - - // #region Agent - r.POST("/api/clients/register", client.RegisterClient) - tokenAuthrized := r.Group("/api/clients", api.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", api.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", api.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) - - } - - } - - public.Static(r.Group("/"), func(handlers ...gin.HandlerFunc) { - r.NoRoute(handlers...) - }) - // #region 静态文件服务 - public.UpdateIndex(conf) - config.Subscribe(func(event config.ConfigEvent) { - public.UpdateIndex(event.New) - }) + server.Init(r) srv := &http.Server{ Addr: flags.Listen, diff --git a/api/AdminAuthMiddleware.go b/internal/api_v1/AdminAuthMiddleware.go similarity index 91% rename from api/AdminAuthMiddleware.go rename to internal/api_v1/AdminAuthMiddleware.go index c7c363d..735d3ec 100644 --- a/api/AdminAuthMiddleware.go +++ b/internal/api_v1/AdminAuthMiddleware.go @@ -1,9 +1,9 @@ -package api +package api_v1 import ( "net/http" - "github.com/komari-monitor/komari/database/accounts" + "github.com/komari-monitor/komari/internal/database/accounts" "github.com/gin-gonic/gin" ) diff --git a/api/Common.go b/internal/api_v1/Common.go similarity index 90% rename from api/Common.go rename to internal/api_v1/Common.go index 29da551..21b1769 100644 --- a/api/Common.go +++ b/internal/api_v1/Common.go @@ -1,4 +1,4 @@ -package api +package api_v1 import ( "log" @@ -8,15 +8,16 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/common" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/version" "github.com/patrickmn/go-cache" "strconv" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/pkg/utils" ) var ( @@ -140,8 +141,8 @@ func RespondError(c *gin.Context, httpStatus int, message string) { } func GetVersion(c *gin.Context) { RespondSuccess(c, gin.H{ - "version": utils.CurrentVersion, - "hash": utils.VersionHash, + "version": version.CurrentVersion, + "hash": version.VersionHash, }) } diff --git a/api/PrivateSiteMiddleware.go b/internal/api_v1/PrivateSiteMiddleware.go similarity index 91% rename from api/PrivateSiteMiddleware.go rename to internal/api_v1/PrivateSiteMiddleware.go index 88ec3b4..9ca9df6 100644 --- a/api/PrivateSiteMiddleware.go +++ b/internal/api_v1/PrivateSiteMiddleware.go @@ -1,10 +1,10 @@ -package api +package api_v1 import ( "net/http" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/config" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/config" "github.com/gin-gonic/gin" ) diff --git a/api/TokenAuthMiddleware.go b/internal/api_v1/TokenAuthMiddleware.go similarity index 96% rename from api/TokenAuthMiddleware.go rename to internal/api_v1/TokenAuthMiddleware.go index df6fa83..0ff24fb 100644 --- a/api/TokenAuthMiddleware.go +++ b/internal/api_v1/TokenAuthMiddleware.go @@ -1,4 +1,4 @@ -package api +package api_v1 import ( "bytes" @@ -7,7 +7,7 @@ import ( "io" "net/http" - "github.com/komari-monitor/komari/database/clients" + "github.com/komari-monitor/komari/internal/database/clients" "gorm.io/gorm" "github.com/gin-gonic/gin" diff --git a/api/admin/2fa.go b/internal/api_v1/admin/2fa.go similarity index 91% rename from api/admin/2fa.go rename to internal/api_v1/admin/2fa.go index a9c07c9..01e0a77 100644 --- a/api/admin/2fa.go +++ b/internal/api_v1/admin/2fa.go @@ -4,8 +4,8 @@ import ( "image/png" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/accounts" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/accounts" "github.com/pquerna/otp/totp" ) diff --git a/api/admin/client.go b/internal/api_v1/admin/client.go similarity index 93% rename from api/admin/client.go rename to internal/api_v1/admin/client.go index f59079d..8d9d45d 100644 --- a/api/admin/client.go +++ b/internal/api_v1/admin/client.go @@ -4,10 +4,10 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/records" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/records" + "github.com/komari-monitor/komari/internal/ws" ) func AddClient(c *gin.Context) { diff --git a/api/admin/client_weight.go b/internal/api_v1/admin/client_weight.go similarity index 72% rename from api/admin/client_weight.go rename to internal/api_v1/admin/client_weight.go index 89651b9..b476820 100644 --- a/api/admin/client_weight.go +++ b/internal/api_v1/admin/client_weight.go @@ -2,10 +2,10 @@ package admin import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func OrderWeight(c *gin.Context) { diff --git a/api/admin/clipboard/clipboard.go b/internal/api_v1/admin/clipboard/clipboard.go similarity index 93% rename from api/admin/clipboard/clipboard.go rename to internal/api_v1/admin/clipboard/clipboard.go index e909182..4c515e9 100644 --- a/api/admin/clipboard/clipboard.go +++ b/internal/api_v1/admin/clipboard/clipboard.go @@ -5,10 +5,10 @@ import ( "strconv" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/auditlog" - clipboardDB "github.com/komari-monitor/komari/database/clipboard" - "github.com/komari-monitor/komari/database/models" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/auditlog" + clipboardDB "github.com/komari-monitor/komari/internal/database/clipboard" + "github.com/komari-monitor/komari/internal/database/models" ) // GetClipboard retrieves a clipboard entry by ID diff --git a/api/admin/download.go b/internal/api_v1/admin/download.go similarity index 98% rename from api/admin/download.go rename to internal/api_v1/admin/download.go index 6c355a3..32607eb 100644 --- a/api/admin/download.go +++ b/internal/api_v1/admin/download.go @@ -11,9 +11,9 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" "github.com/komari-monitor/komari/cmd/flags" - "github.com/komari-monitor/komari/database/dbcore" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/dbcore" ) // copyFile 复制单个文件到目标路径(会确保父目录存在) diff --git a/api/admin/exec.go b/internal/api_v1/admin/exec.go similarity index 88% rename from api/admin/exec.go rename to internal/api_v1/admin/exec.go index 2fd0a32..3e236a8 100644 --- a/api/admin/exec.go +++ b/internal/api_v1/admin/exec.go @@ -6,12 +6,12 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/tasks" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/ws" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/tasks" + "github.com/komari-monitor/komari/internal/ws" + "github.com/komari-monitor/komari/pkg/utils" ) // 接受数据类型: diff --git a/api/admin/log/log.go b/internal/api_v1/admin/log/log.go similarity index 86% rename from api/admin/log/log.go rename to internal/api_v1/admin/log/log.go index 91bcaae..09f29a0 100644 --- a/api/admin/log/log.go +++ b/internal/api_v1/admin/log/log.go @@ -4,9 +4,9 @@ import ( "strconv" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func GetLogs(c *gin.Context) { diff --git a/api/admin/messageSender.go b/internal/api_v1/admin/messageSender.go similarity index 82% rename from api/admin/messageSender.go rename to internal/api_v1/admin/messageSender.go index 7787b59..4315ba2 100644 --- a/api/admin/messageSender.go +++ b/internal/api_v1/admin/messageSender.go @@ -2,12 +2,12 @@ package admin import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/messageSender" - "github.com/komari-monitor/komari/utils/messageSender/factory" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) func GetMessageSenderProvider(c *gin.Context) { diff --git a/api/admin/notification/load.go b/internal/api_v1/admin/notification/load.go similarity index 93% rename from api/admin/notification/load.go rename to internal/api_v1/admin/notification/load.go index 5ad2490..6b0ee9a 100644 --- a/api/admin/notification/load.go +++ b/internal/api_v1/admin/notification/load.go @@ -4,9 +4,9 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/notification" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/notification" ) // POST body: clients []string, name string, metric string, threshold float32, ratio float32, interval int diff --git a/api/admin/notification/offline.go b/internal/api_v1/admin/notification/offline.go similarity index 94% rename from api/admin/notification/offline.go rename to internal/api_v1/admin/notification/offline.go index 3902b3c..d5a7e35 100644 --- a/api/admin/notification/offline.go +++ b/internal/api_v1/admin/notification/offline.go @@ -2,9 +2,9 @@ package notification import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "gorm.io/gorm/clause" ) diff --git a/api/admin/oauth.go b/internal/api_v1/admin/oauth.go similarity index 85% rename from api/admin/oauth.go rename to internal/api_v1/admin/oauth.go index 544ad49..bd22063 100644 --- a/api/admin/oauth.go +++ b/internal/api_v1/admin/oauth.go @@ -2,13 +2,13 @@ package admin import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/oauth" - "github.com/komari-monitor/komari/utils/oauth/factory" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/oauth" + "github.com/komari-monitor/komari/internal/oauth/factory" ) func BindingExternalAccount(c *gin.Context) { diff --git a/api/admin/ping.go b/internal/api_v1/admin/ping.go similarity index 92% rename from api/admin/ping.go rename to internal/api_v1/admin/ping.go index c68016c..8fcb550 100644 --- a/api/admin/ping.go +++ b/internal/api_v1/admin/ping.go @@ -4,9 +4,9 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/tasks" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/tasks" ) // POST body: clients []string, target, task_type string, interval int diff --git a/api/admin/sessions.go b/internal/api_v1/admin/sessions.go similarity index 86% rename from api/admin/sessions.go rename to internal/api_v1/admin/sessions.go index 2c0bd81..21981c0 100644 --- a/api/admin/sessions.go +++ b/internal/api_v1/admin/sessions.go @@ -1,9 +1,9 @@ package admin import ( - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/auditlog" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/auditlog" "github.com/gin-gonic/gin" ) diff --git a/api/admin/settings.go b/internal/api_v1/admin/settings.go similarity index 81% rename from api/admin/settings.go rename to internal/api_v1/admin/settings.go index b4cf9ce..2316be3 100644 --- a/api/admin/settings.go +++ b/internal/api_v1/admin/settings.go @@ -3,12 +3,12 @@ package admin import ( "database/sql" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/records" - "github.com/komari-monitor/komari/database/tasks" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/records" + "github.com/komari-monitor/komari/internal/database/tasks" "github.com/gin-gonic/gin" ) diff --git a/api/admin/task.go b/internal/api_v1/admin/task.go similarity index 96% rename from api/admin/task.go rename to internal/api_v1/admin/task.go index c387470..5916f45 100644 --- a/api/admin/task.go +++ b/internal/api_v1/admin/task.go @@ -2,8 +2,8 @@ package admin import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/tasks" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/tasks" ) func GetTasks(c *gin.Context) { diff --git a/api/admin/test/test.go b/internal/api_v1/admin/test/test.go similarity index 77% rename from api/admin/test/test.go rename to internal/api_v1/admin/test/test.go index 2d83068..01b5b3a 100644 --- a/api/admin/test/test.go +++ b/internal/api_v1/admin/test/test.go @@ -4,11 +4,11 @@ import ( "net" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/geoip" - "github.com/komari-monitor/komari/utils/messageSender" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/geoip" + "github.com/komari-monitor/komari/internal/messageSender" ) func TestSendMessage(c *gin.Context) { diff --git a/api/admin/theme.go b/internal/api_v1/admin/theme.go similarity index 98% rename from api/admin/theme.go rename to internal/api_v1/admin/theme.go index 19aef43..7d538e1 100644 --- a/api/admin/theme.go +++ b/internal/api_v1/admin/theme.go @@ -13,10 +13,10 @@ import ( "strings" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) // UploadTheme 上传主题 diff --git a/api/admin/update/favicon.go b/internal/api_v1/admin/update/favicon.go similarity index 91% rename from api/admin/update/favicon.go rename to internal/api_v1/admin/update/favicon.go index 9b1f7b8..29c3643 100644 --- a/api/admin/update/favicon.go +++ b/internal/api_v1/admin/update/favicon.go @@ -7,8 +7,8 @@ import ( "strings" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/auditlog" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/auditlog" ) func UploadFavicon(c *gin.Context) { diff --git a/api/admin/update/geoip.go b/internal/api_v1/admin/update/geoip.go similarity index 68% rename from api/admin/update/geoip.go rename to internal/api_v1/admin/update/geoip.go index fa0d4ac..7e6afc9 100644 --- a/api/admin/update/geoip.go +++ b/internal/api_v1/admin/update/geoip.go @@ -2,9 +2,9 @@ package update import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/utils/geoip" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/geoip" ) func UpdateMmdbGeoIP(c *gin.Context) { diff --git a/api/admin/update/user.go b/internal/api_v1/admin/update/user.go similarity index 86% rename from api/admin/update/user.go rename to internal/api_v1/admin/update/user.go index 34e06f3..53c44aa 100644 --- a/api/admin/update/user.go +++ b/internal/api_v1/admin/update/user.go @@ -2,9 +2,9 @@ package update import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/auditlog" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/auditlog" ) func UpdateUser(c *gin.Context) { diff --git a/api/admin/upload.go b/internal/api_v1/admin/upload.go similarity index 98% rename from api/admin/upload.go rename to internal/api_v1/admin/upload.go index 8f8a673..0434af1 100644 --- a/api/admin/upload.go +++ b/internal/api_v1/admin/upload.go @@ -13,7 +13,7 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" + api "github.com/komari-monitor/komari/internal/api_v1" ) // 只有一个备份恢复操作在进行 diff --git a/api/client/autoDiscovery.go b/internal/api_v1/client/autoDiscovery.go similarity index 79% rename from api/client/autoDiscovery.go rename to internal/api_v1/client/autoDiscovery.go index 789ab0a..b8fa507 100644 --- a/api/client/autoDiscovery.go +++ b/internal/api_v1/client/autoDiscovery.go @@ -2,10 +2,10 @@ package client import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/utils" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/pkg/utils" ) func RegisterClient(c *gin.Context) { diff --git a/api/client/report.go b/internal/api_v1/client/report.go similarity index 93% rename from api/client/report.go rename to internal/api_v1/client/report.go index 34872ff..420b80d 100644 --- a/api/client/report.go +++ b/internal/api_v1/client/report.go @@ -12,13 +12,13 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/tasks" - "github.com/komari-monitor/komari/utils/notifier" - "github.com/komari-monitor/komari/ws" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/tasks" + "github.com/komari-monitor/komari/internal/notifier" + "github.com/komari-monitor/komari/internal/ws" "github.com/patrickmn/go-cache" ) diff --git a/api/client/task.go b/internal/api_v1/client/task.go similarity index 84% rename from api/client/task.go rename to internal/api_v1/client/task.go index 67d8564..80907db 100644 --- a/api/client/task.go +++ b/internal/api_v1/client/task.go @@ -4,9 +4,9 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/tasks" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/tasks" ) func TaskResult(c *gin.Context) { diff --git a/api/client/terminal.go b/internal/api_v1/client/terminal.go similarity index 95% rename from api/client/terminal.go rename to internal/api_v1/client/terminal.go index 3411b79..ff53774 100644 --- a/api/client/terminal.go +++ b/internal/api_v1/client/terminal.go @@ -5,7 +5,7 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/api" + api "github.com/komari-monitor/komari/internal/api_v1" ) func EstablishConnection(c *gin.Context) { diff --git a/api/client/uploadBasicInfo.go b/internal/api_v1/client/uploadBasicInfo.go similarity index 90% rename from api/client/uploadBasicInfo.go rename to internal/api_v1/client/uploadBasicInfo.go index c8fd7b3..0564ed5 100644 --- a/api/client/uploadBasicInfo.go +++ b/internal/api_v1/client/uploadBasicInfo.go @@ -3,9 +3,9 @@ package client import ( "net" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/utils/geoip" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/geoip" "github.com/gin-gonic/gin" ) diff --git a/api/jsonRpc/JsonRpc.go b/internal/api_v1/jsonRpc/JsonRpc.go similarity index 95% rename from api/jsonRpc/JsonRpc.go rename to internal/api_v1/jsonRpc/JsonRpc.go index fd60514..c1ab2f4 100644 --- a/api/jsonRpc/JsonRpc.go +++ b/internal/api_v1/jsonRpc/JsonRpc.go @@ -11,12 +11,12 @@ import ( "sync" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/rpc" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/ws" + "github.com/komari-monitor/komari/pkg/rpc" ) // Json Rpc2 over websocket, /api/rpc2 diff --git a/api/jsonRpc/common.go b/internal/api_v1/jsonRpc/common.go similarity index 95% rename from api/jsonRpc/common.go rename to internal/api_v1/jsonRpc/common.go index cc31c84..40fda52 100644 --- a/api/jsonRpc/common.go +++ b/internal/api_v1/jsonRpc/common.go @@ -8,17 +8,17 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/database/tasks" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/rpc" - "github.com/komari-monitor/komari/ws" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/database/tasks" + "github.com/komari-monitor/komari/internal/version" + "github.com/komari-monitor/komari/internal/ws" + "github.com/komari-monitor/komari/pkg/rpc" cache "github.com/patrickmn/go-cache" ) @@ -455,8 +455,8 @@ func getVersion(_ context.Context, _ *rpc.JsonRpcRequest) (any, *rpc.JsonRpcErro Version string `json:"version"` Hash string `json:"hash"` }{ - Version: utils.CurrentVersion, - Hash: utils.VersionHash, + Version: version.CurrentVersion, + Hash: version.VersionHash, }, nil } diff --git a/api/jsonRpc/common.record.go b/internal/api_v1/jsonRpc/common.record.go similarity index 98% rename from api/jsonRpc/common.record.go rename to internal/api_v1/jsonRpc/common.record.go index 8a6d9a3..53dce78 100644 --- a/api/jsonRpc/common.record.go +++ b/internal/api_v1/jsonRpc/common.record.go @@ -7,12 +7,12 @@ import ( "sort" "time" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - recordsdb "github.com/komari-monitor/komari/database/records" - "github.com/komari-monitor/komari/database/tasks" - "github.com/komari-monitor/komari/utils/rpc" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + recordsdb "github.com/komari-monitor/komari/internal/database/records" + "github.com/komari-monitor/komari/internal/database/tasks" + "github.com/komari-monitor/komari/pkg/rpc" ) func init() { diff --git a/api/latestRecord.go b/internal/api_v1/latestRecord.go similarity index 81% rename from api/latestRecord.go rename to internal/api_v1/latestRecord.go index 1f06653..1e5f01e 100644 --- a/api/latestRecord.go +++ b/internal/api_v1/latestRecord.go @@ -1,10 +1,10 @@ -package api +package api_v1 import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func GetClientRecentRecords(c *gin.Context) { diff --git a/api/login.go b/internal/api_v1/login.go similarity index 91% rename from api/login.go rename to internal/api_v1/login.go index f62a3e4..e287e16 100644 --- a/api/login.go +++ b/internal/api_v1/login.go @@ -1,13 +1,13 @@ -package api +package api_v1 import ( "encoding/json" "io" "net/http" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/config" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" "github.com/gin-gonic/gin" ) diff --git a/api/login_test.go b/internal/api_v1/login_test.go similarity index 96% rename from api/login_test.go rename to internal/api_v1/login_test.go index 763b5bc..0314a5b 100644 --- a/api/login_test.go +++ b/internal/api_v1/login_test.go @@ -1,4 +1,4 @@ -package api +package api_v1 import ( "bytes" @@ -8,7 +8,7 @@ import ( "testing" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/accounts" + "github.com/komari-monitor/komari/internal/database/accounts" "github.com/stretchr/testify/assert" ) diff --git a/api/me.go b/internal/api_v1/me.go similarity index 89% rename from api/me.go rename to internal/api_v1/me.go index 557bb47..f254900 100644 --- a/api/me.go +++ b/internal/api_v1/me.go @@ -1,7 +1,7 @@ -package api +package api_v1 import ( - "github.com/komari-monitor/komari/database/accounts" + "github.com/komari-monitor/komari/internal/database/accounts" "github.com/gin-gonic/gin" ) diff --git a/api/me_test.go b/internal/api_v1/me_test.go similarity index 96% rename from api/me_test.go rename to internal/api_v1/me_test.go index 0973060..a68106c 100644 --- a/api/me_test.go +++ b/internal/api_v1/me_test.go @@ -1,4 +1,4 @@ -package api +package api_v1 import ( "encoding/json" @@ -7,7 +7,7 @@ import ( "testing" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/accounts" + "github.com/komari-monitor/komari/internal/database/accounts" "github.com/stretchr/testify/assert" ) diff --git a/api/nodes.go b/internal/api_v1/nodes.go similarity index 85% rename from api/nodes.go rename to internal/api_v1/nodes.go index ecc595e..e158b7b 100644 --- a/api/nodes.go +++ b/internal/api_v1/nodes.go @@ -1,9 +1,9 @@ -package api +package api_v1 import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/clients" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/clients" ) func GetNodesInformation(c *gin.Context) { diff --git a/api/oauth.go b/internal/api_v1/oauth.go similarity index 91% rename from api/oauth.go rename to internal/api_v1/oauth.go index 7acb9ba..026fa2e 100644 --- a/api/oauth.go +++ b/internal/api_v1/oauth.go @@ -1,15 +1,15 @@ -package api +package api_v1 import ( "fmt" "slices" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/oauth" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/oauth" + "github.com/komari-monitor/komari/pkg/utils" ) // /api/oauth diff --git a/api/public.go b/internal/api_v1/public.go similarity index 74% rename from api/public.go rename to internal/api_v1/public.go index 4694f53..101c713 100644 --- a/api/public.go +++ b/internal/api_v1/public.go @@ -1,8 +1,8 @@ -package api +package api_v1 import ( "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database" + "github.com/komari-monitor/komari/internal/database" ) func GetPublicSettings(c *gin.Context) { diff --git a/api/record/record.go b/internal/api_v1/record/record.go similarity index 96% rename from api/record/record.go rename to internal/api_v1/record/record.go index c22eaac..fbc92a4 100644 --- a/api/record/record.go +++ b/internal/api_v1/record/record.go @@ -6,12 +6,12 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - records "github.com/komari-monitor/komari/database/records" - "github.com/komari-monitor/komari/database/tasks" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + records "github.com/komari-monitor/komari/internal/database/records" + "github.com/komari-monitor/komari/internal/database/tasks" ) func GetRecordsByUUID(c *gin.Context) { @@ -131,13 +131,13 @@ func GetRecordsByUUID(c *gin.Context) { // filterRecordsByLoadType 根据 load_type 过滤记录,只返回相关字段 func filterRecordsByLoadType(records []models.Record, loadType string) []gin.H { filteredRecords := make([]gin.H, 0, len(records)) - + for _, r := range records { record := gin.H{ "client": r.Client, "time": r.Time, } - + switch loadType { case "cpu": record["cpu"] = r.Cpu @@ -177,10 +177,10 @@ func filterRecordsByLoadType(records []models.Record, loadType string) []gin.H { record["connections_udp"] = r.ConnectionsUdp record["connections_tcp"] = r.Connections - r.ConnectionsUdp } - + filteredRecords = append(filteredRecords, record) } - + return filteredRecords } @@ -341,7 +341,7 @@ func GetPingRecords(c *gin.Context) { Max: stats.max, }) } - + // 如果同时指定了 uuid 和 task_id,BasicInfo 应该只有一条记录 // 这种情况下可以在响应中标记查询模式 if uuid != "" && taskId != -1 && len(response.BasicInfo) == 1 { @@ -396,7 +396,7 @@ func GetPingRecords(c *gin.Context) { if uuid != "" && r.Client != uuid { continue } - + totalCount++ if r.Value < 0 { lossCount++ @@ -431,12 +431,12 @@ func GetPingRecords(c *gin.Context) { "avg": avgLatency, "total": totalCount, } - + // 如果是仅 task_id 查询,添加客户端列表信息 if uuid == "" && taskId != -1 { taskInfo["clients"] = t.Clients } - + tasksList = append(tasksList, taskInfo) } response.Tasks = tasksList diff --git a/api/task/ping.go b/internal/api_v1/task/ping.go similarity index 86% rename from api/task/ping.go rename to internal/api_v1/task/ping.go index a20cbb4..c3ca3e2 100644 --- a/api/task/ping.go +++ b/internal/api_v1/task/ping.go @@ -4,8 +4,8 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/api" - "github.com/komari-monitor/komari/database/tasks" + api "github.com/komari-monitor/komari/internal/api_v1" + "github.com/komari-monitor/komari/internal/database/tasks" ) type PublicPingTask struct { @@ -35,4 +35,4 @@ func GetPublicPingTasks(c *gin.Context) { } api.RespondSuccess(c, publicTasks) -} \ No newline at end of file +} diff --git a/api/terminal.go b/internal/api_v1/terminal.go similarity index 94% rename from api/terminal.go rename to internal/api_v1/terminal.go index 0f7beef..231cc71 100644 --- a/api/terminal.go +++ b/internal/api_v1/terminal.go @@ -1,4 +1,4 @@ -package api +package api_v1 import ( "log" @@ -7,10 +7,10 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/ws" + "github.com/komari-monitor/komari/pkg/utils" ) func RequestTerminal(c *gin.Context) { diff --git a/api/ws.go b/internal/api_v1/ws.go similarity index 88% rename from api/ws.go rename to internal/api_v1/ws.go index db6a88f..cbe7a3f 100644 --- a/api/ws.go +++ b/internal/api_v1/ws.go @@ -1,4 +1,4 @@ -package api +package api_v1 import ( "net/http" @@ -6,12 +6,12 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/accounts" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/accounts" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/ws" ) func GetClients(c *gin.Context) { diff --git a/common/modules.go b/internal/common/modules.go similarity index 89% rename from common/modules.go rename to internal/common/modules.go index 1ddc843..55f030e 100644 --- a/common/modules.go +++ b/internal/common/modules.go @@ -86,18 +86,18 @@ type CPUReport struct { // GPUDetailReport 详细GPU信息报告 type GPUDetailReport struct { - Count int `json:"count"` // GPU数量 - AverageUsage float64 `json:"average_usage"` // 平均使用率 - DetailedInfo []GPUDeviceInfo `json:"detailed_info"` // 每个GPU的详细信息 + Count int `json:"count"` // GPU数量 + AverageUsage float64 `json:"average_usage"` // 平均使用率 + DetailedInfo []GPUDeviceInfo `json:"detailed_info"` // 每个GPU的详细信息 } // GPUDeviceInfo 单个GPU设备信息 type GPUDeviceInfo struct { - Name string `json:"name"` // GPU型号名称 - MemoryTotal int64 `json:"memory_total"` // 显存总量(字节) - MemoryUsed int64 `json:"memory_used"` // 显存已用(字节) - Utilization float64 `json:"utilization"` // GPU使用率(%) - Temperature int `json:"temperature"` // GPU温度(°C) + Name string `json:"name"` // GPU型号名称 + MemoryTotal int64 `json:"memory_total"` // 显存总量(字节) + MemoryUsed int64 `json:"memory_used"` // 显存已用(字节) + Utilization float64 `json:"utilization"` // GPU使用率(%) + Temperature int `json:"temperature"` // GPU温度(°C) } // 保持向后兼容的旧GPUReport结构 diff --git a/database/accounts/2fa.go b/internal/database/accounts/2fa.go similarity index 90% rename from database/accounts/2fa.go rename to internal/database/accounts/2fa.go index 5b92035..3960a0c 100644 --- a/database/accounts/2fa.go +++ b/internal/database/accounts/2fa.go @@ -3,8 +3,8 @@ package accounts import ( "image" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "github.com/pquerna/otp/totp" ) diff --git a/database/accounts/accounts.go b/internal/database/accounts/accounts.go similarity index 96% rename from database/accounts/accounts.go rename to internal/database/accounts/accounts.go index 12e481c..bf4941c 100644 --- a/database/accounts/accounts.go +++ b/internal/database/accounts/accounts.go @@ -7,9 +7,9 @@ import ( "os" "time" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/pkg/utils" "github.com/google/uuid" ) diff --git a/database/accounts/sessions.go b/internal/database/accounts/sessions.go similarity index 88% rename from database/accounts/sessions.go rename to internal/database/accounts/sessions.go index 8fadb6a..0c560d5 100644 --- a/database/accounts/sessions.go +++ b/internal/database/accounts/sessions.go @@ -6,13 +6,13 @@ import ( "net" "time" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - messageevent "github.com/komari-monitor/komari/database/models/messageEvent" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/geoip" - "github.com/komari-monitor/komari/utils/messageSender" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + messageevent "github.com/komari-monitor/komari/internal/database/models/messageEvent" + "github.com/komari-monitor/komari/internal/geoip" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/pkg/utils" ) // GetAllSessions 获取所有会话 diff --git a/database/auditlog/log.go b/internal/database/auditlog/log.go similarity index 84% rename from database/auditlog/log.go rename to internal/database/auditlog/log.go index 211bd4e..e8d8b4c 100644 --- a/database/auditlog/log.go +++ b/internal/database/auditlog/log.go @@ -4,8 +4,8 @@ import ( "log" "time" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func Log(ip, uuid, message, msgType string) { diff --git a/database/clients/client.go b/internal/database/clients/client.go similarity index 97% rename from database/clients/client.go rename to internal/database/clients/client.go index 91beed6..2e93165 100644 --- a/database/clients/client.go +++ b/internal/database/clients/client.go @@ -4,10 +4,10 @@ import ( "math" "time" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/pkg/utils" "gorm.io/gorm" "gorm.io/gorm/clause" diff --git a/database/clients/report.go b/internal/database/clients/report.go similarity index 97% rename from database/clients/report.go rename to internal/database/clients/report.go index 42ee30c..4b2cbff 100644 --- a/database/clients/report.go +++ b/internal/database/clients/report.go @@ -6,9 +6,9 @@ import ( "math" "time" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "gorm.io/gorm" ) diff --git a/database/clipboard/clipboard.go b/internal/database/clipboard/clipboard.go similarity index 92% rename from database/clipboard/clipboard.go rename to internal/database/clipboard/clipboard.go index c657a31..243ace5 100644 --- a/database/clipboard/clipboard.go +++ b/internal/database/clipboard/clipboard.go @@ -1,8 +1,8 @@ package clipboard import ( - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) // CreateClipboard 创建剪贴板记录 diff --git a/database/config/config.go b/internal/database/config/config.go similarity index 96% rename from database/config/config.go rename to internal/database/config/config.go index 4ce5a77..a44335b 100644 --- a/database/config/config.go +++ b/internal/database/config/config.go @@ -6,8 +6,8 @@ import ( "sync" "time" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" "gorm.io/gorm" ) diff --git a/database/config/events.go b/internal/database/config/events.go similarity index 92% rename from database/config/events.go rename to internal/database/config/events.go index 63eb8bc..d1eac6c 100644 --- a/database/config/events.go +++ b/internal/database/config/events.go @@ -3,7 +3,7 @@ package config import ( "sync" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/models" ) // ConfigEvent represents a configuration change event diff --git a/database/dbcore/dbcore.go b/internal/database/dbcore/dbcore.go similarity index 98% rename from database/dbcore/dbcore.go rename to internal/database/dbcore/dbcore.go index b3bc165..071df16 100644 --- a/database/dbcore/dbcore.go +++ b/internal/database/dbcore/dbcore.go @@ -13,9 +13,9 @@ import ( "time" "github.com/komari-monitor/komari/cmd/flags" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/models" - logutil "github.com/komari-monitor/komari/utils/log" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/models" + logutil "github.com/komari-monitor/komari/internal/log" "gorm.io/driver/mysql" "gorm.io/driver/sqlite" "gorm.io/gorm" diff --git a/database/messageSender.go b/internal/database/messageSender.go similarity index 84% rename from database/messageSender.go rename to internal/database/messageSender.go index fb9bcc5..3cc3260 100644 --- a/database/messageSender.go +++ b/internal/database/messageSender.go @@ -1,8 +1,8 @@ package database import ( - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func GetAllMessageSenderConfigs() []models.MessageSenderProvider { diff --git a/database/models/UTCTime.go b/internal/database/models/UTCTime.go similarity index 100% rename from database/models/UTCTime.go rename to internal/database/models/UTCTime.go diff --git a/database/models/clipboard.go b/internal/database/models/clipboard.go similarity index 100% rename from database/models/clipboard.go rename to internal/database/models/clipboard.go diff --git a/database/models/config.go b/internal/database/models/config.go similarity index 100% rename from database/models/config.go rename to internal/database/models/config.go diff --git a/database/models/log.go b/internal/database/models/log.go similarity index 100% rename from database/models/log.go rename to internal/database/models/log.go diff --git a/database/models/messageEvent/MessageEvent.go b/internal/database/models/messageEvent/MessageEvent.go similarity index 100% rename from database/models/messageEvent/MessageEvent.go rename to internal/database/models/messageEvent/MessageEvent.go diff --git a/database/models/messageSender.go b/internal/database/models/messageSender.go similarity index 100% rename from database/models/messageSender.go rename to internal/database/models/messageSender.go diff --git a/database/models/models.go b/internal/database/models/models.go similarity index 100% rename from database/models/models.go rename to internal/database/models/models.go diff --git a/database/models/notification.go b/internal/database/models/notification.go similarity index 100% rename from database/models/notification.go rename to internal/database/models/notification.go diff --git a/database/models/oauth.go b/internal/database/models/oauth.go similarity index 100% rename from database/models/oauth.go rename to internal/database/models/oauth.go diff --git a/database/models/pingTask.go b/internal/database/models/pingTask.go similarity index 100% rename from database/models/pingTask.go rename to internal/database/models/pingTask.go diff --git a/database/models/task.go b/internal/database/models/task.go similarity index 100% rename from database/models/task.go rename to internal/database/models/task.go diff --git a/database/models/theme.go b/internal/database/models/theme.go similarity index 100% rename from database/models/theme.go rename to internal/database/models/theme.go diff --git a/database/notification/load.go b/internal/database/notification/load.go similarity index 91% rename from database/notification/load.go rename to internal/database/notification/load.go index 3483a7c..a377940 100644 --- a/database/notification/load.go +++ b/internal/database/notification/load.go @@ -1,9 +1,9 @@ package notification import ( - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/notifier" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/notifier" "gorm.io/gorm" ) diff --git a/database/oauth.go b/internal/database/oauth.go similarity index 83% rename from database/oauth.go rename to internal/database/oauth.go index 9b1c1ba..c2316af 100644 --- a/database/oauth.go +++ b/internal/database/oauth.go @@ -1,8 +1,8 @@ package database import ( - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func GetAllOidcConfigs() []models.OidcProvider { diff --git a/database/records/records.go b/internal/database/records/records.go similarity index 99% rename from database/records/records.go rename to internal/database/records/records.go index 4fb8064..825e83e 100644 --- a/database/records/records.go +++ b/internal/database/records/records.go @@ -9,8 +9,8 @@ import ( "gorm.io/gorm" "github.com/komari-monitor/komari/cmd/flags" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func RecordOne(rec models.Record) error { diff --git a/database/records/records_test.go b/internal/database/records/records_test.go similarity index 98% rename from database/records/records_test.go rename to internal/database/records/records_test.go index cba9a0b..607ff5b 100644 --- a/database/records/records_test.go +++ b/internal/database/records/records_test.go @@ -11,7 +11,7 @@ import ( "gorm.io/driver/sqlite" "gorm.io/gorm" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/models" ) var uuid = "7901508c-304f-49aa-b84f-957c33ae6f8a" diff --git a/database/tasks/ping.go b/internal/database/tasks/ping.go similarity index 93% rename from database/tasks/ping.go rename to internal/database/tasks/ping.go index 095b9db..4ce6c74 100644 --- a/database/tasks/ping.go +++ b/internal/database/tasks/ping.go @@ -3,9 +3,9 @@ package tasks import ( "time" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/pkg/utils" "gorm.io/gorm" ) diff --git a/database/tasks/tasks.go b/internal/database/tasks/tasks.go similarity index 95% rename from database/tasks/tasks.go rename to internal/database/tasks/tasks.go index ca1285d..4ec51fd 100644 --- a/database/tasks/tasks.go +++ b/internal/database/tasks/tasks.go @@ -3,8 +3,8 @@ package tasks import ( "time" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func CreateTask(taskId string, clients []string, command string) error { diff --git a/database/utils.go b/internal/database/utils.go similarity index 93% rename from database/utils.go rename to internal/database/utils.go index 882e8e2..073c2ed 100644 --- a/database/utils.go +++ b/internal/database/utils.go @@ -8,9 +8,9 @@ import ( "strings" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" ) func GetPublicInfo() (any, error) { diff --git a/utils/geoip/emptyProvider.go b/internal/geoip/emptyProvider.go similarity index 100% rename from utils/geoip/emptyProvider.go rename to internal/geoip/emptyProvider.go diff --git a/utils/geoip/geoip.go b/internal/geoip/geoip.go similarity index 98% rename from utils/geoip/geoip.go rename to internal/geoip/geoip.go index fd92c92..0147c5a 100644 --- a/utils/geoip/geoip.go +++ b/internal/geoip/geoip.go @@ -7,7 +7,7 @@ import ( "time" "unicode" - "github.com/komari-monitor/komari/database/config" + "github.com/komari-monitor/komari/internal/database/config" "github.com/patrickmn/go-cache" ) diff --git a/utils/geoip/geoip_test.go b/internal/geoip/geoip_test.go similarity index 97% rename from utils/geoip/geoip_test.go rename to internal/geoip/geoip_test.go index dfe9bb5..b128173 100644 --- a/utils/geoip/geoip_test.go +++ b/internal/geoip/geoip_test.go @@ -4,7 +4,7 @@ import ( "net" "testing" - "github.com/komari-monitor/komari/utils/geoip" + "github.com/komari-monitor/komari/internal/geoip" ) // 测试GeoIP数据库的初始化和更新功能 diff --git a/utils/geoip/geojs.go b/internal/geoip/geojs.go similarity index 100% rename from utils/geoip/geojs.go rename to internal/geoip/geojs.go diff --git a/utils/geoip/ipapi.go b/internal/geoip/ipapi.go similarity index 100% rename from utils/geoip/ipapi.go rename to internal/geoip/ipapi.go diff --git a/utils/geoip/ipinfo.go b/internal/geoip/ipinfo.go similarity index 100% rename from utils/geoip/ipinfo.go rename to internal/geoip/ipinfo.go diff --git a/utils/geoip/mmdb.go b/internal/geoip/mmdb.go similarity index 99% rename from utils/geoip/mmdb.go rename to internal/geoip/mmdb.go index edf4549..82f39c6 100644 --- a/utils/geoip/mmdb.go +++ b/internal/geoip/mmdb.go @@ -10,7 +10,7 @@ import ( "path/filepath" // 新增导入,用于处理文件路径 "sync" - "github.com/komari-monitor/komari/database/auditlog" + "github.com/komari-monitor/komari/internal/database/auditlog" "github.com/oschwald/maxminddb-golang" ) diff --git a/utils/log/gin.go b/internal/log/gin.go similarity index 100% rename from utils/log/gin.go rename to internal/log/gin.go diff --git a/utils/log/gorm.go b/internal/log/gorm.go similarity index 96% rename from utils/log/gorm.go rename to internal/log/gorm.go index 6644b9b..beac977 100644 --- a/utils/log/gorm.go +++ b/internal/log/gorm.go @@ -7,7 +7,7 @@ import ( "log/slog" "time" - komari_utils "github.com/komari-monitor/komari/utils" + "github.com/komari-monitor/komari/internal/version" "gorm.io/gorm" gormlogger "gorm.io/gorm/logger" "gorm.io/gorm/utils" @@ -30,7 +30,7 @@ func NewGormLogger() *GormLogger { return gormlogger.Info } return gormlogger.Silent - }(komari_utils.VersionHash), + }(version.VersionHash), } } diff --git a/utils/log/log.go b/internal/log/log.go similarity index 100% rename from utils/log/log.go rename to internal/log/log.go diff --git a/internal/messageSender/all.go b/internal/messageSender/all.go new file mode 100644 index 0000000..7be9211 --- /dev/null +++ b/internal/messageSender/all.go @@ -0,0 +1,15 @@ +package messageSender + +import ( + _ "github.com/komari-monitor/komari/internal/messageSender/bark" + _ "github.com/komari-monitor/komari/internal/messageSender/email" + _ "github.com/komari-monitor/komari/internal/messageSender/empty" + _ "github.com/komari-monitor/komari/internal/messageSender/javascript" + _ "github.com/komari-monitor/komari/internal/messageSender/serverchan3" + _ "github.com/komari-monitor/komari/internal/messageSender/serverchanturbo" + _ "github.com/komari-monitor/komari/internal/messageSender/telegram" + _ "github.com/komari-monitor/komari/internal/messageSender/webhook" +) + +func All() { +} diff --git a/utils/messageSender/bark/bark.go b/internal/messageSender/bark/bark.go similarity index 97% rename from utils/messageSender/bark/bark.go rename to internal/messageSender/bark/bark.go index c49a975..fff934d 100644 --- a/utils/messageSender/bark/bark.go +++ b/internal/messageSender/bark/bark.go @@ -8,7 +8,7 @@ import ( "net/url" "strings" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type BarkSender struct { diff --git a/utils/messageSender/bark/meta.go b/internal/messageSender/bark/meta.go similarity index 91% rename from utils/messageSender/bark/meta.go rename to internal/messageSender/bark/meta.go index 60ca246..641bbce 100644 --- a/utils/messageSender/bark/meta.go +++ b/internal/messageSender/bark/meta.go @@ -1,7 +1,7 @@ package bark import ( - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type Addition struct { diff --git a/utils/messageSender/email/email.go b/internal/messageSender/email/email.go similarity index 99% rename from utils/messageSender/email/email.go rename to internal/messageSender/email/email.go index 60feab6..a7d7427 100644 --- a/utils/messageSender/email/email.go +++ b/internal/messageSender/email/email.go @@ -12,7 +12,7 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type EmailSender struct { diff --git a/utils/messageSender/email/meta.go b/internal/messageSender/email/meta.go similarity index 91% rename from utils/messageSender/email/meta.go rename to internal/messageSender/email/meta.go index a5b840e..47d86b5 100644 --- a/utils/messageSender/email/meta.go +++ b/internal/messageSender/email/meta.go @@ -1,7 +1,7 @@ package email import ( - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type Addition struct { diff --git a/utils/messageSender/empty/empty.go b/internal/messageSender/empty/empty.go similarity index 91% rename from utils/messageSender/empty/empty.go rename to internal/messageSender/empty/empty.go index 41d1bf9..ebd978f 100644 --- a/utils/messageSender/empty/empty.go +++ b/internal/messageSender/empty/empty.go @@ -3,7 +3,7 @@ package empty import ( "fmt" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type Addition struct { diff --git a/utils/messageSender/factory/factory.go b/internal/messageSender/factory/factory.go similarity index 96% rename from utils/messageSender/factory/factory.go rename to internal/messageSender/factory/factory.go index 07d1e6e..74a7952 100644 --- a/utils/messageSender/factory/factory.go +++ b/internal/messageSender/factory/factory.go @@ -3,7 +3,7 @@ package factory import ( "log" - "github.com/komari-monitor/komari/utils/item" + "github.com/komari-monitor/komari/pkg/item" ) var ( diff --git a/utils/messageSender/factory/meta.go b/internal/messageSender/factory/meta.go similarity index 87% rename from utils/messageSender/factory/meta.go rename to internal/messageSender/factory/meta.go index 945997a..f53252f 100644 --- a/utils/messageSender/factory/meta.go +++ b/internal/messageSender/factory/meta.go @@ -1,6 +1,6 @@ package factory -import "github.com/komari-monitor/komari/database/models" +import "github.com/komari-monitor/komari/internal/database/models" type IMessageSender interface { GetName() string diff --git a/utils/messageSender/javascript/apis.go b/internal/messageSender/javascript/apis.go similarity index 100% rename from utils/messageSender/javascript/apis.go rename to internal/messageSender/javascript/apis.go diff --git a/utils/messageSender/javascript/javascript.go b/internal/messageSender/javascript/javascript.go similarity index 98% rename from utils/messageSender/javascript/javascript.go rename to internal/messageSender/javascript/javascript.go index c923353..bed1366 100644 --- a/utils/messageSender/javascript/javascript.go +++ b/internal/messageSender/javascript/javascript.go @@ -8,8 +8,8 @@ import ( "github.com/dop251/goja" "github.com/dop251/goja_nodejs/require" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type JavaScriptSender struct { diff --git a/utils/messageSender/javascript/meta.go b/internal/messageSender/javascript/meta.go similarity index 100% rename from utils/messageSender/javascript/meta.go rename to internal/messageSender/javascript/meta.go diff --git a/utils/messageSender/loader.go b/internal/messageSender/loader.go similarity index 94% rename from utils/messageSender/loader.go rename to internal/messageSender/loader.go index a417a50..0c677d2 100644 --- a/utils/messageSender/loader.go +++ b/internal/messageSender/loader.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) func LoadProvider(name string, addition string) error { diff --git a/utils/messageSender/loader_test.go b/internal/messageSender/loader_test.go similarity index 87% rename from utils/messageSender/loader_test.go rename to internal/messageSender/loader_test.go index 4868c1b..39876bc 100644 --- a/utils/messageSender/loader_test.go +++ b/internal/messageSender/loader_test.go @@ -3,7 +3,7 @@ package messageSender import ( "testing" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) func Test(t *testing.T) { diff --git a/utils/messageSender/sender.go b/internal/messageSender/sender.go similarity index 93% rename from utils/messageSender/sender.go rename to internal/messageSender/sender.go index d3c9d27..9b27228 100644 --- a/utils/messageSender/sender.go +++ b/internal/messageSender/sender.go @@ -8,11 +8,11 @@ import ( "sync" "time" - "github.com/komari-monitor/komari/database" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) var ( diff --git a/internal/messageSender/serverchan3/meta.go b/internal/messageSender/serverchan3/meta.go new file mode 100644 index 0000000..57376b6 --- /dev/null +++ b/internal/messageSender/serverchan3/meta.go @@ -0,0 +1,21 @@ +package serverchan3 + +import ( + "github.com/komari-monitor/komari/internal/messageSender/factory" +) + +// Addition 为 Server酱³ 推送通道的配置项 +// 所有字段通过管理页面以 JSON 形式进行设置 +type Addition struct { + // APIURL 为接口完整地址,例如:https://.push.ft07.com/send/.send + APIURL string `json:"api_url" required:"true" help:"接口完整地址,例如 https://.push.ft07.com/send/.send;参考:https://sc3.ft07.com/"` + // Tags 为可选标签,使用 | 分割,例如:tag1|tag2|tag3 + Tags string `json:"tags" help:"可选标签,使用 | 分割,例如 tag1|tag2|tag3"` +} + +// 注册 Server酱³ 推送通道到工厂 +func init() { + factory.RegisterMessageSender(func() factory.IMessageSender { + return &ServerChan3Sender{} + }) +} diff --git a/utils/messageSender/serverchan3/serverchan3.go b/internal/messageSender/serverchan3/serverchan3.go similarity index 97% rename from utils/messageSender/serverchan3/serverchan3.go rename to internal/messageSender/serverchan3/serverchan3.go index 7d6626e..571d0ea 100644 --- a/utils/messageSender/serverchan3/serverchan3.go +++ b/internal/messageSender/serverchan3/serverchan3.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) // ServerChan3Sender 为 Server酱³ 推送实现 diff --git a/internal/messageSender/serverchanturbo/meta.go b/internal/messageSender/serverchanturbo/meta.go new file mode 100644 index 0000000..0569fc7 --- /dev/null +++ b/internal/messageSender/serverchanturbo/meta.go @@ -0,0 +1,25 @@ +package serverchanturbo + +import ( + "github.com/komari-monitor/komari/internal/messageSender/factory" +) + +// Addition 为 Server酱 Turbo 推送通道的配置项 +// 仅允许配置接口地址及可选的通道/隐藏IP/openid,固定以 JSON 发送 +type Addition struct { + // APIURL 为接口完整地址,例如:https://sctapi.ftqq.com/.send + APIURL string `json:"api_url" required:"true" help:"接口完整地址,例如 https://sctapi.ftqq.com/.send;参考:https://sct.ftqq.com/"` + // Channel 为本次推送使用的消息通道,最多两个,多个用 | 隔开,例如:9|66 + Channel string `json:"channel" help:"消息通道,可选,多个用 | 隔开,例如 9|66"` + // NoIP 是否隐藏调用 IP,填 1 则隐藏 + NoIP string `json:"noip" help:"是否隐藏调用IP,填 1 隐藏;为空则不隐藏"` + // OpenID 消息抄送 openid,测试号用 , 分隔;企业微信应用用 | 分隔 + OpenID string `json:"openid" help:"抄送 openid,测试号用 , 分隔;企业微信应用用 | 分隔"` +} + +// 注册 Server酱 Turbo 推送通道到工厂 +func init() { + factory.RegisterMessageSender(func() factory.IMessageSender { + return &ServerChanTurboSender{} + }) +} diff --git a/utils/messageSender/serverchanturbo/serverchanturbo.go b/internal/messageSender/serverchanturbo/serverchanturbo.go similarity index 97% rename from utils/messageSender/serverchanturbo/serverchanturbo.go rename to internal/messageSender/serverchanturbo/serverchanturbo.go index 35012c7..6c8cc3d 100644 --- a/utils/messageSender/serverchanturbo/serverchanturbo.go +++ b/internal/messageSender/serverchanturbo/serverchanturbo.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) // ServerChanTurboSender 为 Server酱 Turbo 推送实现 diff --git a/utils/messageSender/telegram/meta.go b/internal/messageSender/telegram/meta.go similarity index 100% rename from utils/messageSender/telegram/meta.go rename to internal/messageSender/telegram/meta.go diff --git a/utils/messageSender/telegram/telegram.go b/internal/messageSender/telegram/telegram.go similarity index 96% rename from utils/messageSender/telegram/telegram.go rename to internal/messageSender/telegram/telegram.go index 6e562a3..8725839 100644 --- a/utils/messageSender/telegram/telegram.go +++ b/internal/messageSender/telegram/telegram.go @@ -7,7 +7,7 @@ import ( "net/http" "net/url" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type TelegramSender struct { diff --git a/utils/messageSender/webhook/meta.go b/internal/messageSender/webhook/meta.go similarity index 90% rename from utils/messageSender/webhook/meta.go rename to internal/messageSender/webhook/meta.go index b7d528f..2e51218 100644 --- a/utils/messageSender/webhook/meta.go +++ b/internal/messageSender/webhook/meta.go @@ -1,7 +1,7 @@ package webhook import ( - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type Addition struct { diff --git a/utils/messageSender/webhook/webhook.go b/internal/messageSender/webhook/webhook.go similarity index 98% rename from utils/messageSender/webhook/webhook.go rename to internal/messageSender/webhook/webhook.go index a652f2c..fc03b4a 100644 --- a/utils/messageSender/webhook/webhook.go +++ b/internal/messageSender/webhook/webhook.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/utils/messageSender/factory" + "github.com/komari-monitor/komari/internal/messageSender/factory" ) type WebhookSender struct { diff --git a/compat/nezha/nezha.proto b/internal/nezha/nezha.proto similarity index 95% rename from compat/nezha/nezha.proto rename to internal/nezha/nezha.proto index a8ed258..1854321 100644 --- a/compat/nezha/nezha.proto +++ b/internal/nezha/nezha.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package proto; -option go_package = "github.com/komari-monitor/komari/compat/nezha/proto"; +option go_package = "github.com/komari-monitor/komari/internal/nezha/proto"; service NezhaService { rpc ReportSystemState(stream State) returns (stream Receipt) {} diff --git a/compat/nezha/proto/nezha.pb.go b/internal/nezha/proto/nezha.pb.go similarity index 100% rename from compat/nezha/proto/nezha.pb.go rename to internal/nezha/proto/nezha.pb.go diff --git a/compat/nezha/proto/nezha_grpc.pb.go b/internal/nezha/proto/nezha_grpc.pb.go similarity index 100% rename from compat/nezha/proto/nezha_grpc.pb.go rename to internal/nezha/proto/nezha_grpc.pb.go diff --git a/utils/notifier/expire.go b/internal/notifier/expire.go similarity index 83% rename from utils/notifier/expire.go rename to internal/notifier/expire.go index 8a78c1e..c1afd2d 100644 --- a/utils/notifier/expire.go +++ b/internal/notifier/expire.go @@ -5,12 +5,12 @@ import ( "math" "time" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - messageevent "github.com/komari-monitor/komari/database/models/messageEvent" - "github.com/komari-monitor/komari/utils/messageSender" - "github.com/komari-monitor/komari/utils/renewal" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + messageevent "github.com/komari-monitor/komari/internal/database/models/messageEvent" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/internal/renewal" ) func CheckExpireScheduledWork() { diff --git a/utils/notifier/load.go b/internal/notifier/load.go similarity index 93% rename from utils/notifier/load.go rename to internal/notifier/load.go index 7cbfa67..e3776bf 100644 --- a/utils/notifier/load.go +++ b/internal/notifier/load.go @@ -6,12 +6,12 @@ import ( "sync" "time" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - messageevent "github.com/komari-monitor/komari/database/models/messageEvent" - "github.com/komari-monitor/komari/database/records" - "github.com/komari-monitor/komari/utils/messageSender" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + messageevent "github.com/komari-monitor/komari/internal/database/models/messageEvent" + "github.com/komari-monitor/komari/internal/database/records" + "github.com/komari-monitor/komari/internal/messageSender" ) // LoadNotificationService 管理定时器和任务 diff --git a/utils/notifier/offline.go b/internal/notifier/offline.go similarity index 93% rename from utils/notifier/offline.go rename to internal/notifier/offline.go index d8d8e30..6b9f378 100644 --- a/utils/notifier/offline.go +++ b/internal/notifier/offline.go @@ -6,13 +6,13 @@ import ( "sync" "time" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/dbcore" - "github.com/komari-monitor/komari/database/models" - messageevent "github.com/komari-monitor/komari/database/models/messageEvent" - "github.com/komari-monitor/komari/utils/messageSender" - "github.com/komari-monitor/komari/utils/renewal" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + messageevent "github.com/komari-monitor/komari/internal/database/models/messageEvent" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/internal/renewal" ) // notificationState 保存单个客户端的通知状态。 diff --git a/utils/notifier/traffic.go b/internal/notifier/traffic.go similarity index 91% rename from utils/notifier/traffic.go rename to internal/notifier/traffic.go index d044cee..bd5c91a 100644 --- a/utils/notifier/traffic.go +++ b/internal/notifier/traffic.go @@ -6,11 +6,11 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/messageSender" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/internal/ws" cache "github.com/patrickmn/go-cache" ) diff --git a/internal/oauth/all.go b/internal/oauth/all.go new file mode 100644 index 0000000..6e37bda --- /dev/null +++ b/internal/oauth/all.go @@ -0,0 +1,13 @@ +package oauth + +import ( + _ "github.com/komari-monitor/komari/internal/oauth/cloudflare" + _ "github.com/komari-monitor/komari/internal/oauth/factory" + _ "github.com/komari-monitor/komari/internal/oauth/generic" + _ "github.com/komari-monitor/komari/internal/oauth/github" + _ "github.com/komari-monitor/komari/internal/oauth/qq" +) + +func All() { + //empty function to ensure all OIDC providers are registered +} diff --git a/utils/oauth/cloudflare/cloudflare.go b/internal/oauth/cloudflare/cloudflare.go similarity index 95% rename from utils/oauth/cloudflare/cloudflare.go rename to internal/oauth/cloudflare/cloudflare.go index ea791ef..66a672b 100644 --- a/utils/oauth/cloudflare/cloudflare.go +++ b/internal/oauth/cloudflare/cloudflare.go @@ -6,8 +6,8 @@ import ( "github.com/coreos/go-oidc/v3/oidc" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" + "github.com/komari-monitor/komari/pkg/utils" ) func (c *Cloudflare) GetName() string { diff --git a/utils/oauth/cloudflare/meta.go b/internal/oauth/cloudflare/meta.go similarity index 83% rename from utils/oauth/cloudflare/meta.go rename to internal/oauth/cloudflare/meta.go index 470fb4d..b96621a 100644 --- a/utils/oauth/cloudflare/meta.go +++ b/internal/oauth/cloudflare/meta.go @@ -1,7 +1,7 @@ package cloudflare import ( - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" ) func init() { @@ -17,4 +17,4 @@ type Cloudflare struct { type Addition struct { TeamDomain string `json:"team_domain" required:"true"` PolicyAUD string `json:"policy_aud" required:"true"` -} \ No newline at end of file +} diff --git a/utils/oauth/factory/factory.go b/internal/oauth/factory/factory.go similarity index 96% rename from utils/oauth/factory/factory.go rename to internal/oauth/factory/factory.go index fec896e..d7b3818 100644 --- a/utils/oauth/factory/factory.go +++ b/internal/oauth/factory/factory.go @@ -3,7 +3,7 @@ package factory import ( "log" - "github.com/komari-monitor/komari/utils/item" + "github.com/komari-monitor/komari/pkg/item" ) var ( diff --git a/utils/oauth/factory/meta.go b/internal/oauth/factory/meta.go similarity index 100% rename from utils/oauth/factory/meta.go rename to internal/oauth/factory/meta.go diff --git a/utils/oauth/factory_test.go b/internal/oauth/factory_test.go similarity index 93% rename from utils/oauth/factory_test.go rename to internal/oauth/factory_test.go index 7023755..9f578e0 100644 --- a/utils/oauth/factory_test.go +++ b/internal/oauth/factory_test.go @@ -3,7 +3,7 @@ package oauth import ( "testing" - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" ) // Test function diff --git a/utils/oauth/generic/generic.go b/internal/oauth/generic/generic.go similarity index 97% rename from utils/oauth/generic/generic.go rename to internal/oauth/generic/generic.go index 745095d..cdc30b3 100644 --- a/utils/oauth/generic/generic.go +++ b/internal/oauth/generic/generic.go @@ -9,8 +9,8 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" + "github.com/komari-monitor/komari/pkg/utils" "github.com/patrickmn/go-cache" ) diff --git a/utils/oauth/generic/meta.go b/internal/oauth/generic/meta.go similarity index 91% rename from utils/oauth/generic/meta.go rename to internal/oauth/generic/meta.go index d229cd3..f104b1c 100644 --- a/utils/oauth/generic/meta.go +++ b/internal/oauth/generic/meta.go @@ -1,7 +1,7 @@ package generic import ( - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" "github.com/patrickmn/go-cache" ) diff --git a/utils/oauth/github/github.go b/internal/oauth/github/github.go similarity index 96% rename from utils/oauth/github/github.go rename to internal/oauth/github/github.go index b426f70..bf08190 100644 --- a/utils/oauth/github/github.go +++ b/internal/oauth/github/github.go @@ -8,8 +8,8 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" + "github.com/komari-monitor/komari/pkg/utils" "github.com/patrickmn/go-cache" ) diff --git a/utils/oauth/github/meta.go b/internal/oauth/github/meta.go similarity index 89% rename from utils/oauth/github/meta.go rename to internal/oauth/github/meta.go index ec07a41..6071012 100644 --- a/utils/oauth/github/meta.go +++ b/internal/oauth/github/meta.go @@ -1,7 +1,7 @@ package github import ( - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" "github.com/patrickmn/go-cache" ) diff --git a/utils/oauth/oauth.go b/internal/oauth/oauth.go similarity index 90% rename from utils/oauth/oauth.go rename to internal/oauth/oauth.go index 9b91970..aa9bfb2 100644 --- a/utils/oauth/oauth.go +++ b/internal/oauth/oauth.go @@ -6,10 +6,10 @@ import ( "log" "sync" - "github.com/komari-monitor/komari/database" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/oauth/factory" ) var ( diff --git a/utils/oauth/qq/meta.go b/internal/oauth/qq/meta.go similarity index 90% rename from utils/oauth/qq/meta.go rename to internal/oauth/qq/meta.go index da772d8..8ebe22e 100644 --- a/utils/oauth/qq/meta.go +++ b/internal/oauth/qq/meta.go @@ -1,7 +1,7 @@ package qq import ( - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" "github.com/patrickmn/go-cache" ) @@ -21,4 +21,4 @@ type Addition struct { AppId string `json:"app_id" required:"true"` AppKey string `json:"app_key" required:"true"` LoginType string `json:"login_type" required:"true"` // 登录方式,如qq, google等 -} \ No newline at end of file +} diff --git a/utils/oauth/qq/qq.go b/internal/oauth/qq/qq.go similarity index 97% rename from utils/oauth/qq/qq.go rename to internal/oauth/qq/qq.go index 10ea127..a676129 100644 --- a/utils/oauth/qq/qq.go +++ b/internal/oauth/qq/qq.go @@ -9,8 +9,8 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/utils" - "github.com/komari-monitor/komari/utils/oauth/factory" + "github.com/komari-monitor/komari/internal/oauth/factory" + "github.com/komari-monitor/komari/pkg/utils" "github.com/patrickmn/go-cache" ) diff --git a/utils/renewal/renewal.go b/internal/renewal/renewal.go similarity index 91% rename from utils/renewal/renewal.go rename to internal/renewal/renewal.go index 699537e..ad3e927 100644 --- a/utils/renewal/renewal.go +++ b/internal/renewal/renewal.go @@ -4,12 +4,12 @@ import ( "fmt" "time" - "github.com/komari-monitor/komari/database/auditlog" - "github.com/komari-monitor/komari/database/clients" - "github.com/komari-monitor/komari/database/models" - messageevent "github.com/komari-monitor/komari/database/models/messageEvent" - "github.com/komari-monitor/komari/utils/messageSender" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/clients" + "github.com/komari-monitor/komari/internal/database/models" + messageevent "github.com/komari-monitor/komari/internal/database/models/messageEvent" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/internal/ws" ) func CheckAndAutoRenewal(client models.Client) { diff --git a/utils/version.go b/internal/version/ver.go similarity index 79% rename from utils/version.go rename to internal/version/ver.go index 85cf221..c687abd 100644 --- a/utils/version.go +++ b/internal/version/ver.go @@ -1,4 +1,4 @@ -package utils +package version var ( CurrentVersion = "0.0.1" diff --git a/ws/existingConnection.go b/internal/ws/existingConnection.go similarity index 98% rename from ws/existingConnection.go rename to internal/ws/existingConnection.go index 65e85a0..84c4087 100644 --- a/ws/existingConnection.go +++ b/internal/ws/existingConnection.go @@ -5,7 +5,7 @@ import ( "time" "github.com/gorilla/websocket" - "github.com/komari-monitor/komari/common" + "github.com/komari-monitor/komari/internal/common" ) var ( diff --git a/ws/origin.go b/internal/ws/origin.go similarity index 100% rename from ws/origin.go rename to internal/ws/origin.go diff --git a/ws/safeConn.go b/internal/ws/safeConn.go similarity index 100% rename from ws/safeConn.go rename to internal/ws/safeConn.go diff --git a/ws/upgrade.go b/internal/ws/upgrade.go similarity index 100% rename from ws/upgrade.go rename to internal/ws/upgrade.go diff --git a/main.go b/main.go index 7df62e3..aba51af 100644 --- a/main.go +++ b/main.go @@ -5,18 +5,18 @@ import ( "log/slog" "github.com/komari-monitor/komari/cmd" - "github.com/komari-monitor/komari/utils" - logutil "github.com/komari-monitor/komari/utils/log" + logutil "github.com/komari-monitor/komari/internal/log" + "github.com/komari-monitor/komari/internal/version" ) func main() { - if utils.VersionHash == "unknown" { + if version.VersionHash == "unknown" { logutil.SetupGlobalLogger(slog.LevelDebug) } else { logutil.SetupGlobalLogger(slog.LevelInfo) } - log.Printf("Komari Monitor %s (hash: %s)", utils.CurrentVersion, utils.VersionHash) + log.Printf("Komari Monitor %s (hash: %s)", version.CurrentVersion, version.VersionHash) cmd.Execute() } diff --git a/utils/cloudflared/cloudflared.go b/pkg/cloudflared/cloudflared.go similarity index 100% rename from utils/cloudflared/cloudflared.go rename to pkg/cloudflared/cloudflared.go diff --git a/utils/cloudflared/cloudflared_test.go b/pkg/cloudflared/cloudflared_test.go similarity index 86% rename from utils/cloudflared/cloudflared_test.go rename to pkg/cloudflared/cloudflared_test.go index 6473fb8..abc1013 100644 --- a/utils/cloudflared/cloudflared_test.go +++ b/pkg/cloudflared/cloudflared_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/komari-monitor/komari/utils/cloudflared" + "github.com/komari-monitor/komari/pkg/cloudflared" ) func TestRunCloudflared(t *testing.T) { diff --git a/utils/item/item.go b/pkg/item/item.go similarity index 100% rename from utils/item/item.go rename to pkg/item/item.go diff --git a/utils/rpc/context.go b/pkg/rpc/context.go similarity index 96% rename from utils/rpc/context.go rename to pkg/rpc/context.go index 966eee1..da88461 100644 --- a/utils/rpc/context.go +++ b/pkg/rpc/context.go @@ -7,7 +7,7 @@ package rpc import ( "context" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/models" ) // ContextMeta 保存一次 RPC 调用可用的鉴权/身份元数据。 diff --git a/utils/rpc/errors.go b/pkg/rpc/errors.go similarity index 100% rename from utils/rpc/errors.go rename to pkg/rpc/errors.go diff --git a/utils/rpc/internal.go b/pkg/rpc/internal.go similarity index 100% rename from utils/rpc/internal.go rename to pkg/rpc/internal.go diff --git a/utils/rpc/invoke.go b/pkg/rpc/invoke.go similarity index 100% rename from utils/rpc/invoke.go rename to pkg/rpc/invoke.go diff --git a/utils/rpc/meta.go b/pkg/rpc/meta.go similarity index 100% rename from utils/rpc/meta.go rename to pkg/rpc/meta.go diff --git a/utils/rpc/parse.go b/pkg/rpc/parse.go similarity index 100% rename from utils/rpc/parse.go rename to pkg/rpc/parse.go diff --git a/utils/rpc/registry.go b/pkg/rpc/registry.go similarity index 100% rename from utils/rpc/registry.go rename to pkg/rpc/registry.go diff --git a/utils/rpc/request.go b/pkg/rpc/request.go similarity index 100% rename from utils/rpc/request.go rename to pkg/rpc/request.go diff --git a/utils/rpc/response.go b/pkg/rpc/response.go similarity index 100% rename from utils/rpc/response.go rename to pkg/rpc/response.go diff --git a/utils/rpc/rpc.go b/pkg/rpc/rpc.go similarity index 100% rename from utils/rpc/rpc.go rename to pkg/rpc/rpc.go diff --git a/utils/rpc/rpc_test.go b/pkg/rpc/rpc_test.go similarity index 100% rename from utils/rpc/rpc_test.go rename to pkg/rpc/rpc_test.go diff --git a/utils/gin.go b/pkg/utils/gin.go similarity index 100% rename from utils/gin.go rename to pkg/utils/gin.go diff --git a/utils/pingSchedule.go b/pkg/utils/pingSchedule.go similarity index 95% rename from utils/pingSchedule.go rename to pkg/utils/pingSchedule.go index 688563c..49476de 100644 --- a/utils/pingSchedule.go +++ b/pkg/utils/pingSchedule.go @@ -5,8 +5,8 @@ import ( "sync" "time" - "github.com/komari-monitor/komari/database/models" - "github.com/komari-monitor/komari/ws" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/ws" ) // PingTaskManager 管理定时器和任务 diff --git a/utils/random.go b/pkg/utils/random.go similarity index 100% rename from utils/random.go rename to pkg/utils/random.go diff --git a/utils/safaMap.go b/pkg/utils/safaMap.go similarity index 100% rename from utils/safaMap.go rename to pkg/utils/safaMap.go diff --git a/utils/utils.go b/pkg/utils/utils.go similarity index 99% rename from utils/utils.go rename to pkg/utils/utils.go index a4931e1..2dabd1b 100644 --- a/utils/utils.go +++ b/pkg/utils/utils.go @@ -5,8 +5,8 @@ import ( "strings" "time" - "github.com/komari-monitor/komari/common" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/models" ) // AverageReport 根据 topPercentage 参数计算报告的平均值。 diff --git a/public/public.go b/public/public.go index 3adf347..449c00f 100644 --- a/public/public.go +++ b/public/public.go @@ -14,8 +14,8 @@ import ( "strings" "github.com/gin-gonic/gin" - "github.com/komari-monitor/komari/database/config" - "github.com/komari-monitor/komari/database/models" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/models" ) //go:embed dist diff --git a/server/grpc.go b/server/grpc.go new file mode 100644 index 0000000..94048c8 --- /dev/null +++ b/server/grpc.go @@ -0,0 +1,394 @@ +package server + +import ( + "fmt" + "log" + + "context" + "errors" + "io" + "math" + "net" + "strings" + "sync" + "time" + + apiClient "github.com/komari-monitor/komari/internal/api_v1/client" + "github.com/komari-monitor/komari/internal/common" + "github.com/komari-monitor/komari/internal/database/auditlog" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/database/dbcore" + "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/geoip" + "github.com/komari-monitor/komari/internal/notifier" + "github.com/komari-monitor/komari/internal/ws" + + "github.com/komari-monitor/komari/internal/nezha/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" + "gorm.io/gorm/clause" +) + +func StartNezhaGRPCServer(listen string) { + if err := StartNezhaCompat(listen); err != nil { + log.Printf("Nezha compat server error: %v", err) + auditlog.EventLog("error", fmt.Sprintf("Nezha compat server error: %v", err)) + } + config.Subscribe(func(event config.ConfigEvent) { + if event.New.NezhaCompatEnabled != event.Old.NezhaCompatEnabled { + if event.New.NezhaCompatEnabled { + if err := StartNezhaCompat(event.New.NezhaCompatListen); err != nil { + log.Printf("start Nezha compat server error: %v", err) + auditlog.EventLog("error", fmt.Sprintf("start Nezha compat server error: %v", err)) + } + } else { + if err := StopNezhaCompat(); err != nil { + log.Printf("stop Nezha compat server error: %v", err) + auditlog.EventLog("error", fmt.Sprintf("stop Nezha compat server error: %v", err)) + } + } + } + + }) +} + +// ---- Manual start/stop support ---- +var ( + nezhaSrv *grpc.Server + nezhaLis net.Listener + nezhaOnceM sync.Mutex +) + +// StartNezhaCompat starts the Nezha compatible gRPC server asynchronously. +// Returns error if already started. +func StartNezhaCompat(addr string) error { + nezhaOnceM.Lock() + defer nezhaOnceM.Unlock() + if nezhaSrv != nil { + return errors.New("nezha compat server already started") + } + lis, err := net.Listen("tcp", addr) + if err != nil { + return err + } + boot := uint64(time.Now().Unix()) + sImpl := &nezhaCompatServer{bootTime: boot} + + unary := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + return handler(ctx, req) + } + stream := func(srvIface interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + return handler(srvIface, ss) + } + gs := grpc.NewServer( + grpc.UnaryInterceptor(unary), + grpc.StreamInterceptor(stream), + grpc.KeepaliveParams(keepalive.ServerParameters{Time: 2 * time.Minute, Timeout: 20 * time.Second}), + grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{MinTime: 20 * time.Second, PermitWithoutStream: true}), + ) + proto.RegisterNezhaServiceServer(gs, sImpl) + nezhaSrv = gs + nezhaLis = lis + go func() { + if err := gs.Serve(lis); err != nil { + log.Printf("Nezha compat gRPC server stopped: %v", err) + } + }() + log.Printf("Nezha compat gRPC started on %s", addr) + return nil +} + +// StopNezhaCompat stops the server if running. +func StopNezhaCompat() error { + nezhaOnceM.Lock() + defer nezhaOnceM.Unlock() + if nezhaSrv == nil { + return errors.New("nezha compat server not running") + } + // 强制立即断开所有连接与流,不等待在途 RPC 完成。 + nezhaSrv.Stop() + // Listener close (Serve already returns after GracefulStop, but close to be explicit) + if nezhaLis != nil { + _ = nezhaLis.Close() + } + nezhaSrv = nil + nezhaLis = nil + log.Printf("Nezha compat gRPC stopped") + return nil +} + +type nezhaCompatServer struct { + proto.UnimplementedNezhaServiceServer + bootTime uint64 +} + +// authentication helpers +func getAuth(ctx context.Context) (uuid string, secret string, err error) { + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + return "", "", errors.New("missing metadata") + } + getFirst := func(key string) string { + vals := md.Get(key) + if len(vals) > 0 { + return vals[0] + } + return "" + } + uuid = getFirst("client_uuid") + secret = getFirst("client_secret") + if uuid == "" || secret == "" { + return "", "", errors.New("unauthorized: missing client_uuid/client_secret") + } + return uuid, secret, nil +} + +// ReportSystemInfo: upsert static host info +func (s *nezhaCompatServer) ReportSystemInfo(ctx context.Context, host *proto.Host) (*proto.Receipt, error) { + uuid, secret, err := getAuth(ctx) + if err != nil { + return nil, err + } + if err := upsertClientFromHost(uuid, secret, host); err != nil { + return nil, err + } + return &proto.Receipt{Proced: true}, nil +} + +// ReportSystemInfo2: same as above but returns dashboard boot time +func (s *nezhaCompatServer) ReportSystemInfo2(ctx context.Context, host *proto.Host) (*proto.Uint64Receipt, error) { + uuid, secret, err := getAuth(ctx) + if err != nil { + return nil, err + } + if err := upsertClientFromHost(uuid, secret, host); err != nil { + return nil, err + } + return &proto.Uint64Receipt{Data: s.bootTime}, nil +} + +// ReportSystemState: ingest time-series records +func (s *nezhaCompatServer) ReportSystemState(stream proto.NezhaService_ReportSystemStateServer) error { + ctx := stream.Context() + uuid, _, err := getAuth(ctx) + if err != nil { + return err + } + // presence start + connID := time.Now().UnixNano() + ws.SetPresence(uuid, connID, true) + go notifier.OnlineNotification(uuid, connID) + defer func() { + ws.SetPresence(uuid, connID, false) + notifier.OfflineNotification(uuid, connID) + }() + for { + st, err := stream.Recv() + if err == io.EOF { + return nil + } + if err != nil { + return err + } + // refresh presence TTL on every frame + ws.KeepAlivePresence(uuid, connID, 30*time.Second) + if err := ingestState(uuid, st); err != nil { + // still ack to avoid client stuck; log error + log.Printf("Nezha ingest state error: %v", err) + } + if err := stream.Send(&proto.Receipt{Proced: true}); err != nil { + return err + } + } +} + +// RequestTask: do not dispatch tasks, just drain results to avoid Unimplemented +func (s *nezhaCompatServer) RequestTask(stream proto.NezhaService_RequestTaskServer) error { + ctx := stream.Context() + uuid, _, err := getAuth(ctx) + if err != nil { + return err + } + ticker := time.NewTicker(10 * time.Second) + defer ticker.Stop() + connID := time.Now().UnixNano() + ws.SetPresence(uuid, connID, true) + defer ws.SetPresence(uuid, connID, false) + // receive results in background + recvErr := make(chan error, 1) + go func() { + for { + _, rerr := stream.Recv() + if rerr == io.EOF { + recvErr <- nil + return + } + if rerr != nil { + recvErr <- rerr + return + } + // refresh presence TTL when result received + ws.KeepAlivePresence(uuid, connID, 30*time.Second) + } + }() + // send heartbeat tasks periodically + for { + select { + case <-ctx.Done(): + return ctx.Err() + case err := <-recvErr: + return err + case <-ticker.C: + if err := stream.Send(&proto.Task{}); err != nil { + return err + } + } + } +} + +// Unimplemented methods intentionally left as default (IOStream, ReportGeoIP) + +// upsertClientFromHost maps Host into models.Client and upserts by UUID +func upsertClientFromHost(uuid, secret string, h *proto.Host) error { + db := dbcore.GetDBInstance() + now := models.FromTime(time.Now()) + // token guard: if existing record has different token, reject + var exist models.Client + if err := db.Where("uuid = ?", uuid).First(&exist).Error; err == nil { + if exist.Token != "" && exist.Token != secret { + return errors.New("unauthorized: token mismatch") + } + } + cpuName := "" + if len(h.Cpu) > 0 { + cpuName = h.Cpu[0] + } + gpuName := strings.Join(h.Gpu, "; ") + osName := h.Platform + if h.PlatformVersion != "" { + osName = h.Platform + " " + h.PlatformVersion + } + // clamp uint64 to int64 safely + clamp := func(v uint64) int64 { + if v > uint64(math.MaxInt64) { + return math.MaxInt64 + } + return int64(v) + } + c := models.Client{ + UUID: uuid, + Token: secret, + Name: "nezha_" + uuid[0:8], + CpuName: cpuName, + Arch: h.Arch, + CpuCores: len(h.Cpu), + OS: osName, + KernelVersion: h.PlatformVersion, + Virtualization: h.Virtualization, + GpuName: gpuName, + MemTotal: clamp(h.MemTotal), + SwapTotal: clamp(h.SwapTotal), + DiskTotal: clamp(h.DiskTotal), + Version: h.Version, + UpdatedAt: now, + } + // Upsert by UUID; don't override existing Token if already set + updates := map[string]interface{}{ + "cpu_name": c.CpuName, + "arch": c.Arch, + "cpu_cores": c.CpuCores, + "os": c.OS, + "kernel_version": c.KernelVersion, + "virtualization": c.Virtualization, + "gpu_name": c.GpuName, + "mem_total": c.MemTotal, + "swap_total": c.SwapTotal, + "disk_total": c.DiskTotal, + "version": c.Version, + "updated_at": time.Now(), + } + return db.Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "uuid"}}, + DoUpdates: clause.Assignments(updates), + }).Create(&c).Error +} + +// ingestState maps Nezha State into common.Report then saves a Record +func ingestState(uuid string, st *proto.State) error { + // we may need totals from client + db := dbcore.GetDBInstance() + var client models.Client + if err := db.Where("uuid = ?", uuid).First(&client).Error; err != nil { + // If missing, create with minimal defaults to avoid failing ingestion + client = models.Client{UUID: uuid, Token: "", Name: "nezha_" + uuid[0:8]} + auditlog.EventLog("info", "auto created client "+client.Name) + _ = db.Create(&client).Error + } + rep := common.Report{ + CPU: common.CPUReport{Usage: st.Cpu}, + Ram: common.RamReport{Total: client.MemTotal, Used: int64(st.MemUsed)}, + Swap: common.RamReport{Total: client.SwapTotal, Used: int64(st.SwapUsed)}, + Load: common.LoadReport{Load1: st.Load1, Load5: st.Load5, Load15: st.Load15}, + Disk: common.DiskReport{Total: client.DiskTotal, Used: int64(st.DiskUsed)}, + Network: common.NetworkReport{ + Up: int64(st.NetOutSpeed), + Down: int64(st.NetInSpeed), + TotalUp: int64(st.NetOutTransfer), + TotalDown: int64(st.NetInTransfer), + }, + Uptime: int64(st.Uptime), + Process: int(st.ProcessCount), + UpdatedAt: time.Now(), + } + // 更新实时缓存供前端使用 + ws.SetLatestReport(uuid, &rep) + // 写入内存缓存,入库交由定时聚合任务处理 + return apiClient.SaveClientReport(uuid, rep) +} + +// ReportGeoIP: 保存 Agent 上报的 IP,并回填国家码/面板启动时间 +func (s *nezhaCompatServer) ReportGeoIP(ctx context.Context, in *proto.GeoIP) (*proto.GeoIP, error) { + uuid, _, err := getAuth(ctx) + if err != nil { + return nil, err + } + updates := map[string]interface{}{ + "updated_at": time.Now(), + } + var iso string + if in != nil && in.Ip != nil { + if v4 := strings.TrimSpace(in.Ip.Ipv4); v4 != "" { + updates["ipv4"] = v4 + if cfg, err := config.Get(); err == nil && cfg.GeoIpEnabled { + if ip := net.ParseIP(v4); ip != nil { + if gi, _ := geoip.GetGeoInfo(ip); gi != nil { + iso = gi.ISOCode + } + } + } + } + if v6 := strings.TrimSpace(in.Ip.Ipv6); v6 != "" { + updates["ipv6"] = v6 + if iso == "" { // 优先使用 v4 的国家码 + if cfg, err := config.Get(); err == nil && cfg.GeoIpEnabled { + if ip := net.ParseIP(v6); ip != nil { + if gi, _ := geoip.GetGeoInfo(ip); gi != nil { + iso = gi.ISOCode + } + } + } + } + } + } + if iso != "" { + // UI 使用旗帜 emoji + updates["region"] = geoip.GetRegionUnicodeEmoji(iso) + } + if len(updates) > 0 { + _ = dbcore.GetDBInstance().Model(&models.Client{}).Where("uuid = ?", uuid).Updates(updates).Error + } + // 回写 GeoIP(包含国家码与面板启动时间) + resp := &proto.GeoIP{Use6: in.GetUse6(), Ip: in.GetIp(), CountryCode: iso, DashboardBootTime: s.bootTime} + return resp, nil +} diff --git a/server/routers.go b/server/routers.go new file mode 100644 index 0000000..cca2261 --- /dev/null +++ b/server/routers.go @@ -0,0 +1,232 @@ +package server + +import ( + "github.com/gin-gonic/gin" + api "github.com/komari-monitor/komari/internal/api_v1" + "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/jsonRpc" + "github.com/komari-monitor/komari/internal/api_v1/record" + "github.com/komari-monitor/komari/internal/api_v1/task" + "github.com/komari-monitor/komari/internal/database/config" + "github.com/komari-monitor/komari/internal/geoip" + "github.com/komari-monitor/komari/internal/messageSender" + "github.com/komari-monitor/komari/public" +) + +var ( + DynamicCorsEnabled bool = false +) + +func Init(r *gin.Engine) { + conf, _ := config.Get() + // 动态 CORS 中间件 + DynamicCorsEnabled = conf.AllowCors + + config.Subscribe(func(event config.ConfigEvent) { + DynamicCorsEnabled = event.New.AllowCors + if event.New.GeoIpProvider != event.Old.GeoIpProvider { + go geoip.InitGeoIp() + } + if event.New.NotificationMethod != event.Old.NotificationMethod { + go messageSender.Initialize() + } + }) + + r.Use(func(c *gin.Context) { + if DynamicCorsEnabled { + c.Header("Access-Control-Allow-Origin", "*") + c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS") + c.Header("Access-Control-Allow-Headers", "Origin, Content-Length, Content-Type, Authorization, Accept, X-CSRF-Token, X-Requested-With, Set-Cookie") + c.Header("Access-Control-Expose-Headers", "Content-Length, Authorization, Set-Cookie") + c.Header("Access-Control-Allow-Credentials", "false") + c.Header("Access-Control-Max-Age", "43200") // 12 hours + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(204) + return + } + } + c.Next() + }) + + r.Use(api.PrivateSiteMiddleware()) + + 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.Any("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + // #region 公开路由 + r.POST("/api/login", api.Login) + r.GET("/api/me", api.GetMe) + r.GET("/api/clients", api.GetClients) + r.GET("/api/nodes", api.GetNodesInformation) + r.GET("/api/public", api.GetPublicSettings) + r.GET("/api/oauth", api.OAuth) + r.GET("/api/oauth_callback", api.OAuthCallback) + r.GET("/api/logout", api.Logout) + r.GET("/api/version", api.GetVersion) + r.GET("/api/recent/:uuid", api.GetClientRecentRecords) + + r.GET("/api/records/load", record.GetRecordsByUUID) + r.GET("/api/records/ping", record.GetPingRecords) + r.GET("/api/task/ping", task.GetPublicPingTasks) + r.GET("/api/rpc2", jsonRpc.OnRpcRequest) + r.POST("/api/rpc2", jsonRpc.OnRpcRequest) + + // #region Agent + r.POST("/api/clients/register", client.RegisterClient) + tokenAuthrized := r.Group("/api/clients", api.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", api.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", api.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) + + } + + } + + public.Static(r.Group("/"), func(handlers ...gin.HandlerFunc) { + r.NoRoute(handlers...) + }) + // #region 静态文件服务 + public.UpdateIndex(conf) + config.Subscribe(func(event config.ConfigEvent) { + public.UpdateIndex(event.New) + }) +} diff --git a/utils/messageSender/all.go b/utils/messageSender/all.go deleted file mode 100644 index ebaff07..0000000 --- a/utils/messageSender/all.go +++ /dev/null @@ -1,15 +0,0 @@ -package messageSender - -import ( - _ "github.com/komari-monitor/komari/utils/messageSender/bark" - _ "github.com/komari-monitor/komari/utils/messageSender/email" - _ "github.com/komari-monitor/komari/utils/messageSender/empty" - _ "github.com/komari-monitor/komari/utils/messageSender/serverchan3" - _ "github.com/komari-monitor/komari/utils/messageSender/serverchanturbo" - _ "github.com/komari-monitor/komari/utils/messageSender/javascript" - _ "github.com/komari-monitor/komari/utils/messageSender/telegram" - _ "github.com/komari-monitor/komari/utils/messageSender/webhook" -) - -func All() { -} diff --git a/utils/messageSender/serverchan3/meta.go b/utils/messageSender/serverchan3/meta.go deleted file mode 100644 index acb7ecd..0000000 --- a/utils/messageSender/serverchan3/meta.go +++ /dev/null @@ -1,21 +0,0 @@ -package serverchan3 - -import ( - "github.com/komari-monitor/komari/utils/messageSender/factory" -) - -// Addition 为 Server酱³ 推送通道的配置项 -// 所有字段通过管理页面以 JSON 形式进行设置 -type Addition struct { - // APIURL 为接口完整地址,例如:https://.push.ft07.com/send/.send - APIURL string `json:"api_url" required:"true" help:"接口完整地址,例如 https://.push.ft07.com/send/.send;参考:https://sc3.ft07.com/"` - // Tags 为可选标签,使用 | 分割,例如:tag1|tag2|tag3 - Tags string `json:"tags" help:"可选标签,使用 | 分割,例如 tag1|tag2|tag3"` -} - -// 注册 Server酱³ 推送通道到工厂 -func init() { - factory.RegisterMessageSender(func() factory.IMessageSender { - return &ServerChan3Sender{} - }) -} \ No newline at end of file diff --git a/utils/messageSender/serverchanturbo/meta.go b/utils/messageSender/serverchanturbo/meta.go deleted file mode 100644 index 231ed0b..0000000 --- a/utils/messageSender/serverchanturbo/meta.go +++ /dev/null @@ -1,25 +0,0 @@ -package serverchanturbo - -import ( - "github.com/komari-monitor/komari/utils/messageSender/factory" -) - -// Addition 为 Server酱 Turbo 推送通道的配置项 -// 仅允许配置接口地址及可选的通道/隐藏IP/openid,固定以 JSON 发送 -type Addition struct { - // APIURL 为接口完整地址,例如:https://sctapi.ftqq.com/.send - APIURL string `json:"api_url" required:"true" help:"接口完整地址,例如 https://sctapi.ftqq.com/.send;参考:https://sct.ftqq.com/"` - // Channel 为本次推送使用的消息通道,最多两个,多个用 | 隔开,例如:9|66 - Channel string `json:"channel" help:"消息通道,可选,多个用 | 隔开,例如 9|66"` - // NoIP 是否隐藏调用 IP,填 1 则隐藏 - NoIP string `json:"noip" help:"是否隐藏调用IP,填 1 隐藏;为空则不隐藏"` - // OpenID 消息抄送 openid,测试号用 , 分隔;企业微信应用用 | 分隔 - OpenID string `json:"openid" help:"抄送 openid,测试号用 , 分隔;企业微信应用用 | 分隔"` -} - -// 注册 Server酱 Turbo 推送通道到工厂 -func init() { - factory.RegisterMessageSender(func() factory.IMessageSender { - return &ServerChanTurboSender{} - }) -} \ No newline at end of file diff --git a/utils/oauth/all.go b/utils/oauth/all.go deleted file mode 100644 index 4fbf699..0000000 --- a/utils/oauth/all.go +++ /dev/null @@ -1,13 +0,0 @@ -package oauth - -import ( - _ "github.com/komari-monitor/komari/utils/oauth/cloudflare" - _ "github.com/komari-monitor/komari/utils/oauth/factory" - _ "github.com/komari-monitor/komari/utils/oauth/generic" - _ "github.com/komari-monitor/komari/utils/oauth/github" - _ "github.com/komari-monitor/komari/utils/oauth/qq" -) - -func All() { - //empty function to ensure all OIDC providers are registered -} \ No newline at end of file