| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | //+build ignore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bufio" | 
					
						
							|  |  |  | 	"go/format" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"sort" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	mi := make(map[string]string, 0) | 
					
						
							|  |  |  | 	md := make(map[int]string, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	file, err := os.Open(middlewareFile) | 
					
						
							|  |  |  | 	fatalIfErr(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	defer file.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	scanner := bufio.NewScanner(file) | 
					
						
							|  |  |  | 	for scanner.Scan() { | 
					
						
							|  |  |  | 		line := scanner.Text() | 
					
						
							| 
									
										
										
										
											2017-02-19 20:34:29 +00:00
										 |  |  | 		if strings.HasPrefix(line, "#") { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		items := strings.Split(line, ":") | 
					
						
							|  |  |  | 		if len(items) != 3 { | 
					
						
							|  |  |  | 			// ignore | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		priority, err := strconv.Atoi(items[0]) | 
					
						
							|  |  |  | 		fatalIfErr(err) | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 21:00:00 +00:00
										 |  |  | 		if v, ok := md[priority]; ok { | 
					
						
							|  |  |  | 			log.Fatalf("Duplicate priority '%d', slot already taken by %q", priority, v) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-02-19 20:34:29 +00:00
										 |  |  | 		md[priority] = items[1] | 
					
						
							|  |  |  | 		mi[items[1]] = middlewarePath + items[2] // Default, unless overriden by 3rd arg | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 20:34:29 +00:00
										 |  |  | 		if strings.Contains(items[2], "/") { // External package has been given | 
					
						
							|  |  |  | 			mi[items[1]] = items[2] | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	genImports("core/zmiddleware.go", "core", mi) | 
					
						
							|  |  |  | 	genDirectives("core/dnsserver/zdirectives.go", "dnsserver", md) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func genImports(file, pack string, mi map[string]string) { | 
					
						
							|  |  |  | 	outs := header + "package " + pack + "\n\n" + "import (" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if len(mi) > 0 { | 
					
						
							|  |  |  | 		outs += "\n" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 07:25:58 +00:00
										 |  |  | 	outs += "// Include all middleware.\n" | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | 	for _, v := range mi { | 
					
						
							| 
									
										
										
										
											2017-02-15 11:38:55 -05:00
										 |  |  | 		outs += `_ "` + v + `"` + "\n" | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	outs += ")\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res, err := format.Source([]byte(outs)) | 
					
						
							|  |  |  | 	fatalIfErr(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = ioutil.WriteFile(file, res, 0644) | 
					
						
							|  |  |  | 	fatalIfErr(err) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func genDirectives(file, pack string, md map[int]string) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	outs := header + "package " + pack + "\n\n" | 
					
						
							|  |  |  | 	outs += ` | 
					
						
							|  |  |  | // Directives are registered in the order they should be | 
					
						
							|  |  |  | // executed. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Ordering is VERY important. Every middleware will | 
					
						
							|  |  |  | // feel the effects of all other middleware below | 
					
						
							|  |  |  | // (after) them during a request, but they must not | 
					
						
							|  |  |  | // care what middleware above them are doing. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var directives = []string{ | 
					
						
							|  |  |  | ` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var orders []int | 
					
						
							|  |  |  | 	for k := range md { | 
					
						
							|  |  |  | 		orders = append(orders, k) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	sort.Ints(orders) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, k := range orders { | 
					
						
							|  |  |  | 		outs += `"` + md[k] + `",` + "\n" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	outs += "}\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res, err := format.Source([]byte(outs)) | 
					
						
							|  |  |  | 	fatalIfErr(err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = ioutil.WriteFile(file, res, 0644) | 
					
						
							|  |  |  | 	fatalIfErr(err) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func fatalIfErr(err error) { | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2017-02-21 22:51:47 -08:00
										 |  |  | 	middlewarePath = "github.com/coredns/coredns/middleware/" | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | 	middlewareFile = "middleware.cfg" | 
					
						
							| 
									
										
										
										
											2017-02-22 07:25:58 +00:00
										 |  |  | 	header         = "// generated by directives_generate.go; DO NOT EDIT\n\n" | 
					
						
							| 
									
										
										
										
											2017-02-14 19:23:18 +00:00
										 |  |  | ) |