From 7e5ce976681e99be6b26d428935ba1106d530efa Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 12 Jan 2018 08:02:11 -0600 Subject: Remove global cfg vars (#8099) * remove global cfg vars * enterprise update --- app/config.go | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 8 deletions(-) (limited to 'app/config.go') diff --git a/app/config.go b/app/config.go index 483804c99..3039d4426 100644 --- a/app/config.go +++ b/app/config.go @@ -16,29 +16,59 @@ import ( ) func (a *App) Config() *model.Config { - return utils.Cfg + if cfg := a.config.Load(); cfg != nil { + return cfg.(*model.Config) + } + return &model.Config{} } func (a *App) UpdateConfig(f func(*model.Config)) { - old := utils.Cfg.Clone() - f(utils.Cfg) - utils.InvokeGlobalConfigListeners(old, utils.Cfg) + old := a.Config() + updated := old.Clone() + f(updated) + a.config.Store(updated) + utils.Cfg = updated + a.InvokeConfigListeners(old, updated) } func (a *App) PersistConfig() { utils.SaveConfig(a.ConfigFileName(), a.Config()) } -func (a *App) ReloadConfig() { +func (a *App) LoadConfig(configFile string) *model.AppError { + old := a.Config() + + cfg, configPath, err := utils.LoadConfig(configFile) + if err != nil { + return err + } + + a.configFile = configPath + + utils.ConfigureLog(&cfg.LogSettings) + + a.config.Store(cfg) + utils.Cfg = cfg + + utils.SetSiteURL(*cfg.ServiceSettings.SiteURL) + + a.InvokeConfigListeners(old, cfg) + return nil +} + +func (a *App) ReloadConfig() *model.AppError { debug.FreeOSMemory() - utils.LoadGlobalConfig(a.ConfigFileName()) + if err := a.LoadConfig(a.configFile); err != nil { + return err + } // start/restart email batching job if necessary a.InitEmailBatching() + return nil } func (a *App) ConfigFileName() string { - return utils.CfgFileName + return a.configFile } func (a *App) ClientConfig() map[string]string { @@ -51,7 +81,9 @@ func (a *App) ClientConfigHash() string { func (a *App) EnableConfigWatch() { if a.configWatcher == nil && !a.disableConfigWatch { - configWatcher, err := utils.NewConfigWatcher(utils.CfgFileName) + configWatcher, err := utils.NewConfigWatcher(a.ConfigFileName(), func() { + a.ReloadConfig() + }) if err != nil { l4g.Error(err) } @@ -66,8 +98,73 @@ func (a *App) DisableConfigWatch() { } } +// Registers a function with a given to be called when the config is reloaded and may have changed. The function +// will be called with two arguments: the old config and the new config. AddConfigListener returns a unique ID +// for the listener that can later be used to remove it. +func (a *App) AddConfigListener(listener func(*model.Config, *model.Config)) string { + id := model.NewId() + a.configListeners[id] = listener + return id +} + +// Removes a listener function by the unique ID returned when AddConfigListener was called +func (a *App) RemoveConfigListener(id string) { + delete(a.configListeners, id) +} + +func (a *App) InvokeConfigListeners(old, current *model.Config) { + for _, listener := range a.configListeners { + listener(old, current) + } +} + func (a *App) regenerateClientConfig() { a.clientConfig = utils.GenerateClientConfig(a.Config(), a.DiagnosticId()) clientConfigJSON, _ := json.Marshal(a.clientConfig) a.clientConfigHash = fmt.Sprintf("%x", md5.Sum(clientConfigJSON)) } + +func (a *App) Desanitize(cfg *model.Config) { + actual := a.Config() + + if cfg.LdapSettings.BindPassword != nil && *cfg.LdapSettings.BindPassword == model.FAKE_SETTING { + *cfg.LdapSettings.BindPassword = *actual.LdapSettings.BindPassword + } + + if *cfg.FileSettings.PublicLinkSalt == model.FAKE_SETTING { + *cfg.FileSettings.PublicLinkSalt = *actual.FileSettings.PublicLinkSalt + } + if cfg.FileSettings.AmazonS3SecretAccessKey == model.FAKE_SETTING { + cfg.FileSettings.AmazonS3SecretAccessKey = actual.FileSettings.AmazonS3SecretAccessKey + } + + if cfg.EmailSettings.InviteSalt == model.FAKE_SETTING { + cfg.EmailSettings.InviteSalt = actual.EmailSettings.InviteSalt + } + if cfg.EmailSettings.SMTPPassword == model.FAKE_SETTING { + cfg.EmailSettings.SMTPPassword = actual.EmailSettings.SMTPPassword + } + + if cfg.GitLabSettings.Secret == model.FAKE_SETTING { + cfg.GitLabSettings.Secret = actual.GitLabSettings.Secret + } + + if *cfg.SqlSettings.DataSource == model.FAKE_SETTING { + *cfg.SqlSettings.DataSource = *actual.SqlSettings.DataSource + } + if cfg.SqlSettings.AtRestEncryptKey == model.FAKE_SETTING { + cfg.SqlSettings.AtRestEncryptKey = actual.SqlSettings.AtRestEncryptKey + } + + if *cfg.ElasticsearchSettings.Password == model.FAKE_SETTING { + *cfg.ElasticsearchSettings.Password = *actual.ElasticsearchSettings.Password + } + + for i := range cfg.SqlSettings.DataSourceReplicas { + cfg.SqlSettings.DataSourceReplicas[i] = actual.SqlSettings.DataSourceReplicas[i] + } + + for i := range cfg.SqlSettings.DataSourceSearchReplicas { + cfg.SqlSettings.DataSourceSearchReplicas[i] = actual.SqlSettings.DataSourceSearchReplicas[i] + } +} -- cgit v1.2.3-1-g7c22