func retrieveDomains() map[string]*Domain { var domains map[string]*Domain domains = make(map[string]*Domain) client := new(dns.Client) client.TsigSecret = map[string]string{"transfer-key.": "zasDqD5nW1USPh4vhLfDBw=="} client.Net = "tcp" msg := new(dns.Msg) msg.SetAxfr(".") msg.SetTsig("transfer-key.", dns.HmacMD5, 300, time.Now().Unix()) transfer := dns.Transfer{ TsigSecret: map[string]string{"transfer-key.": "zasDqD5nW1USPh4vhLfDBw=="}, } transferChannel, err := transfer.In(msg, "localhost:53") if err != nil { log.Printf("Error retrieving zones: %s", err.Error()) return domains } var glues map[string]string glues = make(map[string]string) for { response, ok := <-transferChannel if !ok { break } if response.Error != nil { log.Printf("Error retrieving zones: %s", response.Error.Error()) return domains } for _, rr := range response.RR { if rr.Header().Name == "." || rr.Header().Name == "music." { continue } if rr.Header().Rrtype == dns.TypeNS { nsRR := rr.(*dns.NS) ns := new(Nameserver) ns.Name = nsRR.Ns domain := domains[rr.Header().Name] if domain == nil { domain = new(Domain) domain.Name = rr.Header().Name } domain.Nameservers = append(domain.Nameservers, ns) domains[rr.Header().Name] = domain } else if rr.Header().Rrtype == dns.TypeDS { dsRR := rr.(*dns.DS) ds := new(DS) ds.KeyTag = int(dsRR.KeyTag) ds.Algorithm = int(dsRR.Algorithm) ds.DigestType = dsRR.DigestType ds.Digest = strings.ToUpper(dsRR.Digest) domain := domains[rr.Header().Name] if domain == nil { domain = new(Domain) domain.Name = rr.Header().Name } domain.DSs = append(domain.DSs, ds) domains[rr.Header().Name] = domain } else if rr.Header().Rrtype == dns.TypeA { aRR := rr.(*dns.A) glues[aRR.Header().Name] = aRR.A.String() } } } for _, domain := range domains { for _, nameserver := range domain.Nameservers { for name, glue := range glues { if nameserver.Name == name { nameserver.Glue = glue } } } } return domains }