From 558bf7d66afe6cdcc9070493009981d52461f49b Mon Sep 17 00:00:00 2001 From: "Joel D. Elkins" Date: Sat, 30 Mar 2024 14:24:39 -0500 Subject: [PATCH] Overhaul nsupdate ffs why is this so hard --- internal/pkg/container/nsupdate.go | 134 +++++++++++++++-------------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/internal/pkg/container/nsupdate.go b/internal/pkg/container/nsupdate.go index d7632d9..4da987b 100644 --- a/internal/pkg/container/nsupdate.go +++ b/internal/pkg/container/nsupdate.go @@ -141,10 +141,15 @@ func (c *Container) killDnsForward(name string, rrtype uint16) error { return nil } -func (c *Container) doDnsForward(rr string) error { - rr_parsed, err := dns.NewRR(rr) - if err != nil { - return err +func (c *Container) doDnsForward(rr []string) error { + rrs := make([]dns.RR, len(rr)) + + for i := range rr { + rr_parsed, err := dns.NewRR(rr[i]) + if err != nil { + return err + } + rrs[i] = rr_parsed } cli := c.makeDnsClient() @@ -156,11 +161,11 @@ func (c *Container) doDnsForward(rr string) error { // Update the forward record msg := new(dns.Msg) msg.SetUpdate(dn) - msg.Ns = append(msg.Ns, rr_parsed) + msg.Ns = append(msg.Ns, rrs...) if c.TSIGName != "" { msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) } - _, _, err = cli.Exchange(msg, c.DnsServer) + _, _, err := cli.Exchange(msg, c.DnsServer) return err } @@ -185,81 +190,78 @@ func (c *Container) NsUpdateCommands() cmd.Set { } // prepare update commands - cmds := []cmd.Command{} + cmds := []cmd.Command{ + cmd.NewFunc("kill_fwd_6", func() error { + return c.killDnsForward(dn, dns.TypeAAAA) + }), + cmd.NewFunc("kill_fwd_4", func() error { + return c.killDnsForward(dn, dns.TypeA) + }), + } + // gather all ip addresses to be mapped to this name + ip6s := []net.IP{} + ip4s := []net.IP{} for i := range c.Networks { n := &c.Networks[i] - - ip6s := []net.IP{} if n.IPv6Address != nil && !n.IPv6Address.IsUnspecified() { ip6s = append(ip6s, n.IPv6Address) } if n.IPv6Addresses != nil { ip6s = append(ip6s, n.IPv6Addresses...) } - - f_6 := func() error { - for _, a6 := range ip6s { - if err := c.doDnsReverse(a6.String(), dn, dns.TypeAAAA); err != nil { - return err - } - } - if err := c.killDnsForward(dn, dns.TypeAAAA); err != nil { - return err - } - for _, a6 := range ip6s { - aaaa := dns.AAAA{ - Hdr: dns.RR_Header{ - Name: dn, - Rrtype: dns.TypeAAAA, - Class: dns.ClassINET, - Ttl: 7200, - }, - AAAA: a6, - } - if err := c.doDnsForward(aaaa.String()); err != nil { - return err - } - } - - return nil - } - cmds = append(cmds, cmd.NewFunc("nsupate6", f_6)) - - ip4s := []net.IP{} if n.IPv4Address != nil && !n.IPv4Address.IsUnspecified() { ip4s = append(ip4s, n.IPv4Address) } if n.IPv4Addresses != nil { ip4s = append(ip4s, n.IPv4Addresses...) } - - f_4 := func() error { - for _, a4 := range ip4s { - if err := c.doDnsReverse(a4.String(), dn, dns.TypeA); err != nil { - return err - } - } - if err := c.killDnsForward(dn, dns.TypeA); err != nil { - return err - } - for _, a4 := range ip4s { - a := dns.A{ - Hdr: dns.RR_Header{ - Name: dn, - Rrtype: dns.TypeA, - Class: dns.ClassINET, - Ttl: 7200, - }, - A: a4, - } - if err := c.doDnsForward(a.String()); err != nil { - return err - } - } - return nil - } - cmds = append(cmds, cmd.NewFunc("nsupate4", f_4)) } + + // make reverse commands + for _, i := range ip6s { + f_6 := func() error { + return c.doDnsReverse(i.String(), dn, dns.TypeAAAA) + } + 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)) + } + + // make foreard commands + rrs := []string{} + for _, i := range ip6s { + aaaa := dns.AAAA{ + Hdr: dns.RR_Header{ + Name: dn, + Rrtype: dns.TypeAAAA, + Class: dns.ClassINET, + Ttl: 7200, + }, + AAAA: i, + } + rrs = append(rrs, aaaa.String()) + } + for _, i := range ip4s { + a := dns.A{ + Hdr: dns.RR_Header{ + Name: dn, + Rrtype: dns.TypeA, + Class: dns.ClassINET, + Ttl: 7200, + }, + A: i, + } + rrs = append(rrs, a.String()) + } + fdns := func() error { + return c.doDnsForward(rrs) + } + cmds = append(cmds, cmd.NewFunc("forward_dns", fdns)) + return c.newCommandSet("NSUPDATE", cmds) }