mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	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:
		| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
							
								
								
									
										2
									
								
								middleware/cache/setup.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								middleware/cache/setup.go
									
									
									
									
										vendored
									
									
								
							| @@ -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) | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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). | ||||
|   | ||||
| @@ -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} | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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" | ||||
|   | ||||
| @@ -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 | ||||
| 	} | ||||
|   | ||||
| @@ -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} | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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. | ||||
|   | ||||
| @@ -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() } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user