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"
This commit is contained in:
parent
96620a3c2c
commit
92d9db5a2d
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue