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)
+	}
 }