diff --git a/Makefile b/Makefile index cc87ea63f..a720d23ab 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ clean: .PHONY: gen gen: - go generate ./core/... + go generate coredns.go .PHONY: distclean distclean: clean diff --git a/core/coredns.go b/core/coredns.go index b621f2c27..0449c4c2f 100644 --- a/core/coredns.go +++ b/core/coredns.go @@ -1,7 +1,4 @@ // Package core registers the server and all plugins we support. - -// Additional middleware packages -//go:generate go run ../gen/directives_generate.go ../middleware.cfg package core import ( diff --git a/core/dnsserver/directives.go b/core/dnsserver/directives.go index 2d9fce66e..bc37baf11 100644 --- a/core/dnsserver/directives.go +++ b/core/dnsserver/directives.go @@ -1,4 +1,3 @@ -//go:generate go run ../../gen/directives_generate.go ../../middleware.cfg package dnsserver import ( diff --git a/core/dnsserver/zdirectives.go b/core/dnsserver/zdirectives.go index ff6722998..3f76a401d 100644 --- a/core/dnsserver/zdirectives.go +++ b/core/dnsserver/zdirectives.go @@ -1,7 +1,6 @@ // generated by directives_generate.go; DO NOT EDIT package dnsserver - // Directives are registered in the order they should be // executed. // @@ -11,27 +10,27 @@ package dnsserver // care what middleware above them are doing. var directives = []string{ - "root", - "bind", - "trace", - "health", - "pprof", - "prometheus", - "errors", - "log", - "chaos", - "cache", - "rewrite", - "loadbalance", - "dnssec", - "file", - "auto", - "secondary", - "etcd", - "kubernetes", - "reverse", - "proxy", - "httpprox", - "whoami", - "erratic", + "root", + "bind", + "trace", + "health", + "pprof", + "prometheus", + "errors", + "log", + "chaos", + "cache", + "rewrite", + "loadbalance", + "dnssec", + "file", + "auto", + "secondary", + "etcd", + "kubernetes", + "reverse", + "proxy", + "httpprox", + "whoami", + "erratic", } diff --git a/coredns.go b/coredns.go index f03c218e9..17f106566 100644 --- a/coredns.go +++ b/coredns.go @@ -1,5 +1,7 @@ package main +//go:generate go run directives_generate.go + import "github.com/miekg/coredns/coremain" func main() { diff --git a/directives_generate.go b/directives_generate.go new file mode 100644 index 000000000..c6c719fc6 --- /dev/null +++ b/directives_generate.go @@ -0,0 +1,114 @@ +//+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() + if !strings.HasPrefix(line, `//`) && !strings.HasPrefix(line, "#") { + items := strings.Split(line, ":") + if len(items) == 3 { + if priority, err := strconv.Atoi(items[0]); err == nil { + md[priority] = items[1] + } + + if items[2] != "" { + if strings.Contains(items[2], "/") { + mi[items[1]] = items[2] + } else { + mi[items[1]] = middlewarePath + items[2] + } + } + + } + } + } + + 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" + } + + for _, v := range mi { + outs += `_ "` + v + `\` + "\n" + } + 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 ( + middlewarePath = "github.com/miekg/coredns/middleware/" + middlewareFile = "middleware.cfg" + header = "// generated by directives_generate.go; DO NOT EDIT\n" +) diff --git a/gen/directives_generate.go b/gen/directives_generate.go deleted file mode 100644 index 5cd8eccd2..000000000 --- a/gen/directives_generate.go +++ /dev/null @@ -1,116 +0,0 @@ -package main - -import ( - "bufio" - "io/ioutil" - "os" - "sort" - "strconv" - "strings" -) - -var middlewarePath = "github.com/miekg/coredns/middleware/" -var header = "// generated by directives_generate.go; DO NOT EDIT\n" - -func main() { - mwFile := os.Args[1] - - mi := make(map[string]string, 0) - md := make(map[int]string, 0) - - if file, err := os.Open(mwFile); err == nil { - defer file.Close() - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := scanner.Text() - if !strings.HasPrefix(line, `//`) && !strings.HasPrefix(line, "#") { - items := strings.Split(line, ":") - if len(items) == 3 { - if priority, err := strconv.Atoi(items[0]); err == nil { - md[priority] = items[1] - } - - if items[2] != "" { - if strings.Contains(items[2], "/") { - mi[items[1]] = items[2] - } else { - mi[items[1]] = middlewarePath + items[2] - } - } - - } - } - } - - var orders []int - for k := range md { - orders = append(orders, k) - } - sort.Ints(orders) - - if os.Getenv("GOPACKAGE") == "core" { - genImports("zmiddleware.go", mi) - } - if os.Getenv("GOPACKAGE") == "dnsserver" { - genDirectives("zdirectives.go", md) - } - - } else { - os.Exit(1) - } - os.Exit(0) - -} - -func genImports(file string, mi map[string]string) { - outs := header + "package " + os.Getenv("GOPACKAGE") + "\n\n" + "import (" - - if len(mi) > 0 { - outs += "\n" - } - - for _, v := range mi { - outs += " _ \"" + v + "\"\n" - } - outs += ")\n" - - err := ioutil.WriteFile(file, []byte(outs), 0644) - if err != nil { - os.Exit(1) - } - -} - -func genDirectives(file string, md map[int]string) { - - outs := header + "package " + os.Getenv("GOPACKAGE") + "\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" - - err := ioutil.WriteFile(file, []byte(outs), 0644) - if err != nil { - os.Exit(1) - } -}