package main import ( "os" "os/signal" "syscall" configViper "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common/config" "git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client" "github.com/spf13/viper" "go.uber.org/zap" ) func newConfig() (*viper.Viper, error) { var err error var dv = viper.New() defaultConfiguration(dv) _, err = configViper.CreateViper(configViper.WithConfigFile(*configFile), configViper.WithConfigDir(*configDir), configViper.WithEnvPrefix(EnvPrefix), configViper.WithViper(dv)) if err != nil { return nil, err } return dv, err } func reloadConfig() error { err := configViper.ReloadViper(configViper.WithConfigFile(*configFile), configViper.WithConfigDir(*configDir), configViper.WithEnvPrefix(EnvPrefix), configViper.WithViper(cfg)) if err != nil { return err } err = logPrm.SetLevelString(cfg.GetString("logger.level")) if err != nil { return err } return logPrm.Reload() } func watchForSignal(cancel func()) { ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) for { select { case err := <-intErr: log.Info(logs.FrostFSIRInternalError, zap.String("msg", err.Error())) cancel() shutdown() return case sig := <-ch: switch sig { case syscall.SIGHUP: log.Info(logs.FrostFSNodeSIGHUPHasBeenReceivedRereadingConfiguration) err := reloadConfig() if err != nil { log.Error(logs.FrostFSNodeConfigurationReading, zap.Error(err)) } pprofCmp.reload() metricsCmp.reload() log.Info(logs.FrostFSIRReloadExtraWallets) err = innerRing.SetExtraWallets(cfg) if err != nil { log.Error(logs.FrostFSNodeConfigurationReading, zap.Error(err)) } client.CleanInvScript = cfg.GetBool("morph.cleaninvscript") log.Info(logs.FrostFSNodeConfigurationHasBeenReloadedSuccessfully) case syscall.SIGTERM, syscall.SIGINT: log.Info(logs.FrostFSNodeTerminationSignalHasBeenReceivedStopping) cancel() shutdown() log.Info(logs.FrostFSNodeTerminationSignalProcessingIsComplete) return } } } }