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,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)
}