diff --git a/cmd/server.go b/cmd/server.go index d3cfb45..18127ab 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -24,10 +24,8 @@ import ( "github.com/komari-monitor/komari/internal/database/records" "github.com/komari-monitor/komari/internal/database/tasks" "github.com/komari-monitor/komari/internal/eventType" - "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/oauth" "github.com/komari-monitor/komari/internal/patch" "github.com/komari-monitor/komari/internal/restore" "github.com/komari-monitor/komari/pkg/cloudflared" @@ -80,10 +78,8 @@ func RunServer() { event.Trigger(eventType.ServerInitializeStart, event.M{"config": config, "engine": r}) - go geoip.InitGeoIp() go DoScheduledWork() go messageSender.Initialize() - go oauth.Initialize() server.StartNezhaGRPCServer(config.NezhaCompatListen) diff --git a/internal/conf/config.go b/internal/conf/config.go index b090535..6b9c483 100644 --- a/internal/conf/config.go +++ b/internal/conf/config.go @@ -45,11 +45,11 @@ func Override(cst Config) error { oldConf := *Conf Conf = &cst - event.Trigger(eventType.ConfigUpdated, event.M{ + err, _ = event.Trigger(eventType.ConfigUpdated, event.M{ "old": oldConf, "new": cst, }) - return nil + return err } func SavePartial(cst map[string]interface{}) error { diff --git a/internal/database/notification/load.go b/internal/database/notification/load.go index a377940..784b194 100644 --- a/internal/database/notification/load.go +++ b/internal/database/notification/load.go @@ -59,10 +59,5 @@ func SaveLoadNotification(record models.LoadNotification) error { } func ReloadLoadNotificationSchedule() error { - db := dbcore.GetDBInstance() - var loadNotifications []models.LoadNotification - if err := db.Find(&loadNotifications).Error; err != nil { - return err - } - return notifier.ReloadLoadNotificationSchedule(loadNotifications) + return notifier.ReloadLoadNotification() } diff --git a/internal/geoip/geoip.go b/internal/geoip/geoip.go index 4cd6478..dee5adc 100644 --- a/internal/geoip/geoip.go +++ b/internal/geoip/geoip.go @@ -7,7 +7,9 @@ import ( "time" "unicode" + "github.com/gookit/event" "github.com/komari-monitor/komari/internal/conf" + "github.com/komari-monitor/komari/internal/eventType" "github.com/patrickmn/go-cache" ) @@ -22,44 +24,31 @@ type GeoInfo struct { func init() { CurrentProvider = &EmptyProvider{} geoCache = cache.New(48*time.Hour, 1*time.Hour) -} -// GeoIPService 接口定义了获取地理位置信息的核心方法。 -// 任何实现此接口的类型都可以作为地理位置服务提供者。 -type GeoIPService interface { - Name() string - - GetGeoInfo(ip net.IP) (*GeoInfo, error) - - UpdateDatabase() error - - Close() error -} - -func GetRegionUnicodeEmoji(isoCode string) string { - if len(isoCode) != 2 { - return "" - } - isoCode = strings.ToUpper(isoCode) - - if !unicode.IsLetter(rune(isoCode[0])) || !unicode.IsLetter(rune(isoCode[1])) { - return "" - } - - rune1 := rune(0x1F1E6 + (rune(isoCode[0]) - 'A')) - rune2 := rune(0x1F1E6 + (rune(isoCode[1]) - 'A')) - return string(rune1) + string(rune2) -} - -func InitGeoIp() { - config, err := conf.GetWithV1Format() + err := SetProvider(conf.Conf.GeoIp.GeoIpProvider) if err != nil { - panic("Failed to get configuration for GeoIP: " + err.Error()) + log.Printf("Failed to set initial GeoIP provider: %v", err) } - if !config.GeoIpEnabled { - return - } - switch config.GeoIpProvider { + + event.On(eventType.ConfigUpdated, event.ListenerFunc(func(e event.Event) error { + oldConf, newConf, err := conf.FromEvent(e) + if oldConf.GeoIp.GeoIpProvider == newConf.GeoIp.GeoIpProvider { + return nil + } + if err != nil { + log.Printf("Failed to parse config from event: %v", err) + return err + } + err = SetProvider(newConf.GeoIp.GeoIpProvider) + if err != nil { + log.Printf("Failed to set GeoIP provider: %v", err) + } + return nil + })) +} + +func SetProvider(provider string) error { + switch provider { case "mmdb": NewCurrentProvider, err := NewMaxMindGeoIPService() if err != nil { @@ -110,6 +99,34 @@ func InitGeoIp() { default: CurrentProvider = &EmptyProvider{} } + return nil +} + +// GeoIPService 接口定义了获取地理位置信息的核心方法。 +// 任何实现此接口的类型都可以作为地理位置服务提供者。 +type GeoIPService interface { + Name() string + + GetGeoInfo(ip net.IP) (*GeoInfo, error) + + UpdateDatabase() error + + Close() error +} + +func GetRegionUnicodeEmoji(isoCode string) string { + if len(isoCode) != 2 { + return "" + } + isoCode = strings.ToUpper(isoCode) + + if !unicode.IsLetter(rune(isoCode[0])) || !unicode.IsLetter(rune(isoCode[1])) { + return "" + } + + rune1 := rune(0x1F1E6 + (rune(isoCode[0]) - 'A')) + rune2 := rune(0x1F1E6 + (rune(isoCode[1]) - 'A')) + return string(rune1) + string(rune2) } func GetGeoInfo(ip net.IP) (*GeoInfo, error) { diff --git a/internal/messageSender/init.go b/internal/messageSender/init.go index 370388d..4ea4dfa 100644 --- a/internal/messageSender/init.go +++ b/internal/messageSender/init.go @@ -1,15 +1,11 @@ package messageSender import ( - "fmt" "log" "github.com/gookit/event" "github.com/komari-monitor/komari/internal/conf" - "github.com/komari-monitor/komari/internal/database" - "github.com/komari-monitor/komari/internal/database/auditlog" "github.com/komari-monitor/komari/internal/eventType" - "github.com/komari-monitor/komari/internal/oauth" ) func init() { @@ -19,18 +15,6 @@ func init() { log.Printf("Failed to parse config from event: %v", err) return err } - if newConf.Login.OAuthProvider != oldConf.Login.OAuthProvider { - oidcProvider, err := database.GetOidcConfigByName(newConf.Login.OAuthProvider) - if err != nil { - log.Printf("Failed to get OIDC provider config: %v", err) - } else { - log.Printf("Using %s as OIDC provider", oidcProvider.Name) - } - err = oauth.LoadProvider(oidcProvider.Name, oidcProvider.Addition) - if err != nil { - auditlog.EventLog("error", fmt.Sprintf("Failed to load OIDC provider: %v", err)) - } - } if newConf.Notification.NotificationMethod != oldConf.Notification.NotificationMethod { Initialize() } diff --git a/internal/notifier/load.go b/internal/notifier/load.go index e3776bf..f89afe7 100644 --- a/internal/notifier/load.go +++ b/internal/notifier/load.go @@ -218,7 +218,11 @@ func updateLastNotified(taskId uint, notifyTime time.Time) { } } -// ReloadLoadNotificationSchedule 加载或重载时间表 -func ReloadLoadNotificationSchedule(loadNotifications []models.LoadNotification) error { +func ReloadLoadNotification() error { + db := dbcore.GetDBInstance() + var loadNotifications []models.LoadNotification + if err := db.Find(&loadNotifications).Error; err != nil { + return err + } return LoadNotificationManager.Reload(loadNotifications) } diff --git a/internal/oauth/oauth.go b/internal/oauth/oauth.go index b51de88..870432f 100644 --- a/internal/oauth/oauth.go +++ b/internal/oauth/oauth.go @@ -6,16 +6,18 @@ import ( "log" "sync" + "github.com/gookit/event" "github.com/komari-monitor/komari/internal/conf" "github.com/komari-monitor/komari/internal/database" + "github.com/komari-monitor/komari/internal/database/auditlog" "github.com/komari-monitor/komari/internal/database/models" + "github.com/komari-monitor/komari/internal/eventType" "github.com/komari-monitor/komari/internal/oauth/factory" ) var ( currentProvider factory.IOidcProvider mu = sync.Mutex{} - once = sync.Once{} ) func CurrentProvider() factory.IOidcProvider { @@ -47,44 +49,60 @@ func LoadProvider(name string, configJson string) error { return nil } -func Initialize() error { - once.Do(func() { - all := factory.GetAllOidcProviders() - for _, provider := range all { - if _, err := database.GetOidcConfigByName(provider.GetName()); err == nil { - continue - } - // 如果数据库中没有该提供者的配置,则保存默认配置 - config := provider.GetConfiguration() - configBytes, err := json.Marshal(config) - if err != nil { - log.Printf("Failed to marshal config for provider %s: %v", provider.GetName(), err) - return - } - if err := database.SaveOidcConfig(&models.OidcProvider{ - Name: provider.GetName(), - Addition: string(configBytes), - }); err != nil { - log.Printf("Failed to save default config for provider %s: %v", provider.GetName(), err) - return - } +func init() { + all := factory.GetAllOidcProviders() + for _, provider := range all { + if _, err := database.GetOidcConfigByName(provider.GetName()); err == nil { + continue } - }) + // 如果数据库中没有该提供者的配置,则保存默认配置 + config := provider.GetConfiguration() + configBytes, err := json.Marshal(config) + if err != nil { + log.Printf("Failed to marshal config for provider %s: %v", provider.GetName(), err) + return + } + if err := database.SaveOidcConfig(&models.OidcProvider{ + Name: provider.GetName(), + Addition: string(configBytes), + }); err != nil { + log.Printf("Failed to save default config for provider %s: %v", provider.GetName(), err) + return + } + } + cfg, _ := conf.GetWithV1Format() if cfg.OAuthProvider == "" || cfg.OAuthProvider == "none" { LoadProvider("empty", "{}") - return nil } provider, err := database.GetOidcConfigByName(cfg.OAuthProvider) if err != nil { // 如果没有找到配置,使用empty provider LoadProvider("empty", "{}") - return nil } err = LoadProvider(provider.Name, provider.Addition) if err != nil { log.Printf("Failed to load OIDC provider %s: %v", provider.Name, err) - return err } - return nil + + event.On(eventType.ConfigUpdated, event.ListenerFunc(func(e event.Event) error { + oldConf, newConf, err := conf.FromEvent(e) + if err != nil { + log.Printf("Failed to parse config from event: %v", err) + } + + if newConf.Login.OAuthProvider != oldConf.Login.OAuthProvider { + oidcProvider, err := database.GetOidcConfigByName(newConf.Login.OAuthProvider) + if err != nil { + log.Printf("Failed to get OIDC provider config: %v", err) + } else { + log.Printf("Using %s as OIDC provider", oidcProvider.Name) + } + err = LoadProvider(oidcProvider.Name, oidcProvider.Addition) + if err != nil { + auditlog.EventLog("error", fmt.Sprintf("Failed to load OIDC provider: %v", err)) + } + } + return nil + })) } diff --git a/server/routers.go b/server/routers.go index e951982..25a106b 100644 --- a/server/routers.go +++ b/server/routers.go @@ -7,7 +7,6 @@ import ( "github.com/komari-monitor/komari/internal/api_rpc" "github.com/komari-monitor/komari/internal/conf" "github.com/komari-monitor/komari/internal/eventType" - "github.com/komari-monitor/komari/internal/geoip" "github.com/komari-monitor/komari/internal/messageSender" "github.com/komari-monitor/komari/public" ) @@ -25,9 +24,7 @@ func Init(r *gin.Engine) { oldConf := e.Get("old").(conf.Config) AllowCors = newConf.Site.AllowCors public.UpdateIndex(newConf.ToV1Format()) - if newConf.GeoIp.GeoIpProvider != oldConf.GeoIp.GeoIpProvider { - go geoip.InitGeoIp() - } + if newConf.Notification.NotificationMethod != oldConf.Notification.NotificationMethod { go messageSender.Initialize() }