diff --git a/mattermost/server/bathroom-linux-amd64 b/mattermost/server/bathroom-linux-amd64 index 7a38eb5..bd4b98e 100755 --- a/mattermost/server/bathroom-linux-amd64 +++ b/mattermost/server/bathroom-linux-amd64 Binary files differ diff --git a/mattermost/server/bathroom-linux-amd64 b/mattermost/server/bathroom-linux-amd64 index 7a38eb5..bd4b98e 100755 --- a/mattermost/server/bathroom-linux-amd64 +++ b/mattermost/server/bathroom-linux-amd64 Binary files differ diff --git a/mattermost/server/bathroom.go b/mattermost/server/bathroom.go index 550a50a..d07f79d 100644 --- a/mattermost/server/bathroom.go +++ b/mattermost/server/bathroom.go @@ -10,6 +10,9 @@ "github.com/google/go-cmp/cmp" "os" "github.com/fatih/structs" + "github.com/hashicorp/go-multierror" + "github.com/kr/pretty" + "strings" ) type Config struct { @@ -19,11 +22,12 @@ func (c *Config) configMap() map[string]interface{} { var configMap map[string]interface{} = structs.Map(c) + var lowerConfigMap map[string]interface{} = make(map[string]interface{}) for k, v := range(configMap) { - configMap[k] = fmt.Sprintf("%v", v) + lowerConfigMap[strings.ToLower(k)] = fmt.Sprintf("%v", v) } - return configMap + return lowerConfigMap } type HelloWorldPlugin struct { @@ -62,37 +66,53 @@ } } - -func (p *HelloWorldPlugin) persistGoodConfig() { - var configMap map[string]interface{} = structs.Map(p.config) - for k, v := range(configMap) { - configMap[k] = fmt.Sprintf("%v", v) +func (p *HelloWorldPlugin) checkCorrectConfig() { + var currentConfig map[string]interface{} = p.getLowerCasePluginConfig() + var goodConfig map[string]interface{} = p.config.configMap() + if !cmp.Equal(currentConfig, goodConfig) { + p.API.LogInfo(fmt.Sprintf("%d: Saving un-matching config\n%# v\n%# v", p.configUpdates, pretty.Formatter(currentConfig), pretty.Formatter(goodConfig))) + p.API.SavePluginConfig(goodConfig) } +} - p.API.SavePluginConfig(configMap) +func (p *HelloWorldPlugin) getLowerCasePluginConfig() map[string]interface{} { + var currentConfig map[string]interface{} = p.API.GetPluginConfig() + var lowerConfig map[string]interface{} = make(map[string]interface{}) + for k, v := range(currentConfig) { + lowerConfig[strings.ToLower(k)] = fmt.Sprintf("%v", v) + } + return lowerConfig } func (p *HelloWorldPlugin) OnConfigurationChange() error { + + p.configLock.Lock() + defer p.configLock.Unlock() + + var currentConfig map[string]interface{} = p.getLowerCasePluginConfig() + if cmp.Equal(currentConfig, p.config.configMap()) { + p.API.LogInfo(fmt.Sprintf("%d: Skipping matching config", p.configUpdates)) + return nil + } + + defer p.checkCorrectConfig() + var newConfig *Config = new(Config); if err := p.API.LoadPluginConfiguration(newConfig); err != nil { - defer p.persistGoodConfig() - return errors.Wrap(err, "failed to load configuration") + return errors.Wrap(err, fmt.Sprintf("%d: Failed to load configuration", p.configUpdates)) } if newConfig == p.config || reflect.ValueOf(*newConfig).NumField() == 0 || cmp.Equal(*newConfig, *p.config) { - defer p.persistGoodConfig() p.API.LogInfo("Passed same config, or empty?") return nil; } - if _, err := os.Stat(newConfig.WatchPath); err != nil { - defer p.persistGoodConfig() - return errors.Wrap(err, "Invalid watch path") - } + var configErr error = nil - p.configLock.Lock() - defer p.confChangedEvent() - defer p.configLock.Unlock() + if _, err := os.Stat(newConfig.WatchPath); err != nil { + newConfig.WatchPath = "./" + configErr = multierror.Append(configErr, errors.Wrap(err, "Invalid watch path")) + } p.config = newConfig @@ -100,9 +120,9 @@ p.initDoors() - p.API.LogInfo(fmt.Sprintf("Config: %d %s", p.config.NumDoors, p.config.WatchPath)) + p.API.LogInfo(fmt.Sprintf("%d: Config: %d %s", p.configUpdates, p.config.NumDoors, p.config.WatchPath)) - return nil + return configErr } func watchLoop(p *HelloWorldPlugin) { diff --git a/mattermost/server/bathroom-linux-amd64 b/mattermost/server/bathroom-linux-amd64 index 7a38eb5..bd4b98e 100755 --- a/mattermost/server/bathroom-linux-amd64 +++ b/mattermost/server/bathroom-linux-amd64 Binary files differ diff --git a/mattermost/server/bathroom.go b/mattermost/server/bathroom.go index 550a50a..d07f79d 100644 --- a/mattermost/server/bathroom.go +++ b/mattermost/server/bathroom.go @@ -10,6 +10,9 @@ "github.com/google/go-cmp/cmp" "os" "github.com/fatih/structs" + "github.com/hashicorp/go-multierror" + "github.com/kr/pretty" + "strings" ) type Config struct { @@ -19,11 +22,12 @@ func (c *Config) configMap() map[string]interface{} { var configMap map[string]interface{} = structs.Map(c) + var lowerConfigMap map[string]interface{} = make(map[string]interface{}) for k, v := range(configMap) { - configMap[k] = fmt.Sprintf("%v", v) + lowerConfigMap[strings.ToLower(k)] = fmt.Sprintf("%v", v) } - return configMap + return lowerConfigMap } type HelloWorldPlugin struct { @@ -62,37 +66,53 @@ } } - -func (p *HelloWorldPlugin) persistGoodConfig() { - var configMap map[string]interface{} = structs.Map(p.config) - for k, v := range(configMap) { - configMap[k] = fmt.Sprintf("%v", v) +func (p *HelloWorldPlugin) checkCorrectConfig() { + var currentConfig map[string]interface{} = p.getLowerCasePluginConfig() + var goodConfig map[string]interface{} = p.config.configMap() + if !cmp.Equal(currentConfig, goodConfig) { + p.API.LogInfo(fmt.Sprintf("%d: Saving un-matching config\n%# v\n%# v", p.configUpdates, pretty.Formatter(currentConfig), pretty.Formatter(goodConfig))) + p.API.SavePluginConfig(goodConfig) } +} - p.API.SavePluginConfig(configMap) +func (p *HelloWorldPlugin) getLowerCasePluginConfig() map[string]interface{} { + var currentConfig map[string]interface{} = p.API.GetPluginConfig() + var lowerConfig map[string]interface{} = make(map[string]interface{}) + for k, v := range(currentConfig) { + lowerConfig[strings.ToLower(k)] = fmt.Sprintf("%v", v) + } + return lowerConfig } func (p *HelloWorldPlugin) OnConfigurationChange() error { + + p.configLock.Lock() + defer p.configLock.Unlock() + + var currentConfig map[string]interface{} = p.getLowerCasePluginConfig() + if cmp.Equal(currentConfig, p.config.configMap()) { + p.API.LogInfo(fmt.Sprintf("%d: Skipping matching config", p.configUpdates)) + return nil + } + + defer p.checkCorrectConfig() + var newConfig *Config = new(Config); if err := p.API.LoadPluginConfiguration(newConfig); err != nil { - defer p.persistGoodConfig() - return errors.Wrap(err, "failed to load configuration") + return errors.Wrap(err, fmt.Sprintf("%d: Failed to load configuration", p.configUpdates)) } if newConfig == p.config || reflect.ValueOf(*newConfig).NumField() == 0 || cmp.Equal(*newConfig, *p.config) { - defer p.persistGoodConfig() p.API.LogInfo("Passed same config, or empty?") return nil; } - if _, err := os.Stat(newConfig.WatchPath); err != nil { - defer p.persistGoodConfig() - return errors.Wrap(err, "Invalid watch path") - } + var configErr error = nil - p.configLock.Lock() - defer p.confChangedEvent() - defer p.configLock.Unlock() + if _, err := os.Stat(newConfig.WatchPath); err != nil { + newConfig.WatchPath = "./" + configErr = multierror.Append(configErr, errors.Wrap(err, "Invalid watch path")) + } p.config = newConfig @@ -100,9 +120,9 @@ p.initDoors() - p.API.LogInfo(fmt.Sprintf("Config: %d %s", p.config.NumDoors, p.config.WatchPath)) + p.API.LogInfo(fmt.Sprintf("%d: Config: %d %s", p.configUpdates, p.config.NumDoors, p.config.WatchPath)) - return nil + return configErr } func watchLoop(p *HelloWorldPlugin) { diff --git a/mattermost/server/bathroom.tar.gz b/mattermost/server/bathroom.tar.gz index 0c9a41c..89e81cb 100644 --- a/mattermost/server/bathroom.tar.gz +++ b/mattermost/server/bathroom.tar.gz Binary files differ diff --git a/mattermost/server/bathroom-linux-amd64 b/mattermost/server/bathroom-linux-amd64 index 7a38eb5..bd4b98e 100755 --- a/mattermost/server/bathroom-linux-amd64 +++ b/mattermost/server/bathroom-linux-amd64 Binary files differ diff --git a/mattermost/server/bathroom.go b/mattermost/server/bathroom.go index 550a50a..d07f79d 100644 --- a/mattermost/server/bathroom.go +++ b/mattermost/server/bathroom.go @@ -10,6 +10,9 @@ "github.com/google/go-cmp/cmp" "os" "github.com/fatih/structs" + "github.com/hashicorp/go-multierror" + "github.com/kr/pretty" + "strings" ) type Config struct { @@ -19,11 +22,12 @@ func (c *Config) configMap() map[string]interface{} { var configMap map[string]interface{} = structs.Map(c) + var lowerConfigMap map[string]interface{} = make(map[string]interface{}) for k, v := range(configMap) { - configMap[k] = fmt.Sprintf("%v", v) + lowerConfigMap[strings.ToLower(k)] = fmt.Sprintf("%v", v) } - return configMap + return lowerConfigMap } type HelloWorldPlugin struct { @@ -62,37 +66,53 @@ } } - -func (p *HelloWorldPlugin) persistGoodConfig() { - var configMap map[string]interface{} = structs.Map(p.config) - for k, v := range(configMap) { - configMap[k] = fmt.Sprintf("%v", v) +func (p *HelloWorldPlugin) checkCorrectConfig() { + var currentConfig map[string]interface{} = p.getLowerCasePluginConfig() + var goodConfig map[string]interface{} = p.config.configMap() + if !cmp.Equal(currentConfig, goodConfig) { + p.API.LogInfo(fmt.Sprintf("%d: Saving un-matching config\n%# v\n%# v", p.configUpdates, pretty.Formatter(currentConfig), pretty.Formatter(goodConfig))) + p.API.SavePluginConfig(goodConfig) } +} - p.API.SavePluginConfig(configMap) +func (p *HelloWorldPlugin) getLowerCasePluginConfig() map[string]interface{} { + var currentConfig map[string]interface{} = p.API.GetPluginConfig() + var lowerConfig map[string]interface{} = make(map[string]interface{}) + for k, v := range(currentConfig) { + lowerConfig[strings.ToLower(k)] = fmt.Sprintf("%v", v) + } + return lowerConfig } func (p *HelloWorldPlugin) OnConfigurationChange() error { + + p.configLock.Lock() + defer p.configLock.Unlock() + + var currentConfig map[string]interface{} = p.getLowerCasePluginConfig() + if cmp.Equal(currentConfig, p.config.configMap()) { + p.API.LogInfo(fmt.Sprintf("%d: Skipping matching config", p.configUpdates)) + return nil + } + + defer p.checkCorrectConfig() + var newConfig *Config = new(Config); if err := p.API.LoadPluginConfiguration(newConfig); err != nil { - defer p.persistGoodConfig() - return errors.Wrap(err, "failed to load configuration") + return errors.Wrap(err, fmt.Sprintf("%d: Failed to load configuration", p.configUpdates)) } if newConfig == p.config || reflect.ValueOf(*newConfig).NumField() == 0 || cmp.Equal(*newConfig, *p.config) { - defer p.persistGoodConfig() p.API.LogInfo("Passed same config, or empty?") return nil; } - if _, err := os.Stat(newConfig.WatchPath); err != nil { - defer p.persistGoodConfig() - return errors.Wrap(err, "Invalid watch path") - } + var configErr error = nil - p.configLock.Lock() - defer p.confChangedEvent() - defer p.configLock.Unlock() + if _, err := os.Stat(newConfig.WatchPath); err != nil { + newConfig.WatchPath = "./" + configErr = multierror.Append(configErr, errors.Wrap(err, "Invalid watch path")) + } p.config = newConfig @@ -100,9 +120,9 @@ p.initDoors() - p.API.LogInfo(fmt.Sprintf("Config: %d %s", p.config.NumDoors, p.config.WatchPath)) + p.API.LogInfo(fmt.Sprintf("%d: Config: %d %s", p.configUpdates, p.config.NumDoors, p.config.WatchPath)) - return nil + return configErr } func watchLoop(p *HelloWorldPlugin) { diff --git a/mattermost/server/bathroom.tar.gz b/mattermost/server/bathroom.tar.gz index 0c9a41c..89e81cb 100644 --- a/mattermost/server/bathroom.tar.gz +++ b/mattermost/server/bathroom.tar.gz Binary files differ diff --git a/mattermost/server/setup.sh b/mattermost/server/setup.sh index 8543827..855372d 100755 --- a/mattermost/server/setup.sh +++ b/mattermost/server/setup.sh @@ -6,3 +6,5 @@ go get -u github.com/pkg/errors go get -u github.com/google/go-cmp/cmp go get -u github.com/fatih/structs +go get -u github.com/hashicorp/go-multierror +go get -u github.com/kr/pretty