Files
archived-rttys/config/config.go
T
Jianhui Zhao b5ecca7b7e feat: Local authentication is configurable
Signed-off-by: Jianhui Zhao <zhaojh329@gmail.com>
2021-02-28 20:36:06 +08:00

110 lines
2.3 KiB
Go

package config
import (
"os"
"strconv"
"strings"
"github.com/kylelemons/go-gypsy/yaml"
"github.com/rs/zerolog/log"
"github.com/urfave/cli/v2"
)
// Config struct
type Config struct {
AddrDev string
AddrUser string
AddrWeb string
WebRedirURL string
WebPort int
SslCert string
SslKey string
SslCacert string // mTLS for device
Token string
WhiteList map[string]bool
DB string
LocalAuth bool
}
func getConfigOpt(yamlCfg *yaml.File, name string, opt interface{}) {
val, err := yamlCfg.Get(name)
if err != nil {
return
}
switch opt := opt.(type) {
case *string:
*opt = val
case *int:
*opt, _ = strconv.Atoi(val)
}
}
// Parse config
func Parse(c *cli.Context) *Config {
cfg := &Config{
AddrDev: c.String("addr-dev"),
AddrUser: c.String("addr-user"),
AddrWeb: c.String("addr-web"),
WebRedirURL: c.String("web-redir-url"),
SslCert: c.String("ssl-cert"),
SslKey: c.String("ssl-key"),
SslCacert: c.String("ssl-cacert"),
Token: c.String("token"),
DB: c.String("db"),
LocalAuth: c.Bool("local-auth"),
}
cfg.WhiteList = make(map[string]bool)
whiteList := c.String("white-list")
if whiteList == "*" {
cfg.WhiteList = nil
} else {
for _, id := range strings.Fields(whiteList) {
cfg.WhiteList[id] = true
}
}
yamlCfg, err := yaml.ReadFile(c.String("conf"))
if err == nil {
getConfigOpt(yamlCfg, "addr-dev", &cfg.AddrDev)
getConfigOpt(yamlCfg, "addr-user", &cfg.AddrUser)
getConfigOpt(yamlCfg, "addr-web", &cfg.AddrWeb)
getConfigOpt(yamlCfg, "web-redir-url", &cfg.WebRedirURL)
getConfigOpt(yamlCfg, "ssl-cert", &cfg.SslCert)
getConfigOpt(yamlCfg, "ssl-key", &cfg.SslKey)
getConfigOpt(yamlCfg, "ssl-cacert", &cfg.SslCacert)
getConfigOpt(yamlCfg, "token", &cfg.Token)
getConfigOpt(yamlCfg, "db", &cfg.DB)
val, err := yamlCfg.Get("white-list")
if err == nil {
if val == "*" || val == "\"*\"" {
cfg.WhiteList = nil
} else {
for _, id := range strings.Fields(val) {
cfg.WhiteList[id] = true
}
}
}
}
if cfg.SslCert != "" && cfg.SslKey != "" {
_, err := os.Lstat(cfg.SslCert)
if err != nil {
log.Error().Msg(err.Error())
cfg.SslCert = ""
}
_, err = os.Lstat(cfg.SslKey)
if err != nil {
log.Error().Msg(err.Error())
cfg.SslKey = ""
}
}
return cfg
}