From cbcfeef9e1473d32a6fcbbfef5796029832883e0 Mon Sep 17 00:00:00 2001 From: "Joel D. Elkins" Date: Sat, 30 Mar 2024 23:21:53 -0500 Subject: [PATCH] Yet another nsupdate overhaul cannot seem to figure this out. still not really working right. --- internal/pkg/container/nsupdate.go | 98 ++++++++++++++++++------------ 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/internal/pkg/container/nsupdate.go b/internal/pkg/container/nsupdate.go index 4da987b..ea5a682 100644 --- a/internal/pkg/container/nsupdate.go +++ b/internal/pkg/container/nsupdate.go @@ -52,10 +52,14 @@ func (c *Container) killDnsReverse(ip string) error { } // This is the same code for ipv4 or ipv6 so factor it out -func (c *Container) doDnsReverse(ip string, dn string, rrtype uint16) error { - rv, err := dns.ReverseAddr(ip) - if err != nil { - return err +func (c *Container) doDnsReverse(ips []net.IP, dn string, rrtype uint16) error { + rips := make([]string, len(ips)) + for i := range ips { + rv, err := dns.ReverseAddr(ips[i].String()) + if err != nil { + return err + } + rips[i] = rv } cli := c.makeDnsClient() @@ -84,34 +88,57 @@ func (c *Container) doDnsReverse(ip string, dn string, rrtype uint16) error { } } - // Determine SOA of reverse zone - msg = new(dns.Msg) - msg.SetQuestion(rv, dns.TypeSOA) - resp, _, err = cli.Exchange(msg, c.DnsServer) - if err != nil { - return err - } - soa := resp.Ns[0].Header().Name + // map key is SOA + messages := map[string]*dns.Msg{} - // Update the reverse record - ptr := dns.PTR{ - Hdr: dns.RR_Header{ - Name: rv, - Rrtype: dns.TypePTR, - Class: dns.ClassINET, - Ttl: 7200, - }, - Ptr: dn, + for i := range rips { + // Determine SOA of reverse zone + msg = new(dns.Msg) + msg.SetQuestion(rips[i], dns.TypeSOA) + resp, _, err = cli.Exchange(msg, c.DnsServer) + if err != nil { + return err + } + soa := resp.Ns[0].Header().Name + + if messages[soa] == nil { + msg := new(dns.Msg) + msg.SetUpdate(soa) + messages[soa] = msg + } + + // Update the reverse record + ptr := dns.PTR{ + Hdr: dns.RR_Header{ + Name: rips[i], + Rrtype: dns.TypePTR, + Class: dns.ClassINET, + Ttl: 7200, + }, + Ptr: dn, + } + + messages[soa].Ns = append(messages[soa].Ns, &ptr) } - msg = new(dns.Msg) - msg.SetUpdate(soa) - msg.Ns = append(msg.Ns, &ptr) - if c.TSIGName != "" { - msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) + // execute the messages + errs := make([]error, len(messages)) + j := 0 + for _, msg := range messages { + if c.TSIGName != "" { + msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) + } + _, _, errs[j] = cli.Exchange(msg, c.DnsServer) + j += 1 } - _, _, err = cli.Exchange(msg, c.DnsServer) - return err + + // check for errors + for _, err := range errs { + if err != nil { + return err + } + } + return nil } func (c *Container) killDnsForward(name string, rrtype uint16) error { @@ -219,18 +246,13 @@ func (c *Container) NsUpdateCommands() cmd.Set { } // make reverse commands - for _, i := range ip6s { - f_6 := func() error { - return c.doDnsReverse(i.String(), dn, dns.TypeAAAA) + rdns := func() error { + if err := c.doDnsReverse(ip6s, dn, dns.TypeAAAA); err != nil { + return err } - cmds = append(cmds, cmd.NewFunc("reverse_dns_6"+i.String(), f_6)) - } - for _, i := range ip4s { - f_4 := func() error { - return c.doDnsReverse(i.String(), dn, dns.TypeAAAA) - } - cmds = append(cmds, cmd.NewFunc("reverse_dns_4"+i.String(), f_4)) + return c.doDnsReverse(ip4s, dn, dns.TypeA) } + cmds = append(cmds, cmd.NewFunc("reverse_dns", rdns)) // make foreard commands rrs := []string{}