From 2dd8a687b340e5ef7afa4bbe8802f25372b25cf9 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sat, 10 Sep 2016 09:16:25 +0100 Subject: [PATCH] Startup notification (#250) Stop the caddy message and start our own init notifications. Log the version of CoreDNS when starting up. Fix all middleware's setup functions so that return the error prefixed with *which* middleware was failing; leads to better debuggable errors when starting up. --- core/coredns.go | 3 +++ coremain/run.go | 39 +++++++++++++++++++++++++++------- middleware/bind/setup.go | 5 +++-- middleware/cache/setup.go | 2 +- middleware/chaos/setup.go | 3 ++- middleware/dnssec/setup.go | 2 +- middleware/errors/setup.go | 7 +++--- middleware/etcd/setup.go | 2 +- middleware/file/setup.go | 2 +- middleware/health/setup.go | 8 +++++-- middleware/kubernetes/setup.go | 4 ++-- middleware/log/setup.go | 7 +++--- middleware/metrics/setup.go | 2 +- middleware/middleware.go | 6 ++++++ middleware/pprof/setup.go | 7 +++--- middleware/proxy/setup.go | 3 ++- middleware/rewrite/setup.go | 3 ++- middleware/secondary/setup.go | 2 +- test/server.go | 9 ++++++-- 19 files changed, 82 insertions(+), 34 deletions(-) diff --git a/core/coredns.go b/core/coredns.go index 0ceb5d064..186c59612 100644 --- a/core/coredns.go +++ b/core/coredns.go @@ -22,3 +22,6 @@ import ( _ "github.com/miekg/coredns/middleware/rewrite" _ "github.com/miekg/coredns/middleware/secondary" ) + +// Quiet mode will not show any informative output on initialization. +var Quiet bool diff --git a/coremain/run.go b/coremain/run.go index e91876dca..e165825d2 100644 --- a/coremain/run.go +++ b/coremain/run.go @@ -15,12 +15,13 @@ import ( "gopkg.in/natefinch/lumberjack.v2" // Plug in CoreDNS - _ "github.com/miekg/coredns/core" + "github.com/miekg/coredns/core" ) func init() { caddy.TrapSignals() caddy.DefaultConfigFile = "Corefile" + caddy.Quiet = true // don't show init stuff from caddy setVersion() flag.StringVar(&conf, "conf", "", "Corefile to load (default \""+caddy.DefaultConfigFile+"\")") @@ -28,7 +29,7 @@ func init() { flag.BoolVar(&plugins, "plugins", false, "List installed plugins") flag.StringVar(&logfile, "log", "", "Process log file") flag.StringVar(&caddy.PidFile, "pidfile", "", "Path to write pid file") - flag.BoolVar(&caddy.Quiet, "quiet", false, "Quiet mode (no initialization output)") + flag.BoolVar(&core.Quiet, "quiet", false, "Quiet mode (no initialization output)") flag.BoolVar(&version, "version", false, "Show version") caddy.RegisterCaddyfileLoader("flag", caddy.LoaderFunc(confLoader)) @@ -58,12 +59,10 @@ func Run() { MaxBackups: 10, }) } + log.SetFlags(log.LstdFlags) if version { - fmt.Printf("%s-%s\n", caddy.AppName, caddy.AppVersion) - if devBuild && gitShortStat != "" { - fmt.Printf("%s\n%s\n", gitShortStat, gitFilesModified) - } + showVersion() os.Exit(0) } if plugins { @@ -72,8 +71,7 @@ func Run() { } // Set CPU cap - err := setCPU(cpu) - if err != nil { + if err := setCPU(cpu); err != nil { mustLogFatal(err) } @@ -89,10 +87,35 @@ func Run() { mustLogFatal(err) } + logVersion() + // Twiddle your thumbs instance.Wait() } +// startNotification will log CoreDNS' version to the log. +func startupNotification() { + if core.Quiet { + return + } + logVersion() +} + +func showVersion() { + fmt.Printf("%s-%s\n", caddy.AppName, caddy.AppVersion) + if devBuild && gitShortStat != "" { + fmt.Printf("%s\n%s\n", gitShortStat, gitFilesModified) + } +} + +// logVersion logs the version that is starting. +func logVersion() { + log.Printf("[INFO] %s-%s starting\n", caddy.AppName, caddy.AppVersion) + if devBuild && gitShortStat != "" { + log.Printf("[INFO] %s\n%s\n", gitShortStat, gitFilesModified) + } +} + // mustLogFatal wraps log.Fatal() in a way that ensures the // output is always printed to stderr so the user can see it // if the user is still there, even if the process log was not diff --git a/middleware/bind/setup.go b/middleware/bind/setup.go index c08098b5d..1c40e8fda 100644 --- a/middleware/bind/setup.go +++ b/middleware/bind/setup.go @@ -5,6 +5,7 @@ import ( "net" "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" "github.com/mholt/caddy" ) @@ -13,11 +14,11 @@ func setupBind(c *caddy.Controller) error { config := dnsserver.GetConfig(c) for c.Next() { if !c.Args(&config.ListenHost) { - return c.ArgErr() + return middleware.Error("bind", c.ArgErr()) } } if net.ParseIP(config.ListenHost) == nil { - return fmt.Errorf("not a valid IP address: %s", config.ListenHost) + return middleware.Error("bind", fmt.Errorf("not a valid IP address: %s", config.ListenHost)) } return nil } diff --git a/middleware/cache/setup.go b/middleware/cache/setup.go index ab7f423f2..6b003503b 100644 --- a/middleware/cache/setup.go +++ b/middleware/cache/setup.go @@ -20,7 +20,7 @@ func init() { func setup(c *caddy.Controller) error { ttl, zones, err := cacheParse(c) if err != nil { - return err + return middleware.Error("cache", err) } dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { return NewCache(ttl, zones, next) diff --git a/middleware/chaos/setup.go b/middleware/chaos/setup.go index 2a584b3c9..18746f1b0 100644 --- a/middleware/chaos/setup.go +++ b/middleware/chaos/setup.go @@ -2,6 +2,7 @@ package chaos import ( "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" "github.com/mholt/caddy" ) @@ -16,7 +17,7 @@ func init() { func setup(c *caddy.Controller) error { version, authors, err := chaosParse(c) if err != nil { - return err + return middleware.Error("chaos", err) } dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { diff --git a/middleware/dnssec/setup.go b/middleware/dnssec/setup.go index 999f85bf8..83ca785f4 100644 --- a/middleware/dnssec/setup.go +++ b/middleware/dnssec/setup.go @@ -19,7 +19,7 @@ func init() { func setup(c *caddy.Controller) error { zones, keys, err := dnssecParse(c) if err != nil { - return err + return middleware.Error("dnssec", err) } dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { diff --git a/middleware/errors/setup.go b/middleware/errors/setup.go index 5c7c1016c..e732a1e34 100644 --- a/middleware/errors/setup.go +++ b/middleware/errors/setup.go @@ -6,6 +6,7 @@ import ( "os" "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" "github.com/miekg/coredns/middleware/pkg/roller" "github.com/hashicorp/go-syslog" @@ -22,7 +23,7 @@ func init() { func setup(c *caddy.Controller) error { handler, err := errorsParse(c) if err != nil { - return err + return middleware.Error("errors", err) } var writer io.Writer @@ -37,7 +38,7 @@ func setup(c *caddy.Controller) error { case "syslog": writer, err = gsyslog.NewLogger(gsyslog.LOG_ERR, "LOCAL0", "coredns") if err != nil { - return err + return middleware.Error("errors", err) } default: if handler.LogFile == "" { @@ -48,7 +49,7 @@ func setup(c *caddy.Controller) error { var file *os.File file, err = os.OpenFile(handler.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) if err != nil { - return err + return middleware.Error("errors", err) } if handler.LogRoller != nil { file.Close() diff --git a/middleware/etcd/setup.go b/middleware/etcd/setup.go index 58ca8286f..37f817e5c 100644 --- a/middleware/etcd/setup.go +++ b/middleware/etcd/setup.go @@ -28,7 +28,7 @@ func init() { func setup(c *caddy.Controller) error { e, stubzones, err := etcdParse(c) if err != nil { - return err + return middleware.Error("etcd", err) } if stubzones { c.OnStartup(func() error { diff --git a/middleware/file/setup.go b/middleware/file/setup.go index 8b44650ee..65496d2eb 100644 --- a/middleware/file/setup.go +++ b/middleware/file/setup.go @@ -21,7 +21,7 @@ func init() { func setup(c *caddy.Controller) error { zones, err := fileParse(c) if err != nil { - return err + return middleware.Error("file", err) } // Add startup functions to notify the master(s). diff --git a/middleware/health/setup.go b/middleware/health/setup.go index cf7667d17..ca8c6684f 100644 --- a/middleware/health/setup.go +++ b/middleware/health/setup.go @@ -1,6 +1,10 @@ package health -import "github.com/mholt/caddy" +import ( + "github.com/miekg/coredns/middleware" + + "github.com/mholt/caddy" +) func init() { caddy.RegisterPlugin("health", caddy.Plugin{ @@ -12,7 +16,7 @@ func init() { func setup(c *caddy.Controller) error { addr, err := healthParse(c) if err != nil { - return err + return middleware.Error("health", err) } health := &Health{Addr: addr} diff --git a/middleware/kubernetes/setup.go b/middleware/kubernetes/setup.go index 09e4478e3..d68f69921 100644 --- a/middleware/kubernetes/setup.go +++ b/middleware/kubernetes/setup.go @@ -24,12 +24,12 @@ func init() { func setup(c *caddy.Controller) error { kubernetes, err := kubernetesParse(c) if err != nil { - return err + return middleware.Error("kubernetes", err) } err = kubernetes.InitKubeCache() if err != nil { - return err + return middleware.Error("kubernetes", err) } // Register KubeCache start and stop functions with Caddy diff --git a/middleware/log/setup.go b/middleware/log/setup.go index 0721090a9..37e8ebde3 100644 --- a/middleware/log/setup.go +++ b/middleware/log/setup.go @@ -6,6 +6,7 @@ import ( "os" "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" "github.com/miekg/coredns/middleware/pkg/roller" "github.com/hashicorp/go-syslog" @@ -23,7 +24,7 @@ func init() { func setup(c *caddy.Controller) error { rules, err := logParse(c) if err != nil { - return err + return middleware.Error("log", err) } // Open the log files for writing when the server starts @@ -39,13 +40,13 @@ func setup(c *caddy.Controller) error { } else if rules[i].OutputFile == "syslog" { writer, err = gsyslog.NewLogger(gsyslog.LOG_INFO, "LOCAL0", "coredns") if err != nil { - return err + return middleware.Error("log", err) } } else { var file *os.File file, err = os.OpenFile(rules[i].OutputFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) if err != nil { - return err + return middleware.Error("log", err) } if rules[i].Roller != nil { file.Close() diff --git a/middleware/metrics/setup.go b/middleware/metrics/setup.go index f31cbd4d5..36e131bf3 100644 --- a/middleware/metrics/setup.go +++ b/middleware/metrics/setup.go @@ -19,7 +19,7 @@ func init() { func setup(c *caddy.Controller) error { m, err := prometheusParse(c) if err != nil { - return err + return middleware.Error("prometheus", err) } dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { diff --git a/middleware/middleware.go b/middleware/middleware.go index 4c4c115c7..33990c1be 100644 --- a/middleware/middleware.go +++ b/middleware/middleware.go @@ -2,6 +2,8 @@ package middleware import ( + "fmt" + "github.com/miekg/dns" "golang.org/x/net/context" ) @@ -52,4 +54,8 @@ func (f HandlerFunc) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns. return f(ctx, w, r) } +// Error returns err with 'middleware/name: ' prefixed to it. +func Error(name string, err error) error { return fmt.Errorf("%s/%s: %s", "middleware", name, err) } + +// Namespace is the namespace used for the metrics. const Namespace = "coredns" diff --git a/middleware/pprof/setup.go b/middleware/pprof/setup.go index 2b6701f35..00e192919 100644 --- a/middleware/pprof/setup.go +++ b/middleware/pprof/setup.go @@ -4,6 +4,7 @@ import ( "sync" "github.com/mholt/caddy" + "github.com/miekg/coredns/middleware" ) func init() { @@ -17,13 +18,13 @@ func setup(c *caddy.Controller) error { found := false for c.Next() { if found { - return c.Err("pprof can only be specified once") + return middleware.Error("pprof", c.Err("pprof can only be specified once")) } if len(c.RemainingArgs()) != 0 { - return c.ArgErr() + return middleware.Error("pprof", c.ArgErr()) } if c.NextBlock() { - return c.ArgErr() + return middleware.Error("pprof", c.ArgErr()) } found = true } diff --git a/middleware/proxy/setup.go b/middleware/proxy/setup.go index 81dc7777c..a6c133f21 100644 --- a/middleware/proxy/setup.go +++ b/middleware/proxy/setup.go @@ -2,6 +2,7 @@ package proxy import ( "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" "github.com/mholt/caddy" ) @@ -16,7 +17,7 @@ func init() { func setup(c *caddy.Controller) error { upstreams, err := NewStaticUpstreams(c.Dispenser) if err != nil { - return err + return middleware.Error("proxy", err) } dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { return Proxy{Next: next, Client: Clients(), Upstreams: upstreams} diff --git a/middleware/rewrite/setup.go b/middleware/rewrite/setup.go index abfc0fbd6..89c80e868 100644 --- a/middleware/rewrite/setup.go +++ b/middleware/rewrite/setup.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" "github.com/mholt/caddy" ) @@ -19,7 +20,7 @@ func init() { func setup(c *caddy.Controller) error { rewrites, err := rewriteParse(c) if err != nil { - return err + return middleware.Error("rewrite", err) } dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { diff --git a/middleware/secondary/setup.go b/middleware/secondary/setup.go index 5550cf11d..8de9c540c 100644 --- a/middleware/secondary/setup.go +++ b/middleware/secondary/setup.go @@ -18,7 +18,7 @@ func init() { func setup(c *caddy.Controller) error { zones, err := secondaryParse(c) if err != nil { - return err + return middleware.Error("secondary", err) } // Add startup functions to retrieve the zone and keep it up to date. diff --git a/test/server.go b/test/server.go index 324ffdd8f..d3eab4135 100644 --- a/test/server.go +++ b/test/server.go @@ -12,6 +12,7 @@ import ( "github.com/miekg/dns" ) +// TCPServer returns a generic DNS server listening for TCP connections on laddr. func TCPServer(t *testing.T, laddr string) (*dns.Server, string, error) { l, err := net.Listen("tcp", laddr) if err != nil { @@ -33,6 +34,7 @@ func TCPServer(t *testing.T, laddr string) (*dns.Server, string, error) { return server, l.Addr().String(), nil } +// UDPServer returns a generic DNS server listening for UDP connections on laddr. func UDPServer(t *testing.T, laddr string) (*dns.Server, string, error) { pc, err := net.ListenPacket("udp", laddr) if err != nil { @@ -53,8 +55,11 @@ func UDPServer(t *testing.T, laddr string) (*dns.Server, string, error) { return server, pc.LocalAddr().String(), nil } -// CoreDNSServer returns a test server. It just takes a normal Corefile as input. -func CoreDNSServer(corefile string) (*caddy.Instance, error) { return caddy.Start(NewInput(corefile)) } +// CoreDNSServer returns a CoreDNS test server. It just takes a normal Corefile as input. +func CoreDNSServer(corefile string) (*caddy.Instance, error) { + caddy.Quiet = true + return caddy.Start(NewInput(corefile)) +} // CoreDNSSserverStop stops a server. func CoreDNSServerStop(i *caddy.Instance) { i.Stop() }