Mercurial > gemma
diff config/config.go @ 332:394fafeb4052
Use viper as config storage (I don't like it).
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 03 Aug 2018 15:46:05 +0200 |
parents | c23eb0f34e39 |
children | bd292a554b6e |
line wrap: on
line diff
--- a/config/config.go Fri Aug 03 13:52:23 2018 +0200 +++ b/config/config.go Fri Aug 03 15:46:05 2018 +0200 @@ -1,28 +1,119 @@ package config -var Config Configuration +import ( + "log" + + homedir "github.com/mitchellh/go-homedir" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +// This is not part of the persistent config. +var configFile string + +func ConfigFile() string { return configFile } + +func DBHost() string { return viper.GetString("dbhost") } +func DBPort() uint { return uint(viper.GetInt32("dbport")) } +func DBName() string { return viper.GetString("dbname") } +func DBSSLMode() string { return viper.GetString("dbssl") } +func SessionStore() string { return viper.GetString("sessions") } +func Web() string { return viper.GetString("web") } +func WebHost() string { return viper.GetString("host") } +func WebPort() uint { return uint(viper.GetInt32("port")) } + +func ServiceUser() string { return viper.GetString("service-user") } +func ServicePassword() string { return viper.GetString("service-password") } -type Configuration struct { - DBHost string - DBPort uint - DBName string - DBSSLMode string +func MailHost() string { return viper.GetString("mail-host") } +func MailPort() uint { return uint(viper.GetInt32("mail-port")) } +func MailUser() string { return viper.GetString("mail-user") } +func MailPassword() string { return viper.GetString("mail-password") } +func MailFrom() string { return viper.GetString("mail-from") } +func MailHelo() string { return viper.GetString("mail-helo") } + +func AllowedOrigins() []string { return viper.GetStringSlice("allowed-origins") } + +var RootCmd = &cobra.Command{ + Use: "gemma", + Short: "gemma is a server for waterway monitoring and management", +} - SessionStore string +func init() { + cobra.OnInitialize(initConfig) + fl := RootCmd.PersistentFlags() + fl.StringVarP(&configFile, "config", "c", "", "config file (default is $HOME/.gemma.toml)") + + fl.StringP("dbhost", "H", "localhost", "host of the database") + fl.UintP("dbport", "P", 5432, "port of the database") + fl.StringP("dbname", "d", "gemma", "name of the database") + fl.StringP("dbssl", "S", "prefer", "SSL mode of the database") + + fl.StringP("sessions", "s", "", "path to the sessions file") + + fl.StringP("web", "w", "", "path to the web files") + fl.StringP("host", "o", "localhost", "host of the web app") + fl.UintP("port", "p", 8000, "port of the web app") + + fl.String("service-user", "postgres", "user to do service tasks") + fl.String("service-password", "", "password of user to do service tasks") - Web string - WebHost string - WebPort uint + fl.String("mail-host", "localhost", "server to send mail with") + fl.Uint("mail-port", 464, "port of server to send mail with") + fl.String("mail-user", "gemma", "user to send mail with") + fl.String("mail-password", "", "password of user to send mail with") + fl.String("mail-from", "noreplay@localhost", "from line of mails") + fl.String("mail-helo", "localhost", "name of server to send mail from.") + + fl.StringSlice("allowed-origins", []string{"foo.org"}, "allow access for remote origins") + + vbind := func(name string) { viper.BindPFlag(name, fl.Lookup(name)) } - ServiceUser string - ServicePassword string + vbind("dbhost") + vbind("dbport") + vbind("dbname") + vbind("dbssl") + + vbind("sessions") + + vbind("web") + vbind("host") + vbind("port") + + vbind("service-user") + vbind("service-password") - MailHost string - MailPort uint - MailUser string - MailPassword string - MailFrom string - MailHelo string + vbind("mail-host") + vbind("mail-port") + vbind("mail-user") + vbind("mail-password") + vbind("mail-from") + vbind("mail-helo") + + vbind("allowed-origins") +} - AllowedOrigins []string +func initConfig() { + // Don't forget to read config either from cfgFile or from home directory! + if configFile != "" { + // Use config file from the flag. + viper.SetConfigFile(configFile) + } else { + // Find home directory. + home, err := homedir.Dir() + if err != nil { + log.Fatalf("error: %v\n", err) + } + + // Search config in home directory with name ".cobra" (without extension). + viper.AddConfigPath(home) + viper.SetConfigName(".gemma") + } + if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); ok && configFile == "" { + // Don't bother if not found. + return + } + log.Fatalf("Can't read config: %v\n", err) + } }