github.com/psyb0t/mattermost-server@v4.6.1-0.20180125161845-5503a1351abf+incompatible/app/config.go (about) 1 // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package app 5 6 import ( 7 "crypto/md5" 8 "encoding/json" 9 "fmt" 10 "runtime/debug" 11 12 l4g "github.com/alecthomas/log4go" 13 14 "github.com/mattermost/mattermost-server/model" 15 "github.com/mattermost/mattermost-server/utils" 16 ) 17 18 func (a *App) Config() *model.Config { 19 if cfg := a.config.Load(); cfg != nil { 20 return cfg.(*model.Config) 21 } 22 return &model.Config{} 23 } 24 25 func (a *App) UpdateConfig(f func(*model.Config)) { 26 old := a.Config() 27 updated := old.Clone() 28 f(updated) 29 a.config.Store(updated) 30 a.InvokeConfigListeners(old, updated) 31 } 32 33 func (a *App) PersistConfig() { 34 utils.SaveConfig(a.ConfigFileName(), a.Config()) 35 } 36 37 func (a *App) LoadConfig(configFile string) *model.AppError { 38 old := a.Config() 39 40 cfg, configPath, err := utils.LoadConfig(configFile) 41 if err != nil { 42 return err 43 } 44 45 a.configFile = configPath 46 47 utils.ConfigureLog(&cfg.LogSettings) 48 49 a.config.Store(cfg) 50 51 utils.SetSiteURL(*cfg.ServiceSettings.SiteURL) 52 53 a.InvokeConfigListeners(old, cfg) 54 return nil 55 } 56 57 func (a *App) ReloadConfig() *model.AppError { 58 debug.FreeOSMemory() 59 if err := a.LoadConfig(a.configFile); err != nil { 60 return err 61 } 62 63 // start/restart email batching job if necessary 64 a.InitEmailBatching() 65 return nil 66 } 67 68 func (a *App) ConfigFileName() string { 69 return a.configFile 70 } 71 72 func (a *App) ClientConfig() map[string]string { 73 return a.clientConfig 74 } 75 76 func (a *App) ClientConfigHash() string { 77 return a.clientConfigHash 78 } 79 80 func (a *App) EnableConfigWatch() { 81 if a.configWatcher == nil && !a.disableConfigWatch { 82 configWatcher, err := utils.NewConfigWatcher(a.ConfigFileName(), func() { 83 a.ReloadConfig() 84 }) 85 if err != nil { 86 l4g.Error(err) 87 } 88 a.configWatcher = configWatcher 89 } 90 } 91 92 func (a *App) DisableConfigWatch() { 93 if a.configWatcher != nil { 94 a.configWatcher.Close() 95 a.configWatcher = nil 96 } 97 } 98 99 // Registers a function with a given to be called when the config is reloaded and may have changed. The function 100 // will be called with two arguments: the old config and the new config. AddConfigListener returns a unique ID 101 // for the listener that can later be used to remove it. 102 func (a *App) AddConfigListener(listener func(*model.Config, *model.Config)) string { 103 id := model.NewId() 104 a.configListeners[id] = listener 105 return id 106 } 107 108 // Removes a listener function by the unique ID returned when AddConfigListener was called 109 func (a *App) RemoveConfigListener(id string) { 110 delete(a.configListeners, id) 111 } 112 113 func (a *App) InvokeConfigListeners(old, current *model.Config) { 114 for _, listener := range a.configListeners { 115 listener(old, current) 116 } 117 } 118 119 func (a *App) regenerateClientConfig() { 120 a.clientConfig = utils.GenerateClientConfig(a.Config(), a.DiagnosticId()) 121 clientConfigJSON, _ := json.Marshal(a.clientConfig) 122 a.clientConfigHash = fmt.Sprintf("%x", md5.Sum(clientConfigJSON)) 123 } 124 125 func (a *App) Desanitize(cfg *model.Config) { 126 actual := a.Config() 127 128 if cfg.LdapSettings.BindPassword != nil && *cfg.LdapSettings.BindPassword == model.FAKE_SETTING { 129 *cfg.LdapSettings.BindPassword = *actual.LdapSettings.BindPassword 130 } 131 132 if *cfg.FileSettings.PublicLinkSalt == model.FAKE_SETTING { 133 *cfg.FileSettings.PublicLinkSalt = *actual.FileSettings.PublicLinkSalt 134 } 135 if cfg.FileSettings.AmazonS3SecretAccessKey == model.FAKE_SETTING { 136 cfg.FileSettings.AmazonS3SecretAccessKey = actual.FileSettings.AmazonS3SecretAccessKey 137 } 138 139 if cfg.EmailSettings.InviteSalt == model.FAKE_SETTING { 140 cfg.EmailSettings.InviteSalt = actual.EmailSettings.InviteSalt 141 } 142 if cfg.EmailSettings.SMTPPassword == model.FAKE_SETTING { 143 cfg.EmailSettings.SMTPPassword = actual.EmailSettings.SMTPPassword 144 } 145 146 if cfg.GitLabSettings.Secret == model.FAKE_SETTING { 147 cfg.GitLabSettings.Secret = actual.GitLabSettings.Secret 148 } 149 150 if *cfg.SqlSettings.DataSource == model.FAKE_SETTING { 151 *cfg.SqlSettings.DataSource = *actual.SqlSettings.DataSource 152 } 153 if cfg.SqlSettings.AtRestEncryptKey == model.FAKE_SETTING { 154 cfg.SqlSettings.AtRestEncryptKey = actual.SqlSettings.AtRestEncryptKey 155 } 156 157 if *cfg.ElasticsearchSettings.Password == model.FAKE_SETTING { 158 *cfg.ElasticsearchSettings.Password = *actual.ElasticsearchSettings.Password 159 } 160 161 for i := range cfg.SqlSettings.DataSourceReplicas { 162 cfg.SqlSettings.DataSourceReplicas[i] = actual.SqlSettings.DataSourceReplicas[i] 163 } 164 165 for i := range cfg.SqlSettings.DataSourceSearchReplicas { 166 cfg.SqlSettings.DataSourceSearchReplicas[i] = actual.SqlSettings.DataSourceSearchReplicas[i] 167 } 168 }