aboutsummaryrefslogtreecommitdiff
path: root/gen
diff options
context:
space:
mode:
authorGravatar Bob Wasniak <bwaz@users.noreply.github.com> 2017-01-31 12:25:02 -0500
committerGravatar Miek Gieben <miek@miek.nl> 2017-01-31 17:25:02 +0000
commit439d8b8d123596070ff68d2b038021f7527965b2 (patch)
tree0730f70058185479f0f5b5cfce23a42b9c67aeb5 /gen
parent738067a3c7a5ec15690364c0f5ba97c884195cd5 (diff)
downloadcoredns-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.go116
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)
+ }
+}