Quellcode durchsuchen

Start adding real configuration file

For stathat API keys and similar
Ask Bjørn Hansen vor 12 Jahren
Ursprung
Commit
c948995826
2 geänderte Dateien mit 99 neuen und 2 gelöschten Zeilen
  1. 83 0
      config.go
  2. 16 2
      geodns.go

+ 83 - 0
config.go

@@ -0,0 +1,83 @@
+package main
+
+import (
+	"code.google.com/p/gcfg"
+	"fmt"
+	"github.com/howeyc/fsnotify"
+	"log"
+	"os"
+	"time"
+)
+
+type AppConfig struct {
+	StatHat struct {
+		ApiKey string
+	}
+	Flags struct {
+		HasStatHat bool
+	}
+}
+
+func configWatcher(fileName string) {
+
+	watcher, err := fsnotify.NewWatcher()
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	if err := watcher.Watch(*flagconfig); err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	for {
+		select {
+		case ev := <-watcher.Event:
+			if ev.Name == fileName {
+				if ev.IsCreate() || ev.IsModify() || ev.IsRename() {
+					time.Sleep(200 * time.Millisecond)
+					configReader(fileName)
+				}
+			}
+		case err := <-watcher.Error:
+			log.Println("fsnotify error:", err)
+		}
+	}
+
+}
+
+var lastReadConfig time.Time
+
+func configReader(fileName string) error {
+
+	stat, err := os.Stat(fileName)
+	if err != nil {
+		log.Printf("Failed to find config file: %s\n", err)
+		return err
+	}
+
+	if !stat.ModTime().After(lastReadConfig) {
+		return err
+	}
+
+	lastReadConfig = time.Now()
+
+	log.Printf("Loading config: %s\n", fileName)
+
+	cfg := new(AppConfig)
+
+	err = gcfg.ReadFileInto(cfg, fileName)
+	if err != nil {
+		log.Printf("Failed to parse config data: %s\n", err)
+		return err
+	}
+
+	cfg.Flags.HasStatHat = len(cfg.StatHat.ApiKey) > 0
+
+	fmt.Println("STATHAT APIKEY:", cfg.StatHat.ApiKey)
+	fmt.Println("STATHAT FLAG  :", cfg.Flags.HasStatHat)
+
+	Config = cfg
+	return nil
+}

+ 16 - 2
geodns.go

@@ -23,6 +23,7 @@ import (
 	"net"
 	"os"
 	"os/signal"
+	"path/filepath"
 	"runtime/pprof"
 	"strings"
 	"time"
@@ -35,6 +36,8 @@ var serverId string
 var timeStarted = time.Now()
 var qCounter = expvar.NewInt("qCounter")
 
+var Config = new(AppConfig)
+
 var (
 	flagconfig      = flag.String("config", "./dns/", "directory of zone files")
 	flagcheckconfig = flag.Bool("checkconfig", false, "check configuration and exit")
@@ -59,13 +62,22 @@ func init() {
 func main() {
 	flag.Parse()
 
+	configFileName := filepath.Clean(*flagconfig + "/geodns.conf")
+
 	if *flagcheckconfig {
 		dirName := *flagconfig
+
+		err := configReader(configFileName)
+		if err != nil {
+			log.Println("Errors reading config", err)
+			os.Exit(2)
+		}
+
 		Zones := make(Zones)
 		setupPgeodnsZone(Zones)
-		err := zonesReadDir(dirName, Zones)
+		err = zonesReadDir(dirName, Zones)
 		if err != nil {
-			log.Println("Errors reading config")
+			log.Println("Errors reading zones", err)
 			os.Exit(2)
 		}
 		return
@@ -90,6 +102,8 @@ func main() {
 		}()
 	}
 
+	go configWatcher(configFileName)
+
 	if *flaginter == "*" {
 		addrs, _ := net.InterfaceAddrs()
 		ips := make([]string, 0)