Overhaul nsupdate

ffs why is this so hard
This commit is contained in:
Joel Elkins 2024-03-30 14:24:39 -05:00
parent 03aa6c8d1b
commit 558bf7d66a
No known key found for this signature in database
GPG Key ID: 133589DC38921AE2

View File

@ -141,11 +141,16 @@ func (c *Container) killDnsForward(name string, rrtype uint16) error {
return nil return nil
} }
func (c *Container) doDnsForward(rr string) error { func (c *Container) doDnsForward(rr []string) error {
rr_parsed, err := dns.NewRR(rr) rrs := make([]dns.RR, len(rr))
for i := range rr {
rr_parsed, err := dns.NewRR(rr[i])
if err != nil { if err != nil {
return err return err
} }
rrs[i] = rr_parsed
}
cli := c.makeDnsClient() cli := c.makeDnsClient()
dn := dns.Fqdn(c.DomainName) dn := dns.Fqdn(c.DomainName)
@ -156,11 +161,11 @@ func (c *Container) doDnsForward(rr string) error {
// Update the forward record // Update the forward record
msg := new(dns.Msg) msg := new(dns.Msg)
msg.SetUpdate(dn) msg.SetUpdate(dn)
msg.Ns = append(msg.Ns, rr_parsed) msg.Ns = append(msg.Ns, rrs...)
if c.TSIGName != "" { if c.TSIGName != "" {
msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix())
} }
_, _, err = cli.Exchange(msg, c.DnsServer) _, _, err := cli.Exchange(msg, c.DnsServer)
return err return err
} }
@ -185,29 +190,51 @@ func (c *Container) NsUpdateCommands() cmd.Set {
} }
// prepare update commands // 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 { for i := range c.Networks {
n := &c.Networks[i] n := &c.Networks[i]
ip6s := []net.IP{}
if n.IPv6Address != nil && !n.IPv6Address.IsUnspecified() { if n.IPv6Address != nil && !n.IPv6Address.IsUnspecified() {
ip6s = append(ip6s, n.IPv6Address) ip6s = append(ip6s, n.IPv6Address)
} }
if n.IPv6Addresses != nil { if n.IPv6Addresses != nil {
ip6s = append(ip6s, n.IPv6Addresses...) ip6s = append(ip6s, n.IPv6Addresses...)
} }
if n.IPv4Address != nil && !n.IPv4Address.IsUnspecified() {
ip4s = append(ip4s, n.IPv4Address)
}
if n.IPv4Addresses != nil {
ip4s = append(ip4s, n.IPv4Addresses...)
}
}
// make reverse commands
for _, i := range ip6s {
f_6 := func() error { f_6 := func() error {
for _, a6 := range ip6s { return c.doDnsReverse(i.String(), dn, dns.TypeAAAA)
if err := c.doDnsReverse(a6.String(), dn, dns.TypeAAAA); err != nil {
return err
} }
cmds = append(cmds, cmd.NewFunc("reverse_dns_6"+i.String(), f_6))
} }
if err := c.killDnsForward(dn, dns.TypeAAAA); err != nil { for _, i := range ip4s {
return err f_4 := func() error {
return c.doDnsReverse(i.String(), dn, dns.TypeAAAA)
} }
for _, a6 := range ip6s { cmds = append(cmds, cmd.NewFunc("reverse_dns_4"+i.String(), f_4))
}
// make foreard commands
rrs := []string{}
for _, i := range ip6s {
aaaa := dns.AAAA{ aaaa := dns.AAAA{
Hdr: dns.RR_Header{ Hdr: dns.RR_Header{
Name: dn, Name: dn,
@ -215,35 +242,11 @@ func (c *Container) NsUpdateCommands() cmd.Set {
Class: dns.ClassINET, Class: dns.ClassINET,
Ttl: 7200, Ttl: 7200,
}, },
AAAA: a6, AAAA: i,
} }
if err := c.doDnsForward(aaaa.String()); err != nil { rrs = append(rrs, aaaa.String())
return err
} }
} for _, i := range ip4s {
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{ a := dns.A{
Hdr: dns.RR_Header{ Hdr: dns.RR_Header{
Name: dn, Name: dn,
@ -251,15 +254,14 @@ func (c *Container) NsUpdateCommands() cmd.Set {
Class: dns.ClassINET, Class: dns.ClassINET,
Ttl: 7200, Ttl: 7200,
}, },
A: a4, A: i,
} }
if err := c.doDnsForward(a.String()); err != nil { rrs = append(rrs, a.String())
return err
} }
fdns := func() error {
return c.doDnsForward(rrs)
} }
return nil cmds = append(cmds, cmd.NewFunc("forward_dns", fdns))
}
cmds = append(cmds, cmd.NewFunc("nsupate4", f_4))
}
return c.newCommandSet("NSUPDATE", cmds) return c.newCommandSet("NSUPDATE", cmds)
} }