func setupPgeodnsZone(Zones Zones) { zoneName := "pgeodns" Zone := new(Zone) Zone.Labels = make(labels) Zone.Origin = zoneName Zone.LenLabels = dns.LenLabels(Zone.Origin) label := new(Label) label.Records = make(map[uint16]Records) label.Weight = make(map[uint16]int) Zone.Labels[""] = label setupSOA(Zone) Zones[zoneName] = Zone dns.HandleFunc(zoneName, setupServerFunc(Zone)) }
func readZoneFile(zoneName, fileName string) (*Zone, error) { defer func() { if err := recover(); err != nil { log.Printf("reading %s failed: %s", zoneName, err) debug.PrintStack() } }() fh, err := os.Open(fileName) if err != nil { log.Println("Could not read ", fileName, ": ", err) panic(err) } Zone := new(Zone) Zone.Labels = make(labels) Zone.Origin = zoneName Zone.LenLabels = dns.LenLabels(Zone.Origin) Zone.Options.Ttl = 120 Zone.Options.MaxHosts = 2 if err == nil { var objmap map[string]interface{} decoder := json.NewDecoder(fh) err := decoder.Decode(&objmap) if err != nil { panic(err) } //log.Println(objmap) var data map[string]interface{} for k, v := range objmap { //log.Printf("k: %s v: %#v, T: %T\n", k, v, v) switch k { case "ttl", "serial", "max_hosts": switch option := k; option { case "ttl": Zone.Options.Ttl = valueToInt(v) case "serial": Zone.Options.Serial = valueToInt(v) case "max_hosts": Zone.Options.MaxHosts = valueToInt(v) } continue case "data": data = v.(map[string]interface{}) } } setupZoneData(data, Zone) } //log.Printf("ZO T: %T %s\n", Zones["0.us"], Zones["0.us"]) //log.Println("IP", string(Zone.Regions["0.us"].IPv4[0].ip)) return Zone, nil }