summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--getwtxt.json5
-rw-r--r--init.go78
-rw-r--r--main.go7
-rw-r--r--types.go10
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{}