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
This commit is contained in:
Bob Wasniak
2017-01-31 12:25:02 -05:00
committed by Miek Gieben
parent 738067a3c7
commit 439d8b8d12
7 changed files with 207 additions and 37 deletions

View File

@@ -48,6 +48,10 @@ clean:
go clean
rm -f coredns
.PHONY: gen
gen:
go generate ./core/...
.PHONY: distclean
distclean: clean
# Clean all dependencies and build artifacts

View File

@@ -1,4 +1,7 @@
// 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 (

View File

@@ -1,3 +1,4 @@
//go:generate go run ../../gen/directives_generate.go ../../middleware.cfg
package dnsserver
import (
@@ -62,40 +63,3 @@ func RegisterDevDirective(name, before string) {
}
fmt.Printf("[INFO] %s\n", msg)
}
// Add here, and in core/coredns.go to use them.
// 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{
"root",
"bind",
"trace",
"health",
"pprof",
"prometheus",
"errors",
"log",
"chaos",
"cache",
"rewrite",
"loadbalance",
"dnssec",
"file",
"auto",
"secondary",
"etcd",
"kubernetes",
"proxy",
"httpproxy",
"whoami",
"erratic",
}

View File

@@ -0,0 +1,36 @@
// generated by directives_generate.go; DO NOT EDIT
package dnsserver
// 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{
"root",
"bind",
"trace",
"health",
"pprof",
"prometheus",
"errors",
"log",
"chaos",
"cache",
"rewrite",
"loadbalance",
"dnssec",
"file",
"auto",
"secondary",
"etcd",
"kubernetes",
"proxy",
"httpprox",
"whoami",
"erratic",
}

4
core/zmiddleware.go Normal file
View File

@@ -0,0 +1,4 @@
// generated by directives_generate.go; DO NOT EDIT
package core
import ()

116
gen/directives_generate.go Normal file
View File

@@ -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)
}
}

43
middleware.cfg Normal file
View File

@@ -0,0 +1,43 @@
# 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.
# How to rebuild with updated middleware configurations:
# Modify the list below and run `make gen && make`
# The parser takes the input format of
# <order>:<middleware-name>:<package-name>
# OR
# <order>:<middleware-name>:
# External middleware example:
# 80:log:github.com/miekg/coredns/middleware/log
# Local middleware example:
# 80:log:
10:root:
20:bind:
30:trace:
40:health:
50:pprof:
60:prometheus:
70:errors:
80:log:
90:chaos:
100:cache:
110:rewrite:
120:loadbalance:
130:dnssec:
140:file:
150:auto:
160:secondary:
170:etcd:
180:kubernetes:
190:proxy:
200:httpprox:
210:whoami:
220:erratic: