diff options
Diffstat (limited to 'bridge/config/config.go')
-rw-r--r-- | bridge/config/config.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/bridge/config/config.go b/bridge/config/config.go index 3972e84e..aa881a79 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -3,6 +3,9 @@ package config import ( "github.com/BurntSushi/toml" "log" + "os" + "reflect" + "strings" ) type Message struct { @@ -80,3 +83,40 @@ func NewConfig(cfgfile string) *Config { } return &cfg } + +func OverrideCfgFromEnv(cfg *Config, protocol string, account string) { + var protoCfg Protocol + val := reflect.ValueOf(cfg).Elem() + // loop over the Config struct + for i := 0; i < val.NumField(); i++ { + typeField := val.Type().Field(i) + // look for the protocol map (both lowercase) + if strings.ToLower(typeField.Name) == protocol { + // get the Protocol struct from the map + data := val.Field(i).MapIndex(reflect.ValueOf(account)) + protoCfg = data.Interface().(Protocol) + protoStruct := reflect.ValueOf(&protoCfg).Elem() + // loop over the found protocol struct + for i := 0; i < protoStruct.NumField(); i++ { + typeField := protoStruct.Type().Field(i) + // build our environment key (eg MATTERBRIDGE_MATTERMOST_WORK_LOGIN) + key := "matterbridge_" + protocol + "_" + account + "_" + typeField.Name + key = strings.ToUpper(key) + // search the environment + res := os.Getenv(key) + // if it exists and the current field is a string + // then update the current field + if res != "" { + fieldVal := protoStruct.Field(i) + if fieldVal.Kind() == reflect.String { + log.Printf("config: overriding %s from env with %s\n", key, res) + fieldVal.Set(reflect.ValueOf(res)) + } + } + } + // update the map with the modified Protocol (cfg.Protocol[account] = Protocol) + val.Field(i).SetMapIndex(reflect.ValueOf(account), reflect.ValueOf(protoCfg)) + break + } + } +} |