From 007873a402ef264cf02cf65fae55bb3b9507eae4 Mon Sep 17 00:00:00 2001 From: Alvaro Saurin Date: Fri, 27 Feb 2015 12:22:08 +0100 Subject: [PATCH] zettio/weave#366 - keep the DNSServerConfig inmutable --- nameserver/server.go | 83 ++++++++++++++++++++------------------- nameserver/server_test.go | 4 +- weavedns/main.go | 4 +- 3 files changed, 46 insertions(+), 45 deletions(-) diff --git a/nameserver/server.go b/nameserver/server.go index ddaa22a9..792c447c 100644 --- a/nameserver/server.go +++ b/nameserver/server.go @@ -13,6 +13,7 @@ const ( DEFAULT_SERVER_PORT = 53 // The default server port DEFAULT_CLI_CFG_FILE = "/etc/resolv.conf" // default "resolv.conf" file to try to load DEFAULT_UDP_BUFLEN = 4096 // bigger than the default 512 + DEFAULT_IFACE_NAME = "default interface" ) func makeDNSFailResponse(r *dns.Msg) *dns.Msg { @@ -28,10 +29,6 @@ type DNSServerConfig struct { UpstreamCfgFile string // (Optional) DNS client config for the fallback server(s) UpstreamCfg *dns.ClientConfig - // DNS zone served - Zone Zone - // Interface where serving - Iface *net.Interface // (Optional) port number (for TCP and UDP) Port int // (Optional) local domain (ie, "weave.local.") @@ -39,62 +36,68 @@ type DNSServerConfig struct { } type DNSServer struct { - config *DNSServerConfig - udpSrv *dns.Server - tcpSrv *dns.Server - mdnsCli *MDNSClient - mdnsSrv *MDNSServer + config *DNSServerConfig + udpSrv *dns.Server + tcpSrv *dns.Server + mdnsCli *MDNSClient + mdnsSrv *MDNSServer + zone Zone + iface *net.Interface + upstream *dns.ClientConfig + Domain string // the local domain IfaceName string // the interface where mDNS is working on ListenAddr string // the address the server is listening at } // Creates a new DNS server -func NewDNSServer(config DNSServerConfig) (s *DNSServer, err error) { +func NewDNSServer(config DNSServerConfig, zone Zone, iface *net.Interface) (s *DNSServer, err error) { + s = &DNSServer{ + config: &config, + zone: zone, + iface: iface, + + Domain: DEFAULT_LOCAL_DOMAIN, + IfaceName: DEFAULT_IFACE_NAME, + ListenAddr: fmt.Sprintf(":%d", DEFAULT_SERVER_PORT), + } + // fill empty parameters with defaults... - if config.Port == 0 { - config.Port = DEFAULT_SERVER_PORT + if config.Port != 0 { + s.ListenAddr = fmt.Sprintf(":%d", config.Port) } - if len(config.LocalDomain) == 0 { - config.LocalDomain = DEFAULT_LOCAL_DOMAIN + if len(config.LocalDomain) > 0 { + s.Domain = config.LocalDomain } - if len(config.UpstreamCfgFile) == 0 { - config.UpstreamCfgFile = DEFAULT_CLI_CFG_FILE - } - if config.UpstreamCfg == nil { - if config.UpstreamCfg, err = dns.ClientConfigFromFile(config.UpstreamCfgFile); err != nil { + if config.UpstreamCfg != nil { + s.upstream = config.UpstreamCfg + } else { + cfgFile := DEFAULT_CLI_CFG_FILE + if len(config.UpstreamCfgFile) > 0 { + cfgFile = config.UpstreamCfgFile + } + if s.upstream, err = dns.ClientConfigFromFile(cfgFile); err != nil { return nil, err } } - - mdnsClient, err := NewMDNSClient() + s.mdnsCli, err = NewMDNSClient() if err != nil { return } - mdnsServer, err := NewMDNSServer(config.Zone) + s.mdnsSrv, err = NewMDNSServer(s.zone) if err != nil { return } - - ifaceName := "default interface" - if config.Iface != nil { - ifaceName = config.Iface.Name - } - - s = &DNSServer{ - config: &config, - mdnsCli: mdnsClient, - mdnsSrv: mdnsServer, - IfaceName: ifaceName, - ListenAddr: fmt.Sprintf(":%d", config.Port), + if iface != nil { + s.IfaceName = iface.Name } // create two DNS request multiplexerers, depending on the protocol used by clients // (we use the same protocol for asking upstream servers) mux := func(client *dns.Client) *dns.ServeMux { m := dns.NewServeMux() - m.HandleFunc(s.config.LocalDomain, s.queryHandler([]Lookup{s.config.Zone, s.mdnsCli})) - m.HandleFunc(RDNS_DOMAIN, s.rdnsHandler([]Lookup{s.config.Zone, s.mdnsCli}, client)) + m.HandleFunc(s.Domain, s.queryHandler([]Lookup{s.zone, s.mdnsCli})) + m.HandleFunc(RDNS_DOMAIN, s.rdnsHandler([]Lookup{s.zone, s.mdnsCli}, client)) m.HandleFunc(".", s.notUsHandler(client)) return m } @@ -108,9 +111,9 @@ func NewDNSServer(config DNSServerConfig) (s *DNSServer, err error) { // Start the DNS server func (s *DNSServer) Start() error { Info.Printf("Using mDNS on %s", s.IfaceName) - err := s.mdnsCli.Start(s.config.Iface) + err := s.mdnsCli.Start(s.iface) CheckFatal(err) - err = s.mdnsSrv.Start(s.config.Iface, s.config.LocalDomain) + err = s.mdnsSrv.Start(s.iface, s.Domain) CheckFatal(err) wg := new(sync.WaitGroup) @@ -199,8 +202,8 @@ func (s *DNSServer) notUsHandler(dnsClient *dns.Client) dns.HandlerFunc { return func(w dns.ResponseWriter, r *dns.Msg) { q := r.Question[0] Debug.Printf("[dns msgid %d] Fallback query: %+v", r.MsgHdr.Id, q) - for _, server := range s.config.UpstreamCfg.Servers { - reply, _, err := dnsClient.Exchange(r, fmt.Sprintf("%s:%s", server, s.config.UpstreamCfg.Port)) + for _, server := range s.upstream.Servers { + reply, _, err := dnsClient.Exchange(r, fmt.Sprintf("%s:%s", server, s.upstream.Port)) if err != nil { Debug.Printf("[dns msgid %d] Network error trying %s (%s)", r.MsgHdr.Id, server, err) diff --git a/nameserver/server_test.go b/nameserver/server_test.go index 542bc1e8..bc376ec1 100644 --- a/nameserver/server_test.go +++ b/nameserver/server_test.go @@ -66,7 +66,7 @@ func TestUDPDNSServer(t *testing.T) { wt.AssertNoErr(t, err) config := &dns.ClientConfig{Servers: []string{"127.0.0.1"}, Port: fallbackPort} - srv, err := NewDNSServer(DNSServerConfig{UpstreamCfg: config, Zone: zone, Port: port}) + srv, err := NewDNSServer(DNSServerConfig{UpstreamCfg: config, Port: port}, zone, nil) wt.AssertNoErr(t, err) defer srv.Stop() go srv.Start() @@ -190,7 +190,7 @@ func TestTCPDNSServer(t *testing.T) { t.Logf("Creating a WeaveDNS server instance, falling back to 127.0.0.1:%s", fallbackPort) config := &dns.ClientConfig{Servers: []string{"127.0.0.1"}, Port: fallbackPort} - srv, err := NewDNSServer(DNSServerConfig{UpstreamCfg: config, Zone: zone, Port: port}) + srv, err := NewDNSServer(DNSServerConfig{UpstreamCfg: config, Port: port}, zone, nil) wt.AssertNoErr(t, err) defer srv.Stop() go srv.Start() diff --git a/weavedns/main.go b/weavedns/main.go index 6474be80..235aa71d 100644 --- a/weavedns/main.go +++ b/weavedns/main.go @@ -70,8 +70,6 @@ func main() { } srvConfig := weavedns.DNSServerConfig{ - Zone: zone, - Iface: iface, Port: dnsPort, LocalDomain: localDomain, } @@ -86,7 +84,7 @@ func main() { } go weavedns.ListenHttp(localDomain, zone, httpPort) - srv, err := weavedns.NewDNSServer(srvConfig) + srv, err := weavedns.NewDNSServer(srvConfig, zone, iface) if err != nil { Error.Fatal("Failed to initialize the WeaveDNS server", err) }