Procházet zdrojové kódy

Check .json files for updates every 5 seconds

Ask Bjørn Hansen před 13 roky
rodič
revize
829cb5768e
1 změnil soubory, kde provedl 30 přidání a 8 odebrání
  1. 30 8
      config.go

+ 30 - 8
config.go

@@ -10,27 +10,49 @@ import (
 	"sort"
 	"strconv"
 	"strings"
+	"time"
 )
 
+var configLastRead = map[string]time.Time{}
+
 func configReader(dirName string, Zones Zones) {
+	go func() {
+		for {
+			configReadDir(dirName, Zones)
+			time.Sleep(5 * time.Second)
+		}
+	}()
+}
+
+func configReadDir(dirName string, Zones Zones) {
+
 	dir, err := ioutil.ReadDir(dirName)
 	if err != nil {
 		panic(err)
 	}
 
-	for i, file := range dir {
+	var seenFiles = map[string]bool{}
+
+	for _, file := range dir {
 		fileName := file.Name()
 		if !strings.HasSuffix(strings.ToLower(fileName), ".json") {
 			continue
 		}
-		zoneName := fileName[0:strings.LastIndex(fileName, ".")]
-		log.Println("FILE:", i, file, zoneName)
-		config := readZoneFile(zoneName, path.Join(dirName, fileName))
-		Zones[zoneName] = config
-		dns.HandleFunc(zoneName, setupServerFunc(config))
-	}
 
-	log.Println("ZONES", Zones)
+		seenFiles[fileName] = true
+
+		if lastRead, ok := configLastRead[fileName]; !ok || file.ModTime().After(lastRead) {
+			log.Println("Updated file, going to read", fileName)
+			configLastRead[fileName] = file.ModTime()
+			zoneName := fileName[0:strings.LastIndex(fileName, ".")]
+			//log.Println("FILE:", i, file, zoneName)
+			config := readZoneFile(zoneName, path.Join(dirName, fileName))
+			Zones[zoneName] = config
+			dns.HandleFunc(zoneName, setupServerFunc(config))
+		}
+
+		// TODO(ask) Disable zones not seen in two subsequent runs
+	}
 }
 
 func readZoneFile(zoneName, fileName string) *Zone {