diff options
Diffstat (limited to 'middleware/secondary/setup.go')
-rw-r--r-- | middleware/secondary/setup.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/middleware/secondary/setup.go b/middleware/secondary/setup.go new file mode 100644 index 000000000..5550cf11d --- /dev/null +++ b/middleware/secondary/setup.go @@ -0,0 +1,82 @@ +package secondary + +import ( + "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" + "github.com/miekg/coredns/middleware/file" + + "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 err + } + + // Add startup functions to retrieve the zone and keep it up to date. + for _, n := range zones.Names { + if len(zones.Z[n].TransferFrom) > 0 { + c.OnStartup(func() error { + zones.Z[n].StartupOnce.Do(func() { + zones.Z[n].TransferIn() + go func() { + zones.Z[n].Update() + }() + }) + return nil + }) + } + } + + dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.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{} + 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] = middleware.Host(origins[i]).Normalize() + z[origins[i]] = file.NewZone(origins[i], "stdin") + names = append(names, origins[i]) + } + + for c.NextBlock() { + t, f, e := file.TransferParse(c) + if e != nil { + return file.Zones{}, e + } + 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...) + } + } + } + } + } + return file.Zones{Z: z, Names: names}, nil +} |