diff --git a/cmd/nsupdate.go b/cmd/nsupdate.go index 249b8af..2b9bdd0 100644 --- a/cmd/nsupdate.go +++ b/cmd/nsupdate.go @@ -40,7 +40,7 @@ var nsupdateCmd = &cobra.Command{ Run: func(_ *cobra.Command, args []string) { conts := config.Union(args, contMask) execForEach(conts, func(c *container.Container) command.Set { - return c.NsUpdateCommands(config.Options.DomainName, config.Options.DNSServer, config.Options.TSIGName, config.Options.TSIGKey) + return c.NsUpdateCommands() }, 0) }, } diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index f1baea4..12260ce 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -163,7 +163,7 @@ func Init(conn context.Context) error { } Containers, Networks, Options = p.Containers, p.Networks, p.Options for i := range Containers { - Containers[i].Init(conn, Networks) + Containers[i].Init(conn, Networks, Options.DomainName, Options.DNSServer, Options.TSIGName, Options.TSIGKey) } slices.SortFunc(Containers, func(a, b *container.Container) bool { return a.Name < b.Name diff --git a/internal/pkg/container/container.go b/internal/pkg/container/container.go index 91108df..720989d 100644 --- a/internal/pkg/container/container.go +++ b/internal/pkg/container/container.go @@ -68,6 +68,10 @@ type Container struct { CapAdd []string `toml:"cap_add,omitempty"` Privileged null.Bool `toml:"privileged,omitempty"` Sysctl map[string]string `toml:"sysctl,omitempty"` + DomainName string `toml:"domain_name,omitempty"` + DnsServer string `toml:"dns_server,omitempty"` + TSIGName string `toml:"tsig_name,omitempty"` + TSIGKey string `toml:"tsig_key,omitempty"` conn context.Context getCData func() *define.InspectContainerData @@ -77,7 +81,7 @@ type Container struct { // Init will initialize a new container structure by filling in network details // and by querying other metadata from libpod, if possible. -func (c *Container) Init(conn context.Context, nets []*network.Network) error { +func (c *Container) Init(conn context.Context, nets []*network.Network, domain_name string, dns_server string, tsig_name string, tsig_key string) error { // initialize user-provided definitions for i := range c.Networks { var n *network.Network @@ -119,6 +123,19 @@ func (c *Container) Init(conn context.Context, nets []*network.Network) error { } c.conn = conn + if c.DomainName == "" { + c.DomainName = domain_name + } + if c.DnsServer == "" { + c.DnsServer = dns_server + } + if c.TSIGName == "" { + c.TSIGName = tsig_name + } + if c.TSIGKey == "" { + c.TSIGKey = tsig_key + } + c.watchCData() c.wasRunning = c.IsRunning() return nil diff --git a/internal/pkg/container/nsupdate.go b/internal/pkg/container/nsupdate.go index 8659e61..cef1d36 100644 --- a/internal/pkg/container/nsupdate.go +++ b/internal/pkg/container/nsupdate.go @@ -8,7 +8,7 @@ import ( "github.com/miekg/dns" ) -func do_reverse(rv string, dn string, server string, tsn string, tsk string) error { +func (c *Container) doReverse(rv string, dn string) error { ptr := dns.PTR{ Hdr: dns.RR_Header{ Name: rv, @@ -20,13 +20,13 @@ func do_reverse(rv string, dn string, server string, tsn string, tsk string) err } cli := new(dns.Client) - if tsn != "" { - cli.TsigSecret = map[string]string{tsn: tsk} + if c.TSIGName != "" { + cli.TsigSecret = map[string]string{c.TSIGName: c.TSIGKey} } msg := new(dns.Msg) msg.SetQuestion(rv, dns.TypeSOA) - resp, _, err := cli.Exchange(msg, server) + resp, _, err := cli.Exchange(msg, c.DnsServer) if err != nil { return err } @@ -36,22 +36,22 @@ func do_reverse(rv string, dn string, server string, tsn string, tsk string) err msg = new(dns.Msg) msg.SetUpdate(soa) msg.Ns = append(msg.Ns, &ptr) - if tsn != "" { - msg.SetTsig(tsn, dns.HmacSHA256, 300, time.Now().Unix()) + if c.TSIGName != "" { + msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) } - _, _, err = cli.Exchange(msg, server) + _, _, err = cli.Exchange(msg, c.DnsServer) if err != nil { return err } return nil } -func (c *Container) NsUpdateCommands(forward_domain string, server string, tsn string, tsk string) cmd.Set { +func (c *Container) NsUpdateCommands() cmd.Set { hostname := c.Hostname if c.Hostname == "" { hostname = c.Name } - dn := dns.Fqdn(hostname + "." + forward_domain) + dn := dns.Fqdn(hostname + "." + c.DomainName) cmds := []cmd.Command{} // TODO: also iterate over c.IPv6Addresses @@ -77,23 +77,23 @@ func (c *Container) NsUpdateCommands(forward_domain string, server string, tsn s } cli := new(dns.Client) - if tsn != "" { - cli.TsigSecret = map[string]string{tsn: tsk} + if c.TSIGName != "" { + cli.TsigSecret = map[string]string{c.TSIGName: c.TSIGKey} } // Update the forward record msg := new(dns.Msg) - msg.SetUpdate(dns.Fqdn(forward_domain)) + msg.SetUpdate(dns.Fqdn(c.DomainName)) msg.Ns = append(msg.Ns, &aaaa) - if tsn != "" { - msg.SetTsig(tsn, dns.HmacSHA256, 300, time.Now().Unix()) + if c.TSIGName != "" { + msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) } - if _, _, err = cli.Exchange(msg, server); err != nil { + if _, _, err = cli.Exchange(msg, c.DnsServer); err != nil { return err } - if err = do_reverse(rv, dn, server, tsn, tsk); err != nil { + if err = c.doReverse(rv, dn); err != nil { return err } return nil @@ -121,22 +121,22 @@ func (c *Container) NsUpdateCommands(forward_domain string, server string, tsn s } cli := new(dns.Client) - if tsn != "" { - cli.TsigSecret = map[string]string{tsn: tsk} + if c.TSIGName != "" { + cli.TsigSecret = map[string]string{c.TSIGName: c.TSIGKey} } // Update the forward record msg := new(dns.Msg) - msg.SetUpdate(dns.Fqdn(forward_domain)) + msg.SetUpdate(dns.Fqdn(c.DomainName)) msg.Ns = append(msg.Ns, &a) - if tsn != "" { - msg.SetTsig(tsn, dns.HmacSHA256, 300, time.Now().Unix()) + if c.TSIGName != "" { + msg.SetTsig(c.TSIGName, dns.HmacSHA256, 300, time.Now().Unix()) } - if _, _, err = cli.Exchange(msg, server); err != nil { + if _, _, err = cli.Exchange(msg, c.DnsServer); err != nil { return err } - if err = do_reverse(rv, dn, server, tsn, tsk); err != nil { + if err = c.doReverse(rv, dn); err != nil { return err } return nil