diff --git a/config/config.go b/config/config.go index f36765b..d048808 100644 --- a/config/config.go +++ b/config/config.go @@ -1,161 +1,84 @@ package config import ( - "encoding/json" - "flag" - "io/ioutil" - "log" "os" "strconv" + + "github.com/spf13/viper" ) type Config struct { - User User `json:"user"` - ServerTS ServerTS `json:"serverTS"` - ServerWeb ServerWeb `json:"serverWeb"` -} - -type User struct { - Nickname string `json:"nickname"` - Name string `json:"name"` - Password string `json:"password"` -} - -type ServerTS struct { - IP string `json:"ip"` - PortServer uint16 `json:"portServer"` - PortQuery uint16 `json:"portQuery"` -} - -type ServerWeb struct { - Port uint16 `json:"port"` + User struct { + Nickname string + Name string + Password string + } + ServerTS struct { + IP string + PortServer uint16 + PortQuery uint16 + } + ServerWeb struct { + Port uint16 + } } const FileName = "config.json" func New() (*Config, error) { - config := defaults() - - configFile, err := os.Open(FileName) - if err != nil { - if err := config.createFile(); err != nil { - return nil, err - } - - log.Println(config) - return &config, nil - } - defer configFile.Close() - - jsonParser := json.NewDecoder(configFile) - jsonParser.Decode(&config) - - config.overrideWithEnv() - config.overrideWithFlags() - - return &config, nil -} - -func (config Config) createFile() error { - configJSON, err := json.MarshalIndent(config, "", " ") - if err != nil { - return err + viper.SetConfigName("config") + viper.SetConfigFile("yaml") + viper.AddConfigPath(".") + if err := viper.ReadInConfig(); err != nil { + return nil, err } - return ioutil.WriteFile(FileName, configJSON, 0644) + setDefaults() + + var config Config + err := viper.Unmarshal(&config) + + config.overrideWithEnvironmentVars() + + return &config, err } -func defaults() Config { - return Config{ - User: User{ - Nickname: "serveradmin", - Name: "serveradmin", - Password: "", - }, - ServerTS: ServerTS{ - IP: "127.0.0.1", - PortServer: 9987, - PortQuery: 10011, - }, - ServerWeb: ServerWeb{ - Port: 80, - }, - } +func setDefaults() { + viper.SetDefault("User.Nickname", "serveradmin") + viper.SetDefault("User.Name", "serveradmin") + viper.SetDefault("User.Password", "") + viper.SetDefault("ServerTS.IP", "127.0.0.1") + viper.SetDefault("ServerTS.PortServer", "9987") + viper.SetDefault("ServerTS.PortQuery", "10011") + viper.SetDefault("ServerWeb.Port", "80") } -func (config *Config) overrideWithEnv() { - nickname := os.Getenv("TS3_NICKNAME") - username := os.Getenv("TS3_NAME") - password := os.Getenv("TS3_PW") - tsIP := os.Getenv("TS3_IP") - tsPort, _ := strconv.Atoi(os.Getenv("TS3_PORT")) - tsQuery, _ := strconv.Atoi(os.Getenv("TS3_QUERY")) - webPort, _ := strconv.Atoi(os.Getenv("WEB_PORT")) - - if nickname != "" { +func (config *Config) overrideWithEnvironmentVars() { + if nickname := os.Getenv("TS3_NICKNAME"); nickname != "" { config.User.Nickname = nickname } - if username != "" { + if username := os.Getenv("TS3_NAME"); username != "" { config.User.Name = username } - if password != "" { + if password := os.Getenv("TS3_PW"); password != "" { config.User.Password = password } - if tsIP != "" { + if tsIP := os.Getenv("TS3_IP"); tsIP != "" { config.ServerTS.IP = tsIP } - if tsPort <= 65535 && tsPort != 0 { + if tsPort, err := strconv.Atoi(os.Getenv("TS3_PORT")); tsPort <= 65535 && tsPort >= 0 && err == nil { config.ServerTS.PortServer = uint16(tsPort) } - if tsQuery <= 65535 && tsQuery != 0 { + if tsQuery, err := strconv.Atoi(os.Getenv("TS3_QUERY")); tsQuery <= 65535 && tsQuery >= 0 && err == nil { config.ServerTS.PortQuery = uint16(tsQuery) } - if webPort <= 65535 && webPort != 0 { + if webPort, err := strconv.Atoi(os.Getenv("WEB_PORT")); webPort <= 65535 && webPort >= 0 && err == nil { config.ServerWeb.Port = uint16(webPort) } } - -func (config *Config) overrideWithFlags() { - nickname := flag.String("ts3_nickname", "", "TS3Query nickname") - username := flag.String("ts3_name", "", "TS3Query username") - password := flag.String("ts3_pw", "", "TS3Query user password") - tsIP := flag.String("ts3_ip", "", "TS3 IP address") - tsPort := flag.Uint64("ts3_port", 65536, "TS3 port") - tsQuery := flag.Uint64("ts3_query", 65536, "TS3 query port") - webPort := flag.Uint64("web_port", 65536, "Webserver port") - flag.Parse() - - if *nickname != "" { - config.User.Nickname = *nickname - } - - if *username != "" { - config.User.Name = *username - } - - if *password != "" { - config.User.Password = *password - } - - if *tsIP != "" { - config.ServerTS.IP = *tsIP - } - - if *tsPort <= 65535 && *tsPort != 0 { - config.ServerTS.PortServer = uint16(*tsPort) - } - - if *tsQuery <= 65535 && *tsQuery != 0 { - config.ServerTS.PortQuery = uint16(*tsQuery) - } - - if *webPort <= 65535 && *webPort != 0 { - config.ServerWeb.Port = uint16(*webPort) - } -}