* middleware/file: correctly parse the stanza Parsing the file stanza would give precedence to 'transfer' and ignore other bits if it wasn't specified. This change fixes the parsing. The actually external CNAME retrieval is working fine (once the upstream is correctly parsed). This wasn't caught in tests, because we lack a parsing test for this. Fixes #657 * Add tests
91 lines
2 KiB
Go
91 lines
2 KiB
Go
package secondary
|
|
|
|
import (
|
|
"github.com/coredns/coredns/core/dnsserver"
|
|
"github.com/coredns/coredns/middleware"
|
|
"github.com/coredns/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 middleware.Error("secondary", 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 middleware.Handler) middleware.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 := []string{}, []string{}
|
|
var e error
|
|
|
|
switch c.Val() {
|
|
case "transfer":
|
|
t, _, e = file.TransferParse(c, true)
|
|
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
|
|
}
|