From 06cffd89aeea4d34c987a1e7583af7525b8534e8 Mon Sep 17 00:00:00 2001 From: Ben Morrison Date: Sun, 12 May 2019 03:59:29 -0400 Subject: config fleshed out; using viper+pflag --- init.go | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 2 deletions(-) (limited to 'init.go') diff --git a/init.go b/init.go index 612bb6d..f37968c 100644 --- a/init.go +++ b/init.go @@ -3,16 +3,76 @@ package main import ( "log" "os" + "time" + + "github.com/fsnotify/fsnotify" + "github.com/spf13/pflag" + "github.com/spf13/viper" +) + +// command line flags +var ( + port *int = pflag.IntP("port", "p", 9001, "getwtxt will serve from this port") + logfile *string = pflag.StringP("logfile", "l", "getwtxt.log", "File for logging output") + twtxtfile *string = pflag.StringP("twtxtfile", "f", "/var/twtxt/twtxt.txt", "Registry file for getwtxt") ) -// Sets up logging before the main function executes +// config object +var confObj = &configuration{} + +// signals to close the log file +var closelog = make(chan bool, 1) + func init() { - logfile, err := os.OpenFile("getwtxt.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) + + initConfig() + + pflag.Parse() + viper.BindPFlags(pflag.CommandLine) + + initLogging() +} + +func initConfig() { + + viper.SetConfigName("getwtxt") + + viper.AddConfigPath(".") + viper.AddConfigPath("/usr/local/getwtxt") + viper.AddConfigPath("/etc") + viper.AddConfigPath("/usr/local/etc") + + if err := viper.ReadInConfig(); err != nil { + log.Printf("Error reading config file: %v\n", err) + log.Printf("Using defaults ...\n") + } + + // separate thread to watch for config file changes. + // will log event then run rebindConfig() + viper.WatchConfig() + viper.OnConfigChange(func(e fsnotify.Event) { + log.Printf("Config file change detected. Reloading...\n") + rebindConfig() + }) + + viper.SetDefault("port", 9001) + viper.SetDefault("logfile", "getwtxt.log") + viper.SetDefault("twtxtfile", "/var/twtxt/twtxt.txt") + + confObj.port = viper.GetInt("port") + confObj.logfile = viper.GetString("logfile") + confObj.twtxtfile = viper.GetString("twtxtfile") +} + +func initLogging() { + + logfile, err := os.OpenFile(confObj.logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) if err != nil { log.Printf("Could not open log file: %v\n", err) } // Listen for the signal to close the log file + // in a separate thread go func() { <-closelog log.Printf("Closing log file ...\n") @@ -23,5 +83,19 @@ func init() { }() log.SetOutput(logfile) +} + +func rebindConfig() { + + // reassign values to the config object + confObj.port = viper.GetInt("port") + confObj.logfile = viper.GetString("logfile") + confObj.twtxtfile = viper.GetString("twtxtfile") + + // signal to close the log file then wait + closelog <- true + time.Sleep(50 * time.Millisecond) + // reinitialize logging + initLogging() } -- cgit 1.4.1-2-gfad0