aboutsummaryrefslogtreecommitdiff
path: root/core/setup/secondary.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/setup/secondary.go')
-rw-r--r--core/setup/secondary.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/core/setup/secondary.go b/core/setup/secondary.go
new file mode 100644
index 000000000..3282f92b1
--- /dev/null
+++ b/core/setup/secondary.go
@@ -0,0 +1,59 @@
+package setup
+
+import (
+ "github.com/miekg/coredns/middleware"
+ "github.com/miekg/coredns/middleware/file"
+ "github.com/miekg/coredns/middleware/secondary"
+)
+
+// Secondary sets up the secondary middleware.
+func Secondary(c *Controller) (middleware.Middleware, error) {
+ zones, err := secondaryParse(c)
+ if err != nil {
+ return nil, err
+ }
+
+ // Setup retrieve the zone.
+ for _, n := range zones.Names {
+ if len(zones.Z[n].TransferFrom) > 0 {
+ c.Startup = append(c.Startup, func() error {
+ err := zones.Z[n].TransferIn()
+ return err
+ })
+ }
+ }
+
+ return func(next middleware.Handler) middleware.Handler {
+ return secondary.Secondary{file.File{Next: next, Zones: zones}}
+ }, nil
+
+}
+
+func secondaryParse(c *Controller) (file.Zones, error) {
+ z := make(map[string]*file.Zone)
+ names := []string{}
+ for c.Next() {
+ if c.Val() == "secondary" {
+ // secondary [origin]
+ origin := c.ServerBlockHosts[c.ServerBlockHostIndex]
+ if c.NextArg() {
+ origin = c.Val()
+ }
+ // TODO(miek): we should allow more. Issue #54.
+ origin = middleware.Host(origin).Normalize()
+
+ z[origin] = file.NewZone(origin)
+ names = append(names, origin)
+
+ for c.NextBlock() {
+ t, f, e := parseTransfer(c)
+ if e != nil {
+ return file.Zones{}, e
+ }
+ z[origin].TransferTo = append(z[origin].TransferTo, t)
+ z[origin].TransferFrom = append(z[origin].TransferFrom, f)
+ }
+ }
+ }
+ return file.Zones{Z: z, Names: names}, nil
+}