| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | package errors | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 	"regexp" | 
					
						
							|  |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 18:14:41 +02:00
										 |  |  | 	"github.com/coredns/caddy" | 
					
						
							| 
									
										
										
										
											2017-02-21 22:51:47 -08:00
										 |  |  | 	"github.com/coredns/coredns/core/dnsserver" | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | 	"github.com/coredns/coredns/plugin" | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 08:02:30 +01:00
										 |  |  | func init() { plugin.Register("errors", setup) } | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | func setup(c *caddy.Controller) error { | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	handler, err := errorsParse(c) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | 		return plugin.Error("errors", err) | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 	c.OnShutdown(func() error { | 
					
						
							|  |  |  | 		handler.stop() | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | 	dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 		handler.Next = next | 
					
						
							|  |  |  | 		return handler | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | func errorsParse(c *caddy.Controller) (*errorHandler, error) { | 
					
						
							|  |  |  | 	handler := newErrorHandler() | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | 	i := 0 | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	for c.Next() { | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | 		if i > 0 { | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 			return nil, plugin.ErrOnce | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-31 20:28:53 +01:00
										 |  |  | 		args := c.RemainingArgs() | 
					
						
							|  |  |  | 		switch len(args) { | 
					
						
							|  |  |  | 		case 0: | 
					
						
							|  |  |  | 		case 1: | 
					
						
							|  |  |  | 			if args[0] != "stdout" { | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 				return nil, c.Errf("invalid log file: %s", args[0]) | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-05-31 20:28:53 +01:00
										 |  |  | 		default: | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 			return nil, c.ArgErr() | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for c.NextBlock() { | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | 			switch c.Val() { | 
					
						
							|  |  |  | 			case "stacktrace": | 
					
						
							|  |  |  | 				dnsserver.GetConfig(c).Stacktrace = true | 
					
						
							|  |  |  | 			case "consolidate": | 
					
						
							|  |  |  | 				pattern, err := parseConsolidate(c) | 
					
						
							|  |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return nil, err | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				handler.patterns = append(handler.patterns, pattern) | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				return handler, c.SyntaxErr("Unknown field " + c.Val()) | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return handler, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | func parseConsolidate(c *caddy.Controller) (*pattern, error) { | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 	args := c.RemainingArgs() | 
					
						
							| 
									
										
										
										
											2021-07-09 16:23:02 +02:00
										 |  |  | 	if len(args) < 2 || len(args) > 3 { | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | 		return nil, c.ArgErr() | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	p, err := time.ParseDuration(args[0]) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | 		return nil, c.Err(err.Error()) | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	re, err := regexp.Compile(args[1]) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | 		return nil, c.Err(err.Error()) | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-07-09 16:23:02 +02:00
										 |  |  | 	lc, err := parseLogLevel(c, args) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2021-07-09 16:23:02 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-05-24 14:36:36 +02:00
										 |  |  | 	return &pattern{period: p, pattern: re, logCallback: lc}, nil | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-07-09 16:23:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func parseLogLevel(c *caddy.Controller, args []string) (func(format string, v ...interface{}), error) { | 
					
						
							|  |  |  | 	if len(args) != 3 { | 
					
						
							|  |  |  | 		return log.Errorf, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch args[2] { | 
					
						
							| 
									
										
										
										
											2021-07-09 18:38:58 +02:00
										 |  |  | 	case "warning": | 
					
						
							| 
									
										
										
										
											2021-07-09 16:23:02 +02:00
										 |  |  | 		return log.Warningf, nil | 
					
						
							|  |  |  | 	case "error": | 
					
						
							|  |  |  | 		return log.Errorf, nil | 
					
						
							|  |  |  | 	case "info": | 
					
						
							|  |  |  | 		return log.Infof, nil | 
					
						
							|  |  |  | 	case "debug": | 
					
						
							|  |  |  | 		return log.Debugf, nil | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2021-07-09 18:38:58 +02:00
										 |  |  | 		return nil, c.Errf("unknown log level argument in consolidate: %s", args[2]) | 
					
						
							| 
									
										
										
										
											2021-07-09 16:23:02 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |