diff options
-rw-r--r-- | getwtxt.json | 5 | ||||
-rw-r--r-- | init.go | 78 | ||||
-rw-r--r-- | main.go | 7 | ||||
-rw-r--r-- | types.go | 10 |
4 files changed, 88 insertions, 12 deletions
diff --git a/getwtxt.json b/getwtxt.json new file mode 100644 index 0000000..8e08bb8 --- /dev/null +++ b/getwtxt.json @@ -0,0 +1,5 @@ +{ + "port": 9001, + "logfile": "getwtxt.log", + "twtxtfile": "/var/twtxt/twtxt.txt" +} 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() } diff --git a/main.go b/main.go index 453426a..92b8971 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "net/http" "time" @@ -11,8 +12,6 @@ import ( const getwtxt = "0.1" -var closelog = make(chan bool) - func main() { log.Printf("getwtxt " + getwtxt + "\n") @@ -28,9 +27,11 @@ func main() { api.HandleFunc("/{format:(?:plain)}/tags", apiTagsBaseHandler) api.HandleFunc("/{format:(?:plain)}/tags/{tags:[a-zA-Z0-9]+}", apiTagsHandler) + portnum := fmt.Sprintf(":%v", confObj.port) + server := &http.Server{ Handler: handlers.CompressHandler(index), - Addr: ":9001", + Addr: portnum, WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } diff --git a/types.go b/types.go index 6b33e5b..5ca2f90 100644 --- a/types.go +++ b/types.go @@ -6,11 +6,7 @@ const htmlutf8 = "text/html; charset=utf8" // config object definition type configuration struct { - port string - quietLogging bool - fileLogging bool - logFile string + port int + logfile string + twtxtfile string } - -// config object -var confObj = &configuration{} |