diff options
author | 2017-01-31 12:25:02 -0500 | |
---|---|---|
committer | 2017-01-31 17:25:02 +0000 | |
commit | 439d8b8d123596070ff68d2b038021f7527965b2 (patch) | |
tree | 0730f70058185479f0f5b5cfce23a42b9c67aeb5 /gen | |
parent | 738067a3c7a5ec15690364c0f5ba97c884195cd5 (diff) | |
download | coredns-439d8b8d123596070ff68d2b038021f7527965b2.tar.gz coredns-439d8b8d123596070ff68d2b038021f7527965b2.tar.zst coredns-439d8b8d123596070ff68d2b038021f7527965b2.zip |
middleware.cfg to configure middleware directives (#496)
* Use go generate to build middleware setup based on middleware.cfg
Init default config
* generated files
* Move gen to an isolated area
* rename files
* PR review updates
* undo readme
Diffstat (limited to 'gen')
-rw-r--r-- | gen/directives_generate.go | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/gen/directives_generate.go b/gen/directives_generate.go new file mode 100644 index 000000000..5cd8eccd2 --- /dev/null +++ b/gen/directives_generate.go @@ -0,0 +1,116 @@ +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) + } +} |