From 4f623146464995db86b9aa58c6fcec3fd78f64e0 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 13 Dec 2024 18:36:45 +0700 Subject: [PATCH] cmd/cli: do API reloading if exlcude list changed --- cmd/cli/cli.go | 16 ++++++++++------ cmd/cli/prog.go | 30 +++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 74919d9..f0e927d 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -301,7 +301,7 @@ func run(appCallback *AppCallback, stopCh chan struct{}) { } if cdUID != "" { validateCdUpstreamProtocol() - if err := processCDFlags(&cfg); err != nil { + if rc, err := processCDFlags(&cfg); err != nil { if isMobile() { appCallback.Exit(err.Error()) return @@ -315,6 +315,10 @@ func run(appCallback *AppCallback, stopCh chan struct{}) { } notifyExitToLogServer() cdLogger.Fatal().Err(err).Msg("failed to fetch resolver config") + } else { + p.mu.Lock() + p.rc = rc + p.mu.Unlock() } } @@ -604,7 +608,7 @@ func deactivationPinNotSet() bool { return cdDeactivationPin.Load() == defaultDeactivationPin } -func processCDFlags(cfg *ctrld.Config) error { +func processCDFlags(cfg *ctrld.Config) (*controld.ResolverConfig, error) { logger := mainLog.Load().With().Str("mode", "cd").Logger() logger.Info().Msgf("fetching Controld D configuration from API: %s", cdUID) bo := backoff.NewBackoff("processCDFlags", logf, 30*time.Second) @@ -622,10 +626,10 @@ func processCDFlags(cfg *ctrld.Config) error { } if err != nil { if isMobile() { - return err + return nil, err } logger.Warn().Err(err).Msg("could not fetch resolver config") - return err + return nil, err } if resolverConfig.DeactivationPin != nil { @@ -641,7 +645,7 @@ func processCDFlags(cfg *ctrld.Config) error { logger.Info().Msg("using defined custom config of Control-D resolver") if err := validateCdRemoteConfig(resolverConfig, cfg); err == nil { setListenerDefaultValue(cfg) - return nil + return resolverConfig, nil } mainLog.Load().Err(err).Msg("disregarding invalid custom config") } @@ -688,7 +692,7 @@ func processCDFlags(cfg *ctrld.Config) error { // Set default value. setListenerDefaultValue(cfg) - return nil + return resolverConfig, nil } // setListenerDefaultValue sets the default value for cfg.Listener if none existed. diff --git a/cmd/cli/prog.go b/cmd/cli/prog.go index 046c0c9..6deda4e 100644 --- a/cmd/cli/prog.go +++ b/cmd/cli/prog.go @@ -84,6 +84,7 @@ type prog struct { dnsWg sync.WaitGroup dnsWatcherClosedOnce sync.Once dnsWatcherStopCh chan struct{} + rc *controld.ResolverConfig cfg *ctrld.Config localUpstreams []string @@ -165,11 +166,13 @@ func (p *prog) runWait() { if newCfg == nil { newCfg = &ctrld.Config{} + confFile := v.ConfigFileUsed() v := viper.NewWithOptions(viper.KeyDelimiter("::")) ctrld.InitConfig(v, "ctrld") if configPath != "" { - v.SetConfigFile(configPath) + confFile = configPath } + v.SetConfigFile(confFile) if err := v.ReadInConfig(); err != nil { logger.Err(err).Msg("could not read new config") waitOldRunDone() @@ -181,10 +184,14 @@ func (p *prog) runWait() { continue } if cdUID != "" { - if err := processCDFlags(newCfg); err != nil { + if rc, err := processCDFlags(newCfg); err != nil { logger.Err(err).Msg("could not fetch ControlD config") waitOldRunDone() continue + } else { + p.mu.Lock() + p.rc = rc + p.mu.Unlock() } } } @@ -291,7 +298,24 @@ func (p *prog) apiConfigReload() { cdDeactivationPin.Store(defaultDeactivationPin) } - if resolverConfig.Ctrld.CustomConfig == "" { + p.mu.Lock() + rc := p.rc + p.rc = resolverConfig + p.mu.Unlock() + noCustomConfig := resolverConfig.Ctrld.CustomConfig == "" + noExcludeListChanged := true + if rc != nil { + slices.Sort(rc.Exclude) + slices.Sort(resolverConfig.Exclude) + noExcludeListChanged = slices.Equal(rc.Exclude, resolverConfig.Exclude) + } + if noCustomConfig && noExcludeListChanged { + return + } + + if noCustomConfig && !noExcludeListChanged { + logger.Debug().Msg("exclude list changes detected, reloading...") + p.apiReloadCh <- nil return }