| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | package setup | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/hashicorp/go-syslog" | 
					
						
							|  |  |  | 	"github.com/miekg/coredns/middleware" | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 	corednslog "github.com/miekg/coredns/middleware/log" | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	"github.com/miekg/coredns/server" | 
					
						
							| 
									
										
										
										
											2016-03-19 11:16:08 +00:00
										 |  |  | 	"github.com/miekg/dns" | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Log sets up the logging middleware. | 
					
						
							|  |  |  | func Log(c *Controller) (middleware.Middleware, error) { | 
					
						
							|  |  |  | 	rules, err := logParse(c) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Open the log files for writing when the server starts | 
					
						
							|  |  |  | 	c.Startup = append(c.Startup, func() error { | 
					
						
							|  |  |  | 		for i := 0; i < len(rules); i++ { | 
					
						
							|  |  |  | 			var err error | 
					
						
							|  |  |  | 			var writer io.Writer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if rules[i].OutputFile == "stdout" { | 
					
						
							|  |  |  | 				writer = os.Stdout | 
					
						
							|  |  |  | 			} else if rules[i].OutputFile == "stderr" { | 
					
						
							|  |  |  | 				writer = os.Stderr | 
					
						
							|  |  |  | 			} else if rules[i].OutputFile == "syslog" { | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				writer, err = gsyslog.NewLogger(gsyslog.LOG_INFO, "LOCAL0", "coredns") | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return 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 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				if rules[i].Roller != nil { | 
					
						
							|  |  |  | 					file.Close() | 
					
						
							|  |  |  | 					rules[i].Roller.Filename = rules[i].OutputFile | 
					
						
							|  |  |  | 					writer = rules[i].Roller.GetLogWriter() | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					writer = file | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			rules[i].Log = log.New(writer, "", 0) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return func(next middleware.Handler) middleware.Handler { | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 		return corednslog.Logger{Next: next, Rules: rules, ErrorFunc: server.DefaultErrorFunc} | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 	}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | func logParse(c *Controller) ([]corednslog.Rule, error) { | 
					
						
							|  |  |  | 	var rules []corednslog.Rule | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for c.Next() { | 
					
						
							|  |  |  | 		args := c.RemainingArgs() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var logRoller *middleware.LogRoller | 
					
						
							|  |  |  | 		if c.NextBlock() { | 
					
						
							|  |  |  | 			if c.Val() == "rotate" { | 
					
						
							|  |  |  | 				if c.NextArg() { | 
					
						
							|  |  |  | 					if c.Val() == "{" { | 
					
						
							|  |  |  | 						var err error | 
					
						
							|  |  |  | 						logRoller, err = parseRoller(c) | 
					
						
							|  |  |  | 						if err != nil { | 
					
						
							|  |  |  | 							return nil, err | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						// This part doesn't allow having something after the rotate block | 
					
						
							|  |  |  | 						if c.Next() { | 
					
						
							|  |  |  | 							if c.Val() != "}" { | 
					
						
							|  |  |  | 								return nil, c.ArgErr() | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if len(args) == 0 { | 
					
						
							|  |  |  | 			// Nothing specified; use defaults | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 			rules = append(rules, corednslog.Rule{ | 
					
						
							| 
									
										
										
										
											2016-03-19 11:16:08 +00:00
										 |  |  | 				NameScope:  ".", | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				OutputFile: corednslog.DefaultLogFilename, | 
					
						
							|  |  |  | 				Format:     corednslog.DefaultLogFormat, | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				Roller:     logRoller, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		} else if len(args) == 1 { | 
					
						
							|  |  |  | 			// Only an output file specified | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 			rules = append(rules, corednslog.Rule{ | 
					
						
							| 
									
										
										
										
											2016-03-19 11:16:08 +00:00
										 |  |  | 				NameScope:  ".", | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				OutputFile: args[0], | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 				Format:     corednslog.DefaultLogFormat, | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				Roller:     logRoller, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2016-03-19 11:16:08 +00:00
										 |  |  | 			// Name scope, output file, and maybe a format specified | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 			format := corednslog.DefaultLogFormat | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if len(args) > 2 { | 
					
						
							|  |  |  | 				switch args[2] { | 
					
						
							|  |  |  | 				case "{common}": | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 					format = corednslog.CommonLogFormat | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				case "{combined}": | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 					format = corednslog.CombinedLogFormat | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				default: | 
					
						
							|  |  |  | 					format = args[2] | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 11:07:44 -07:00
										 |  |  | 			rules = append(rules, corednslog.Rule{ | 
					
						
							| 
									
										
										
										
											2016-03-19 11:16:08 +00:00
										 |  |  | 				NameScope:  dns.Fqdn(args[0]), | 
					
						
							| 
									
										
										
										
											2016-03-18 20:57:35 +00:00
										 |  |  | 				OutputFile: args[1], | 
					
						
							|  |  |  | 				Format:     format, | 
					
						
							|  |  |  | 				Roller:     logRoller, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return rules, nil | 
					
						
							|  |  |  | } |