aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2016-09-10 09:16:25 +0100
committerGravatar GitHub <noreply@github.com> 2016-09-10 09:16:25 +0100
commit2dd8a687b340e5ef7afa4bbe8802f25372b25cf9 (patch)
tree3be78c3e5f9f80cef1c602b2c1be0804c92e01bc
parent5216ab6b581165ae54b5d3462e3e63d460317cf3 (diff)
downloadcoredns-2dd8a687b340e5ef7afa4bbe8802f25372b25cf9.tar.gz
coredns-2dd8a687b340e5ef7afa4bbe8802f25372b25cf9.tar.zst
coredns-2dd8a687b340e5ef7afa4bbe8802f25372b25cf9.zip
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.
-rw-r--r--core/coredns.go3
-rw-r--r--coremain/run.go39
-rw-r--r--middleware/bind/setup.go5
-rw-r--r--middleware/cache/setup.go2
-rw-r--r--middleware/chaos/setup.go3
-rw-r--r--middleware/dnssec/setup.go2
-rw-r--r--middleware/errors/setup.go7
-rw-r--r--middleware/etcd/setup.go2
-rw-r--r--middleware/file/setup.go2
-rw-r--r--middleware/health/setup.go8
-rw-r--r--middleware/kubernetes/setup.go4
-rw-r--r--middleware/log/setup.go7
-rw-r--r--middleware/metrics/setup.go2
-rw-r--r--middleware/middleware.go6
-rw-r--r--middleware/pprof/setup.go7
-rw-r--r--middleware/proxy/setup.go3
-rw-r--r--middleware/rewrite/setup.go3
-rw-r--r--middleware/secondary/setup.go2
-rw-r--r--test/server.go9
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() }