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.
This commit is contained in:
Miek Gieben 2016-09-10 09:16:25 +01:00 committed by GitHub
parent 5216ab6b58
commit 2dd8a687b3
19 changed files with 82 additions and 34 deletions

View file

@ -22,3 +22,6 @@ import (
_ "github.com/miekg/coredns/middleware/rewrite" _ "github.com/miekg/coredns/middleware/rewrite"
_ "github.com/miekg/coredns/middleware/secondary" _ "github.com/miekg/coredns/middleware/secondary"
) )
// Quiet mode will not show any informative output on initialization.
var Quiet bool

View file

@ -15,12 +15,13 @@ import (
"gopkg.in/natefinch/lumberjack.v2" "gopkg.in/natefinch/lumberjack.v2"
// Plug in CoreDNS // Plug in CoreDNS
_ "github.com/miekg/coredns/core" "github.com/miekg/coredns/core"
) )
func init() { func init() {
caddy.TrapSignals() caddy.TrapSignals()
caddy.DefaultConfigFile = "Corefile" caddy.DefaultConfigFile = "Corefile"
caddy.Quiet = true // don't show init stuff from caddy
setVersion() setVersion()
flag.StringVar(&conf, "conf", "", "Corefile to load (default \""+caddy.DefaultConfigFile+"\")") 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.BoolVar(&plugins, "plugins", false, "List installed plugins")
flag.StringVar(&logfile, "log", "", "Process log file") flag.StringVar(&logfile, "log", "", "Process log file")
flag.StringVar(&caddy.PidFile, "pidfile", "", "Path to write pid 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") flag.BoolVar(&version, "version", false, "Show version")
caddy.RegisterCaddyfileLoader("flag", caddy.LoaderFunc(confLoader)) caddy.RegisterCaddyfileLoader("flag", caddy.LoaderFunc(confLoader))
@ -58,12 +59,10 @@ func Run() {
MaxBackups: 10, MaxBackups: 10,
}) })
} }
log.SetFlags(log.LstdFlags)
if version { if version {
fmt.Printf("%s-%s\n", caddy.AppName, caddy.AppVersion) showVersion()
if devBuild && gitShortStat != "" {
fmt.Printf("%s\n%s\n", gitShortStat, gitFilesModified)
}
os.Exit(0) os.Exit(0)
} }
if plugins { if plugins {
@ -72,8 +71,7 @@ func Run() {
} }
// Set CPU cap // Set CPU cap
err := setCPU(cpu) if err := setCPU(cpu); err != nil {
if err != nil {
mustLogFatal(err) mustLogFatal(err)
} }
@ -89,10 +87,35 @@ func Run() {
mustLogFatal(err) mustLogFatal(err)
} }
logVersion()
// Twiddle your thumbs // Twiddle your thumbs
instance.Wait() 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 // mustLogFatal wraps log.Fatal() in a way that ensures the
// output is always printed to stderr so the user can see it // 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 // if the user is still there, even if the process log was not

View file

@ -5,6 +5,7 @@ import (
"net" "net"
"github.com/miekg/coredns/core/dnsserver" "github.com/miekg/coredns/core/dnsserver"
"github.com/miekg/coredns/middleware"
"github.com/mholt/caddy" "github.com/mholt/caddy"
) )
@ -13,11 +14,11 @@ func setupBind(c *caddy.Controller) error {
config := dnsserver.GetConfig(c) config := dnsserver.GetConfig(c)
for c.Next() { for c.Next() {
if !c.Args(&config.ListenHost) { if !c.Args(&config.ListenHost) {
return c.ArgErr() return middleware.Error("bind", c.ArgErr())
} }
} }
if net.ParseIP(config.ListenHost) == nil { 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 return nil
} }

View file

@ -20,7 +20,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
ttl, zones, err := cacheParse(c) ttl, zones, err := cacheParse(c)
if err != nil { if err != nil {
return err return middleware.Error("cache", err)
} }
dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler {
return NewCache(ttl, zones, next) return NewCache(ttl, zones, next)

View file

@ -2,6 +2,7 @@ package chaos
import ( import (
"github.com/miekg/coredns/core/dnsserver" "github.com/miekg/coredns/core/dnsserver"
"github.com/miekg/coredns/middleware"
"github.com/mholt/caddy" "github.com/mholt/caddy"
) )
@ -16,7 +17,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
version, authors, err := chaosParse(c) version, authors, err := chaosParse(c)
if err != nil { if err != nil {
return err return middleware.Error("chaos", err)
} }
dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler {

View file

@ -19,7 +19,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
zones, keys, err := dnssecParse(c) zones, keys, err := dnssecParse(c)
if err != nil { if err != nil {
return err return middleware.Error("dnssec", err)
} }
dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler {

View file

@ -6,6 +6,7 @@ import (
"os" "os"
"github.com/miekg/coredns/core/dnsserver" "github.com/miekg/coredns/core/dnsserver"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/pkg/roller" "github.com/miekg/coredns/middleware/pkg/roller"
"github.com/hashicorp/go-syslog" "github.com/hashicorp/go-syslog"
@ -22,7 +23,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
handler, err := errorsParse(c) handler, err := errorsParse(c)
if err != nil { if err != nil {
return err return middleware.Error("errors", err)
} }
var writer io.Writer var writer io.Writer
@ -37,7 +38,7 @@ func setup(c *caddy.Controller) error {
case "syslog": case "syslog":
writer, err = gsyslog.NewLogger(gsyslog.LOG_ERR, "LOCAL0", "coredns") writer, err = gsyslog.NewLogger(gsyslog.LOG_ERR, "LOCAL0", "coredns")
if err != nil { if err != nil {
return err return middleware.Error("errors", err)
} }
default: default:
if handler.LogFile == "" { if handler.LogFile == "" {
@ -48,7 +49,7 @@ func setup(c *caddy.Controller) error {
var file *os.File var file *os.File
file, err = os.OpenFile(handler.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) file, err = os.OpenFile(handler.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
if err != nil { if err != nil {
return err return middleware.Error("errors", err)
} }
if handler.LogRoller != nil { if handler.LogRoller != nil {
file.Close() file.Close()

View file

@ -28,7 +28,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
e, stubzones, err := etcdParse(c) e, stubzones, err := etcdParse(c)
if err != nil { if err != nil {
return err return middleware.Error("etcd", err)
} }
if stubzones { if stubzones {
c.OnStartup(func() error { c.OnStartup(func() error {

View file

@ -21,7 +21,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
zones, err := fileParse(c) zones, err := fileParse(c)
if err != nil { if err != nil {
return err return middleware.Error("file", err)
} }
// Add startup functions to notify the master(s). // Add startup functions to notify the master(s).

View file

@ -1,6 +1,10 @@
package health package health
import "github.com/mholt/caddy" import (
"github.com/miekg/coredns/middleware"
"github.com/mholt/caddy"
)
func init() { func init() {
caddy.RegisterPlugin("health", caddy.Plugin{ caddy.RegisterPlugin("health", caddy.Plugin{
@ -12,7 +16,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
addr, err := healthParse(c) addr, err := healthParse(c)
if err != nil { if err != nil {
return err return middleware.Error("health", err)
} }
health := &Health{Addr: addr} health := &Health{Addr: addr}

View file

@ -24,12 +24,12 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
kubernetes, err := kubernetesParse(c) kubernetes, err := kubernetesParse(c)
if err != nil { if err != nil {
return err return middleware.Error("kubernetes", err)
} }
err = kubernetes.InitKubeCache() err = kubernetes.InitKubeCache()
if err != nil { if err != nil {
return err return middleware.Error("kubernetes", err)
} }
// Register KubeCache start and stop functions with Caddy // Register KubeCache start and stop functions with Caddy

View file

@ -6,6 +6,7 @@ import (
"os" "os"
"github.com/miekg/coredns/core/dnsserver" "github.com/miekg/coredns/core/dnsserver"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/pkg/roller" "github.com/miekg/coredns/middleware/pkg/roller"
"github.com/hashicorp/go-syslog" "github.com/hashicorp/go-syslog"
@ -23,7 +24,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
rules, err := logParse(c) rules, err := logParse(c)
if err != nil { if err != nil {
return err return middleware.Error("log", err)
} }
// Open the log files for writing when the server starts // 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" { } else if rules[i].OutputFile == "syslog" {
writer, err = gsyslog.NewLogger(gsyslog.LOG_INFO, "LOCAL0", "coredns") writer, err = gsyslog.NewLogger(gsyslog.LOG_INFO, "LOCAL0", "coredns")
if err != nil { if err != nil {
return err return middleware.Error("log", err)
} }
} else { } else {
var file *os.File var file *os.File
file, err = os.OpenFile(rules[i].OutputFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) file, err = os.OpenFile(rules[i].OutputFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
if err != nil { if err != nil {
return err return middleware.Error("log", err)
} }
if rules[i].Roller != nil { if rules[i].Roller != nil {
file.Close() file.Close()

View file

@ -19,7 +19,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
m, err := prometheusParse(c) m, err := prometheusParse(c)
if err != nil { if err != nil {
return err return middleware.Error("prometheus", err)
} }
dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler {

View file

@ -2,6 +2,8 @@
package middleware package middleware
import ( import (
"fmt"
"github.com/miekg/dns" "github.com/miekg/dns"
"golang.org/x/net/context" "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) 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" const Namespace = "coredns"

View file

@ -4,6 +4,7 @@ import (
"sync" "sync"
"github.com/mholt/caddy" "github.com/mholt/caddy"
"github.com/miekg/coredns/middleware"
) )
func init() { func init() {
@ -17,13 +18,13 @@ func setup(c *caddy.Controller) error {
found := false found := false
for c.Next() { for c.Next() {
if found { 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 { if len(c.RemainingArgs()) != 0 {
return c.ArgErr() return middleware.Error("pprof", c.ArgErr())
} }
if c.NextBlock() { if c.NextBlock() {
return c.ArgErr() return middleware.Error("pprof", c.ArgErr())
} }
found = true found = true
} }

View file

@ -2,6 +2,7 @@ package proxy
import ( import (
"github.com/miekg/coredns/core/dnsserver" "github.com/miekg/coredns/core/dnsserver"
"github.com/miekg/coredns/middleware"
"github.com/mholt/caddy" "github.com/mholt/caddy"
) )
@ -16,7 +17,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
upstreams, err := NewStaticUpstreams(c.Dispenser) upstreams, err := NewStaticUpstreams(c.Dispenser)
if err != nil { if err != nil {
return err return middleware.Error("proxy", err)
} }
dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler {
return Proxy{Next: next, Client: Clients(), Upstreams: upstreams} return Proxy{Next: next, Client: Clients(), Upstreams: upstreams}

View file

@ -5,6 +5,7 @@ import (
"strings" "strings"
"github.com/miekg/coredns/core/dnsserver" "github.com/miekg/coredns/core/dnsserver"
"github.com/miekg/coredns/middleware"
"github.com/mholt/caddy" "github.com/mholt/caddy"
) )
@ -19,7 +20,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
rewrites, err := rewriteParse(c) rewrites, err := rewriteParse(c)
if err != nil { if err != nil {
return err return middleware.Error("rewrite", err)
} }
dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler {

View file

@ -18,7 +18,7 @@ func init() {
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
zones, err := secondaryParse(c) zones, err := secondaryParse(c)
if err != nil { if err != nil {
return err return middleware.Error("secondary", err)
} }
// Add startup functions to retrieve the zone and keep it up to date. // Add startup functions to retrieve the zone and keep it up to date.

View file

@ -12,6 +12,7 @@ import (
"github.com/miekg/dns" "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) { func TCPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
l, err := net.Listen("tcp", laddr) l, err := net.Listen("tcp", laddr)
if err != nil { if err != nil {
@ -33,6 +34,7 @@ func TCPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
return server, l.Addr().String(), nil 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) { func UDPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
pc, err := net.ListenPacket("udp", laddr) pc, err := net.ListenPacket("udp", laddr)
if err != nil { if err != nil {
@ -53,8 +55,11 @@ func UDPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
return server, pc.LocalAddr().String(), nil return server, pc.LocalAddr().String(), nil
} }
// CoreDNSServer returns a test server. It just takes a normal Corefile as input. // CoreDNSServer returns a CoreDNS test server. It just takes a normal Corefile as input.
func CoreDNSServer(corefile string) (*caddy.Instance, error) { return caddy.Start(NewInput(corefile)) } func CoreDNSServer(corefile string) (*caddy.Instance, error) {
caddy.Quiet = true
return caddy.Start(NewInput(corefile))
}
// CoreDNSSserverStop stops a server. // CoreDNSSserverStop stops a server.
func CoreDNSServerStop(i *caddy.Instance) { i.Stop() } func CoreDNSServerStop(i *caddy.Instance) { i.Stop() }