From 92d9db5a2d6f568e3c21ecf56cde80b32c342868 Mon Sep 17 00:00:00 2001 From: Wim Date: Sun, 30 Oct 2016 22:32:29 +0100 Subject: [PATCH] Override config from environment. See #50 Expects uppercase environment variables of MATTERBRIDGE_PROTOCOL_ACCOUNT_KEY="value" e.g. you can override this config [mattermost] [mattermost.work] Team="yourteam" Login="yourlogin" Password="yourpass" by using MATTERBRIDGE_MATTERMOST_WORK_TEAM="newteam" MATTERBRIDGE_MATTERMOST_WORK_LOGIN="newlogin" MATTERBRIDGE_MATTERMOST_WORK_PASSWORD="newpassword" --- bridge/bridge.go | 2 ++ bridge/config/config.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/bridge/bridge.go b/bridge/bridge.go index 7f08c609..3d532242 100644 --- a/bridge/bridge.go +++ b/bridge/bridge.go @@ -25,6 +25,8 @@ func New(cfg *config.Config, bridge *config.Bridge, c chan config.Message) Bridg accInfo := strings.Split(bridge.Account, ".") protocol := accInfo[0] name := accInfo[1] + // override config from environment + config.OverrideCfgFromEnv(cfg, protocol, name) switch protocol { case "mattermost": return bmattermost.New(cfg.Mattermost[name], name, c) 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 + } + } +}