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  }