Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 0a5ed0f50bb56cb32f60d29d0d1622f1c8ecb7a5 Author: Wim <wim@42.be> Date: Sun Oct 30 22:32:29 2016 +0000 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" diff --git a/bridge/bridge.go b/bridge/bridge.go index 7f08c60..3d53224 100644 --- a/bridge/bridge.go +++ b/bridge/bridge.go @@ -256 +258 @@ 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 3972e84..aa881a7 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -36 +39 @@ package config  import (   "github.com/BurntSushi/toml"   "log" + "os" + "reflect" + "strings"  )    type Message struct { @@ -803 +8340 @@ 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 + } + } +}