diff options
Diffstat (limited to 'plugin/secondary/setup.go')
-rw-r--r-- | plugin/secondary/setup.go | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/plugin/secondary/setup.go b/plugin/secondary/setup.go new file mode 100644 index 000000000..e2819197d --- /dev/null +++ b/plugin/secondary/setup.go @@ -0,0 +1,108 @@ +package secondary + +import ( + "github.com/coredns/coredns/core/dnsserver" + "github.com/coredns/coredns/plugin" + "github.com/coredns/coredns/plugin/file" + "github.com/coredns/coredns/plugin/pkg/dnsutil" + "github.com/coredns/coredns/plugin/proxy" + + "github.com/mholt/caddy" +) + +func init() { + caddy.RegisterPlugin("secondary", caddy.Plugin{ + ServerType: "dns", + Action: setup, + }) +} + +func setup(c *caddy.Controller) error { + zones, err := secondaryParse(c) + if err != nil { + return plugin.Error("secondary", err) + } + + // Add startup functions to retrieve the zone and keep it up to date. + for _, n := range zones.Names { + z := zones.Z[n] + if len(z.TransferFrom) > 0 { + c.OnStartup(func() error { + z.StartupOnce.Do(func() { + z.TransferIn() + go func() { + z.Update() + }() + }) + return nil + }) + } + } + + dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { + return Secondary{file.File{Next: next, Zones: zones}} + }) + + return nil +} + +func secondaryParse(c *caddy.Controller) (file.Zones, error) { + z := make(map[string]*file.Zone) + names := []string{} + origins := []string{} + prxy := proxy.Proxy{} + for c.Next() { + + if c.Val() == "secondary" { + // secondary [origin] + origins = make([]string, len(c.ServerBlockKeys)) + copy(origins, c.ServerBlockKeys) + args := c.RemainingArgs() + if len(args) > 0 { + origins = args + } + for i := range origins { + origins[i] = plugin.Host(origins[i]).Normalize() + z[origins[i]] = file.NewZone(origins[i], "stdin") + names = append(names, origins[i]) + } + + for c.NextBlock() { + + t, f := []string{}, []string{} + var e error + + switch c.Val() { + case "transfer": + t, f, e = file.TransferParse(c, true) + if e != nil { + return file.Zones{}, e + } + case "upstream": + args := c.RemainingArgs() + if len(args) == 0 { + return file.Zones{}, c.ArgErr() + } + ups, err := dnsutil.ParseHostPortOrFile(args...) + if err != nil { + return file.Zones{}, err + } + prxy = proxy.NewLookup(ups) + default: + return file.Zones{}, c.Errf("unknown property '%s'", c.Val()) + } + + for _, origin := range origins { + if t != nil { + z[origin].TransferTo = append(z[origin].TransferTo, t...) + } + if f != nil { + z[origin].TransferFrom = append(z[origin].TransferFrom, f...) + } + z[origin].Proxy = prxy + } + } + } + } + return file.Zones{Z: z, Names: names}, nil +} |