mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 16:24:19 -04:00
plugin/auto/file/secondary: Use new upstream resolver (#1534)
* move file, auto, secondary to new upstream * include context in request
This commit is contained in:
committed by
Miek Gieben
parent
fc1d73ffa9
commit
ba573c0f40
@@ -17,7 +17,7 @@ zonefile. New or changed zones are automatically picked up from disk.
|
|||||||
auto [ZONES...] {
|
auto [ZONES...] {
|
||||||
directory DIR [REGEXP ORIGIN_TEMPLATE [TIMEOUT]]
|
directory DIR [REGEXP ORIGIN_TEMPLATE [TIMEOUT]]
|
||||||
no_reload
|
no_reload
|
||||||
upstream ADDRESS...
|
upstream [ADDRESS...]
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
@@ -35,7 +35,8 @@ are used.
|
|||||||
SOA's serial has changed. This option disables that behavior.
|
SOA's serial has changed. This option disables that behavior.
|
||||||
* `upstream` defines upstream resolvers to be used resolve external names found (think CNAMEs)
|
* `upstream` defines upstream resolvers to be used resolve external names found (think CNAMEs)
|
||||||
pointing to external names. **ADDRESS** can be an IP address, an IP:port or a string pointing to
|
pointing to external names. **ADDRESS** can be an IP address, an IP:port or a string pointing to
|
||||||
a file that is structured as /etc/resolv.conf.
|
a file that is structured as /etc/resolv.conf. If no **ADDRESS** is given, CoreDNS will resolve CNAMEs
|
||||||
|
against itself.
|
||||||
|
|
||||||
All directives from the *file* plugin are supported. Note that *auto* will load all zones found,
|
All directives from the *file* plugin are supported. Note that *auto* will load all zones found,
|
||||||
even though the directive might only receive queries for a specific zone. I.e:
|
even though the directive might only receive queries for a specific zone. I.e:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"github.com/coredns/coredns/plugin"
|
"github.com/coredns/coredns/plugin"
|
||||||
"github.com/coredns/coredns/plugin/file"
|
"github.com/coredns/coredns/plugin/file"
|
||||||
"github.com/coredns/coredns/plugin/metrics"
|
"github.com/coredns/coredns/plugin/metrics"
|
||||||
"github.com/coredns/coredns/plugin/proxy"
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
||||||
"github.com/coredns/coredns/request"
|
"github.com/coredns/coredns/request"
|
||||||
|
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
@@ -33,7 +33,7 @@ type (
|
|||||||
// In the future this should be something like ZoneMeta that contains all this stuff.
|
// In the future this should be something like ZoneMeta that contains all this stuff.
|
||||||
transferTo []string
|
transferTo []string
|
||||||
noReload bool
|
noReload bool
|
||||||
proxy proxy.Proxy // Proxy for looking up names during the resolution process
|
upstream upstream.Upstream // Upstream for looking up names during the resolution process
|
||||||
|
|
||||||
duration time.Duration
|
duration time.Duration
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,7 @@ type (
|
|||||||
|
|
||||||
// ServeDNS implements the plugin.Handle interface.
|
// ServeDNS implements the plugin.Handle interface.
|
||||||
func (a Auto) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
func (a Auto) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
||||||
state := request.Request{W: w, Req: r}
|
state := request.Request{W: w, Req: r, Context: ctx}
|
||||||
qname := state.Name()
|
qname := state.Name()
|
||||||
|
|
||||||
// TODO(miek): match the qname better in the map
|
// TODO(miek): match the qname better in the map
|
||||||
|
|||||||
@@ -11,9 +11,8 @@ import (
|
|||||||
"github.com/coredns/coredns/core/dnsserver"
|
"github.com/coredns/coredns/core/dnsserver"
|
||||||
"github.com/coredns/coredns/plugin"
|
"github.com/coredns/coredns/plugin"
|
||||||
"github.com/coredns/coredns/plugin/metrics"
|
"github.com/coredns/coredns/plugin/metrics"
|
||||||
"github.com/coredns/coredns/plugin/pkg/dnsutil"
|
|
||||||
"github.com/coredns/coredns/plugin/pkg/parse"
|
"github.com/coredns/coredns/plugin/pkg/parse"
|
||||||
"github.com/coredns/coredns/plugin/proxy"
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
||||||
|
|
||||||
"github.com/mholt/caddy"
|
"github.com/mholt/caddy"
|
||||||
)
|
)
|
||||||
@@ -151,11 +150,11 @@ func autoParse(c *caddy.Controller) (Auto, error) {
|
|||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return a, c.ArgErr()
|
return a, c.ArgErr()
|
||||||
}
|
}
|
||||||
ups, err := dnsutil.ParseHostPortOrFile(args...)
|
var err error
|
||||||
|
a.loader.upstream, err = upstream.NewUpstream(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return a, err
|
return a, err
|
||||||
}
|
}
|
||||||
a.loader.proxy = proxy.NewLookup(ups)
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
t, _, e := parse.Transfer(c, false)
|
t, _, e := parse.Transfer(c, false)
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ func (a Auto) Walk() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
zo.NoReload = a.loader.noReload
|
zo.NoReload = a.loader.noReload
|
||||||
zo.Proxy = a.loader.proxy
|
zo.Upstream = a.loader.upstream
|
||||||
zo.TransferTo = a.loader.transferTo
|
zo.TransferTo = a.loader.transferTo
|
||||||
|
|
||||||
a.Zones.Add(zo, origin)
|
a.Zones.Add(zo, origin)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ If you want to round robin A and AAAA responses look at the *loadbalance* plugin
|
|||||||
file DBFILE [ZONES... ] {
|
file DBFILE [ZONES... ] {
|
||||||
transfer to ADDRESS...
|
transfer to ADDRESS...
|
||||||
no_reload
|
no_reload
|
||||||
upstream ADDRESS...
|
upstream [ADDRESS...]
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
@@ -42,6 +42,7 @@ file DBFILE [ZONES... ] {
|
|||||||
pointing to external names. This is only really useful when CoreDNS is configured as a proxy, for
|
pointing to external names. This is only really useful when CoreDNS is configured as a proxy, for
|
||||||
normal authoritative serving you don't need *or* want to use this. **ADDRESS** can be an IP
|
normal authoritative serving you don't need *or* want to use this. **ADDRESS** can be an IP
|
||||||
address, and IP:port or a string pointing to a file that is structured as /etc/resolv.conf.
|
address, and IP:port or a string pointing to a file that is structured as /etc/resolv.conf.
|
||||||
|
If no **ADDRESS** is given, CoreDNS will resolve CNAMEs against itself.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
||||||
"github.com/coredns/coredns/plugin/proxy"
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
||||||
"github.com/coredns/coredns/plugin/test"
|
"github.com/coredns/coredns/plugin/test"
|
||||||
|
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
@@ -74,7 +74,7 @@ func TestLookupCNAMEExternal(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Expected no error when reading zone, got %q", err)
|
t.Fatalf("Expected no error when reading zone, got %q", err)
|
||||||
}
|
}
|
||||||
zone.Proxy = proxy.NewLookup([]string{"8.8.8.8:53"}) // TODO(miek): point to local instance
|
zone.Upstream, _ = upstream.NewUpstream([]string{"8.8.8.8:53"}) // TODO(miek): point to local instance
|
||||||
|
|
||||||
fm := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}}
|
fm := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}}
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ type (
|
|||||||
|
|
||||||
// ServeDNS implements the plugin.Handle interface.
|
// ServeDNS implements the plugin.Handle interface.
|
||||||
func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
func (f File) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
||||||
state := request.Request{W: w, Req: r}
|
state := request.Request{W: w, Req: r, Context: ctx}
|
||||||
|
|
||||||
qname := state.Name()
|
qname := state.Name()
|
||||||
// TODO(miek): match the qname better in the map
|
// TODO(miek): match the qname better in the map
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ func cnameForType(targets []dns.RR, origQtype uint16) []dns.RR {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (z *Zone) externalLookup(state request.Request, target string, qtype uint16) []dns.RR {
|
func (z *Zone) externalLookup(state request.Request, target string, qtype uint16) []dns.RR {
|
||||||
m, e := z.Proxy.Lookup(state, target, qtype)
|
m, e := z.Upstream.Lookup(state, target, qtype)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
// TODO(miek): debugMsg for this as well? Log?
|
// TODO(miek): debugMsg for this as well? Log?
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -6,9 +6,8 @@ import (
|
|||||||
|
|
||||||
"github.com/coredns/coredns/core/dnsserver"
|
"github.com/coredns/coredns/core/dnsserver"
|
||||||
"github.com/coredns/coredns/plugin"
|
"github.com/coredns/coredns/plugin"
|
||||||
"github.com/coredns/coredns/plugin/pkg/dnsutil"
|
|
||||||
"github.com/coredns/coredns/plugin/pkg/parse"
|
"github.com/coredns/coredns/plugin/pkg/parse"
|
||||||
"github.com/coredns/coredns/plugin/proxy"
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
||||||
|
|
||||||
"github.com/mholt/caddy"
|
"github.com/mholt/caddy"
|
||||||
)
|
)
|
||||||
@@ -90,7 +89,7 @@ func fileParse(c *caddy.Controller) (Zones, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
noReload := false
|
noReload := false
|
||||||
prxy := proxy.Proxy{}
|
upstr := upstream.Upstream{}
|
||||||
t := []string{}
|
t := []string{}
|
||||||
var e error
|
var e error
|
||||||
|
|
||||||
@@ -107,14 +106,11 @@ func fileParse(c *caddy.Controller) (Zones, error) {
|
|||||||
|
|
||||||
case "upstream":
|
case "upstream":
|
||||||
args := c.RemainingArgs()
|
args := c.RemainingArgs()
|
||||||
if len(args) == 0 {
|
upstr, err = upstream.NewUpstream(args)
|
||||||
return Zones{}, c.ArgErr()
|
|
||||||
}
|
|
||||||
ups, err := dnsutil.ParseHostPortOrFile(args...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Zones{}, err
|
return Zones{}, err
|
||||||
}
|
}
|
||||||
prxy = proxy.NewLookup(ups)
|
|
||||||
default:
|
default:
|
||||||
return Zones{}, c.Errf("unknown property '%s'", c.Val())
|
return Zones{}, c.Errf("unknown property '%s'", c.Val())
|
||||||
}
|
}
|
||||||
@@ -124,7 +120,7 @@ func fileParse(c *caddy.Controller) (Zones, error) {
|
|||||||
z[origin].TransferTo = append(z[origin].TransferTo, t...)
|
z[origin].TransferTo = append(z[origin].TransferTo, t...)
|
||||||
}
|
}
|
||||||
z[origin].NoReload = noReload
|
z[origin].NoReload = noReload
|
||||||
z[origin].Proxy = prxy
|
z[origin].Upstream = upstr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/coredns/coredns/plugin/file/tree"
|
"github.com/coredns/coredns/plugin/file/tree"
|
||||||
"github.com/coredns/coredns/plugin/proxy"
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
||||||
"github.com/coredns/coredns/request"
|
"github.com/coredns/coredns/request"
|
||||||
|
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
@@ -30,7 +30,7 @@ type Zone struct {
|
|||||||
NoReload bool
|
NoReload bool
|
||||||
reloadMu sync.RWMutex
|
reloadMu sync.RWMutex
|
||||||
ReloadShutdown chan bool
|
ReloadShutdown chan bool
|
||||||
Proxy proxy.Proxy // Proxy for looking up names during the resolution process
|
Upstream upstream.Upstream // Upstream for looking up names during the resolution process
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apex contains the apex records of a zone: SOA, NS and their potential signatures.
|
// Apex contains the apex records of a zone: SOA, NS and their potential signatures.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ A working syntax would be:
|
|||||||
secondary [zones...] {
|
secondary [zones...] {
|
||||||
transfer from ADDRESS
|
transfer from ADDRESS
|
||||||
transfer to ADDRESS
|
transfer to ADDRESS
|
||||||
upstream ADDRESS...
|
upstream [ADDRESS...]
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
@@ -34,6 +34,7 @@ secondary [zones...] {
|
|||||||
pointing to external names. This is only really useful when CoreDNS is configured as a proxy, for
|
pointing to external names. This is only really useful when CoreDNS is configured as a proxy, for
|
||||||
normal authoritative serving you don't need *or* want to use this. **ADDRESS** can be an IP
|
normal authoritative serving you don't need *or* want to use this. **ADDRESS** can be an IP
|
||||||
address, and IP:port or a string pointing to a file that is structured as /etc/resolv.conf.
|
address, and IP:port or a string pointing to a file that is structured as /etc/resolv.conf.
|
||||||
|
If no **ADDRESS** is given, CoreDNS will resolve CNAMEs against itself.
|
||||||
|
|
||||||
When a zone is due to be refreshed (Refresh timer fires) a random jitter of 5 seconds is
|
When a zone is due to be refreshed (Refresh timer fires) a random jitter of 5 seconds is
|
||||||
applied, before fetching. In the case of retry this will be 2 seconds. If there are any errors
|
applied, before fetching. In the case of retry this will be 2 seconds. If there are any errors
|
||||||
|
|||||||
@@ -4,10 +4,9 @@ import (
|
|||||||
"github.com/coredns/coredns/core/dnsserver"
|
"github.com/coredns/coredns/core/dnsserver"
|
||||||
"github.com/coredns/coredns/plugin"
|
"github.com/coredns/coredns/plugin"
|
||||||
"github.com/coredns/coredns/plugin/file"
|
"github.com/coredns/coredns/plugin/file"
|
||||||
"github.com/coredns/coredns/plugin/pkg/dnsutil"
|
|
||||||
"github.com/coredns/coredns/plugin/pkg/parse"
|
"github.com/coredns/coredns/plugin/pkg/parse"
|
||||||
"github.com/coredns/coredns/plugin/proxy"
|
|
||||||
|
|
||||||
|
"github.com/coredns/coredns/plugin/pkg/upstream"
|
||||||
"github.com/mholt/caddy"
|
"github.com/mholt/caddy"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -51,7 +50,7 @@ func secondaryParse(c *caddy.Controller) (file.Zones, error) {
|
|||||||
z := make(map[string]*file.Zone)
|
z := make(map[string]*file.Zone)
|
||||||
names := []string{}
|
names := []string{}
|
||||||
origins := []string{}
|
origins := []string{}
|
||||||
prxy := proxy.Proxy{}
|
upstr := upstream.Upstream{}
|
||||||
for c.Next() {
|
for c.Next() {
|
||||||
|
|
||||||
if c.Val() == "secondary" {
|
if c.Val() == "secondary" {
|
||||||
@@ -81,14 +80,11 @@ func secondaryParse(c *caddy.Controller) (file.Zones, error) {
|
|||||||
}
|
}
|
||||||
case "upstream":
|
case "upstream":
|
||||||
args := c.RemainingArgs()
|
args := c.RemainingArgs()
|
||||||
if len(args) == 0 {
|
var err error
|
||||||
return file.Zones{}, c.ArgErr()
|
upstr, err = upstream.NewUpstream(args)
|
||||||
}
|
|
||||||
ups, err := dnsutil.ParseHostPortOrFile(args...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return file.Zones{}, err
|
return file.Zones{}, err
|
||||||
}
|
}
|
||||||
prxy = proxy.NewLookup(ups)
|
|
||||||
default:
|
default:
|
||||||
return file.Zones{}, c.Errf("unknown property '%s'", c.Val())
|
return file.Zones{}, c.Errf("unknown property '%s'", c.Val())
|
||||||
}
|
}
|
||||||
@@ -100,7 +96,7 @@ func secondaryParse(c *caddy.Controller) (file.Zones, error) {
|
|||||||
if f != nil {
|
if f != nil {
|
||||||
z[origin].TransferFrom = append(z[origin].TransferFrom, f...)
|
z[origin].TransferFrom = append(z[origin].TransferFrom, f...)
|
||||||
}
|
}
|
||||||
z[origin].Proxy = prxy
|
z[origin].Upstream = upstr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user