From 7c47a8ffb7f40c1bbc90a534b03b5e918388ca8d Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 5 Jul 2016 14:27:10 +0100 Subject: [PATCH] Log errors arising from reading resolv.conf --- nameserver/dns.go | 19 +++++++++++++------ nameserver/dns_test.go | 4 ++-- nameserver/status.go | 3 ++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/nameserver/dns.go b/nameserver/dns.go index 9029a417..eb35584b 100644 --- a/nameserver/dns.go +++ b/nameserver/dns.go @@ -28,7 +28,7 @@ const ( ) type Upstream interface { - Config() *dns.ClientConfig + Config() (*dns.ClientConfig, error) } func NewUpstream(resolvConf, filterAddress string) Upstream { @@ -48,27 +48,31 @@ type upstream struct { lastModified time.Time } -func (u *upstream) Config() *dns.ClientConfig { +func (u *upstream) Config() (*dns.ClientConfig, error) { u.Lock() defer u.Unlock() // If we checked less than five seconds ago return what we already have now := time.Now() if now.Sub(u.lastStat) < 5*time.Second { - return u.cachedConfig + return u.cachedConfig, nil } u.lastStat = now // Reread file if it has changed - if fi, err := os.Stat(u.resolvConf); err == nil && fi.ModTime() != u.lastModified { + if fi, err := os.Stat(u.resolvConf); err != nil { + return u.cachedConfig, err + } else if fi.ModTime() != u.lastModified { if config, err := dns.ClientConfigFromFile(u.resolvConf); err == nil { config.Servers = filter(config.Servers, u.filterAddress) u.lastModified = fi.ModTime() u.cachedConfig = config + } else { + return u.cachedConfig, err } } - return u.cachedConfig + return u.cachedConfig, nil } func filter(ss []string, s string) []string { @@ -257,7 +261,10 @@ func (h *handler) handleRecursive(w dns.ResponseWriter, req *dns.Msg) { } } - upstreamConfig := h.upstream.Config() + upstreamConfig, err := h.upstream.Config() + if err != nil { + h.ns.errorf("unable to read upstream config: %s", err) + } for _, server := range upstreamConfig.Servers { reqCopy := req.Copy() reqCopy.Id = dns.Id() diff --git a/nameserver/dns_test.go b/nameserver/dns_test.go index 96c9460e..43cb117d 100644 --- a/nameserver/dns_test.go +++ b/nameserver/dns_test.go @@ -19,8 +19,8 @@ type mockUpstream struct { config *dns.ClientConfig } -func (mu *mockUpstream) Config() *dns.ClientConfig { - return mu.config +func (mu *mockUpstream) Config() (*dns.ClientConfig, error) { + return mu.config, nil } func startServer(t *testing.T, upstream *dns.ClientConfig) (*DNSServer, *Nameserver, int, int) { diff --git a/nameserver/status.go b/nameserver/status.go index 5f718f44..0a569bd2 100644 --- a/nameserver/status.go +++ b/nameserver/status.go @@ -36,9 +36,10 @@ func NewStatus(ns *Nameserver, dnsServer *DNSServer) *Status { entry.Tombstone}) } + upstreamConfig, _ := dnsServer.upstream.Config() return &Status{ dnsServer.domain, - dnsServer.upstream.Config().Servers, + upstreamConfig.Servers, dnsServer.address, dnsServer.ttl, entryStatusSlice}