mirror of
https://gitea.elkins.co/Networking/ccl.git
synced 2025-03-10 05:01:38 -05:00
Will send updates to the configured dns server. To accomodate, added a global options section to the configuration as well. TODO: per-container domain name, dns server, and tsig keys Status: lightly tested development version, needs field testing
150 lines
3.2 KiB
Go
150 lines
3.2 KiB
Go
package container
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
|
|
cmd "gitea.elkins.co/Networking/ccl/internal/pkg/command"
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
func do_reverse(rv string, dn string, server string, tsn string, tsk string) error {
|
|
ptr := dns.PTR{
|
|
Hdr: dns.RR_Header{
|
|
Name: rv,
|
|
Rrtype: dns.TypePTR,
|
|
Class: dns.ClassINET,
|
|
Ttl: 7200,
|
|
},
|
|
Ptr: dn,
|
|
}
|
|
|
|
cli := new(dns.Client)
|
|
if tsn != "" {
|
|
cli.TsigSecret = map[string]string{tsn: tsk}
|
|
}
|
|
|
|
msg := new(dns.Msg)
|
|
msg.SetQuestion(rv, dns.TypeSOA)
|
|
resp, _, err := cli.Exchange(msg, server)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
soa := resp.Ns[0].Header().Name
|
|
|
|
// Update the reverse record
|
|
msg = new(dns.Msg)
|
|
msg.SetUpdate(soa)
|
|
msg.Ns = append(msg.Ns, &ptr)
|
|
if tsn != "" {
|
|
msg.SetTsig(tsn, dns.HmacSHA256, 300, time.Now().Unix())
|
|
}
|
|
_, _, err = cli.Exchange(msg, server)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *Container) NsUpdateCommands(forward_domain string, server string, tsn string, tsk string) cmd.Set {
|
|
hostname := c.Hostname
|
|
if c.Hostname == "" {
|
|
hostname = c.Name
|
|
}
|
|
dn := dns.Fqdn(hostname + "." + forward_domain)
|
|
cmds := []cmd.Command{}
|
|
|
|
// TODO: also iterate over c.IPv6Addresses
|
|
for i := range c.Networks {
|
|
n := &c.Networks[i]
|
|
if n.IPv6.Bool && !n.IPv6Address.IsUnspecified() {
|
|
ad := net.ParseIP(n.IPv6Address.String())
|
|
if ad != nil {
|
|
f_6 := func() error {
|
|
aaaa := dns.AAAA{
|
|
Hdr: dns.RR_Header{
|
|
Name: dn,
|
|
Rrtype: dns.TypeAAAA,
|
|
Class: dns.ClassINET,
|
|
Ttl: 7200,
|
|
},
|
|
AAAA: ad,
|
|
}
|
|
|
|
rv, err := dns.ReverseAddr(aaaa.AAAA.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cli := new(dns.Client)
|
|
if tsn != "" {
|
|
cli.TsigSecret = map[string]string{tsn: tsk}
|
|
}
|
|
|
|
// Update the forward record
|
|
msg := new(dns.Msg)
|
|
msg.SetUpdate(dns.Fqdn(forward_domain))
|
|
msg.Ns = append(msg.Ns, &aaaa)
|
|
|
|
if tsn != "" {
|
|
msg.SetTsig(tsn, dns.HmacSHA256, 300, time.Now().Unix())
|
|
}
|
|
if _, _, err = cli.Exchange(msg, server); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = do_reverse(rv, dn, server, tsn, tsk); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
cmds = append(cmds, cmd.NewFunc("nsupate6", f_6))
|
|
}
|
|
}
|
|
if !n.IPv4Address.IsUnspecified() {
|
|
ad := net.ParseIP(n.IPv4Address.String())
|
|
if ad != nil {
|
|
f_4 := func() error {
|
|
a := dns.A{
|
|
Hdr: dns.RR_Header{
|
|
Name: dn,
|
|
Rrtype: dns.TypeA,
|
|
Class: dns.ClassINET,
|
|
Ttl: 7200,
|
|
},
|
|
A: ad,
|
|
}
|
|
|
|
rv, err := dns.ReverseAddr(a.A.String())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cli := new(dns.Client)
|
|
if tsn != "" {
|
|
cli.TsigSecret = map[string]string{tsn: tsk}
|
|
}
|
|
|
|
// Update the forward record
|
|
msg := new(dns.Msg)
|
|
msg.SetUpdate(dns.Fqdn(forward_domain))
|
|
msg.Ns = append(msg.Ns, &a)
|
|
if tsn != "" {
|
|
msg.SetTsig(tsn, dns.HmacSHA256, 300, time.Now().Unix())
|
|
}
|
|
if _, _, err = cli.Exchange(msg, server); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = do_reverse(rv, dn, server, tsn, tsk); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
cmds = append(cmds, cmd.NewFunc("nsupate4", f_4))
|
|
}
|
|
}
|
|
}
|
|
return c.newCommandSet("NSUPDATE", cmds)
|
|
}
|