| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-04-19 22:51:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-03 09:04:47 +08:00
										 |  |  | 	"github.com/caddyserver/caddy" | 
					
						
							| 
									
										
										
										
											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() { | 
					
						
							|  |  |  | 			if err := parseBlock(c, handler); err != nil { | 
					
						
							|  |  |  | 				return nil, err | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return handler, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-10-27 17:37:09 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | func parseBlock(c *caddy.Controller, h *errorHandler) error { | 
					
						
							|  |  |  | 	if c.Val() != "consolidate" { | 
					
						
							|  |  |  | 		return c.SyntaxErr("consolidate") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	args := c.RemainingArgs() | 
					
						
							|  |  |  | 	if len(args) != 2 { | 
					
						
							|  |  |  | 		return c.ArgErr() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	p, err := time.ParseDuration(args[0]) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return c.Err(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	re, err := regexp.Compile(args[1]) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return c.Err(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	h.patterns = append(h.patterns, &pattern{period: p, pattern: re}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |