aboutsummaryrefslogtreecommitdiff
path: root/middleware/autopath/setup.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/autopath/setup.go')
-rw-r--r--middleware/autopath/setup.go87
1 files changed, 87 insertions, 0 deletions
diff --git a/middleware/autopath/setup.go b/middleware/autopath/setup.go
new file mode 100644
index 000000000..8abd67acb
--- /dev/null
+++ b/middleware/autopath/setup.go
@@ -0,0 +1,87 @@
+package autopath
+
+import (
+ "fmt"
+
+ "github.com/coredns/coredns/core/dnsserver"
+ "github.com/coredns/coredns/middleware"
+
+ "github.com/mholt/caddy"
+ "github.com/miekg/dns"
+)
+
+func init() {
+ caddy.RegisterPlugin("autopath", caddy.Plugin{
+ ServerType: "dns",
+ Action: setup,
+ })
+
+}
+
+func setup(c *caddy.Controller) error {
+ ap, mw, err := autoPathParse(c)
+ if err != nil {
+ return middleware.Error("autopath", err)
+ }
+
+ c.OnStartup(func() error {
+ // So we know for sure the mw is initialized.
+ m := dnsserver.GetMiddleware(c, mw)
+ switch mw {
+ case "kubernetes":
+ m = m
+ //if k, ok := m.(kubernetes.Kubernetes); ok {
+ //&ap.searchFunc = k.AutoPath
+ //}
+ }
+ return nil
+ })
+
+ dnsserver.GetConfig(c).AddMiddleware(func(next middleware.Handler) middleware.Handler {
+ ap.Next = next
+ return ap
+ })
+
+ return nil
+}
+
+var allowedMiddleware = map[string]bool{
+ "@kubernetes": true,
+}
+
+func autoPathParse(c *caddy.Controller) (*AutoPath, string, error) {
+ ap := new(AutoPath)
+ mw := ""
+
+ for c.Next() {
+ zoneAndresolv := c.RemainingArgs()
+ if len(zoneAndresolv) < 1 {
+ return nil, "", fmt.Errorf("no resolv-conf specified")
+ }
+ resolv := zoneAndresolv[len(zoneAndresolv)-1]
+ if resolv[0] == '@' {
+ _, ok := allowedMiddleware[resolv]
+ if ok {
+ mw = resolv[1:]
+ }
+ } else {
+ // assume file on disk
+ rc, err := dns.ClientConfigFromFile(resolv)
+ if err != nil {
+ return nil, "", fmt.Errorf("failed to parse %q: %v", resolv, err)
+ }
+ ap.search = rc.Search
+ middleware.Zones(ap.search).Normalize()
+ ap.search = append(ap.search, "") // sentinal value as demanded.
+ }
+ ap.Zones = zoneAndresolv[:len(zoneAndresolv)-1]
+ if len(ap.Zones) == 0 {
+ ap.Zones = make([]string, len(c.ServerBlockKeys))
+ copy(ap.Zones, c.ServerBlockKeys)
+ }
+ for i, str := range ap.Zones {
+ ap.Zones[i] = middleware.Host(str).Normalize()
+ }
+ }
+ return ap, mw, nil
+}