summaryrefslogtreecommitdiffstats
path: root/utils/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'utils/config.go')
-rw-r--r--utils/config.go64
1 files changed, 47 insertions, 17 deletions
diff --git a/utils/config.go b/utils/config.go
index 2996c241c..6f18a48fa 100644
--- a/utils/config.go
+++ b/utils/config.go
@@ -14,6 +14,8 @@ import (
"strings"
l4g "github.com/alecthomas/log4go"
+ "github.com/fsnotify/fsnotify"
+ "github.com/spf13/viper"
"github.com/mattermost/platform/einterfaces"
"github.com/mattermost/platform/model"
@@ -153,34 +155,62 @@ func SaveConfig(fileName string, config *model.Config) *model.AppError {
return nil
}
+func EnableConfigFromEnviromentVars() {
+ viper.SetEnvPrefix("mm")
+ viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
+ viper.AutomaticEnv()
+}
+
+func EnableConfigWatch() {
+ viper.WatchConfig()
+ viper.OnConfigChange(func(e fsnotify.Event) {
+ l4g.Info(fmt.Sprintf("Config file watcher detected a change reloading %v", CfgFileName))
+ LoadConfig(CfgFileName)
+ })
+}
+
// LoadConfig will try to search around for the corresponding config file.
// It will search /tmp/fileName then attempt ./config/fileName,
// then ../config/fileName and last it will look at fileName
func LoadConfig(fileName string) {
- fileName = FindConfigFile(fileName)
+ fileNameWithExtension := filepath.Base(fileName)
+ fileExtension := filepath.Ext(fileNameWithExtension)
+ fileDir := filepath.Dir(fileName)
- file, err := os.Open(fileName)
- if err != nil {
- panic(T("utils.config.load_config.opening.panic",
- map[string]interface{}{"Filename": fileName, "Error": err.Error()}))
+ if len(fileNameWithExtension) > 0 {
+ fileNameOnly := fileNameWithExtension[:len(fileNameWithExtension)-len(fileExtension)]
+ viper.SetConfigName(fileNameOnly)
+ } else {
+ viper.SetConfigName("config")
}
- decoder := json.NewDecoder(file)
- config := model.Config{}
- err = decoder.Decode(&config)
- if err != nil {
- panic(T("utils.config.load_config.decoding.panic",
- map[string]interface{}{"Filename": fileName, "Error": err.Error()}))
+ if len(fileDir) > 0 {
+ viper.AddConfigPath(fileDir)
}
- if _, err := file.Stat(); err != nil {
- panic(T("utils.config.load_config.getting.panic",
- map[string]interface{}{"Filename": fileName, "Error": err.Error()}))
- } else {
- CfgFileName = fileName
+ viper.SetConfigType("json")
+ viper.AddConfigPath("./config")
+ viper.AddConfigPath("../config")
+ viper.AddConfigPath(".")
+
+ configReadErr := viper.ReadInConfig()
+ if configReadErr != nil {
+ errMsg := T("utils.config.load_config.opening.panic", map[string]interface{}{"Filename": fileName, "Error": configReadErr.Error()})
+ fmt.Fprintln(os.Stderr, errMsg)
+ os.Exit(1)
}
+ var config model.Config
+ unmarshalErr := viper.Unmarshal(&config)
+ if unmarshalErr != nil {
+ errMsg := T("utils.config.load_config.decoding.panic", map[string]interface{}{"Filename": fileName, "Error": unmarshalErr.Error()})
+ fmt.Fprintln(os.Stderr, errMsg)
+ os.Exit(1)
+ }
+
+ CfgFileName = viper.ConfigFileUsed()
+
needSave := len(config.SqlSettings.AtRestEncryptKey) == 0 || len(*config.FileSettings.PublicLinkSalt) == 0 ||
len(config.EmailSettings.InviteSalt) == 0 || len(config.EmailSettings.PasswordResetSalt) == 0
@@ -191,7 +221,7 @@ func LoadConfig(fileName string) {
}
if needSave {
- if err := SaveConfig(fileName, &config); err != nil {
+ if err := SaveConfig(CfgFileName, &config); err != nil {
l4g.Warn(T(err.Id))
}
}