middleware/reverse: random updates (#516)
* middleware/reverse: random updates Make the documentation somewhat shorter (and hopefully clearer in the process). Also to be on-par with the *auto* middleware, start counting the referenced zones from 1 (instead of 0). Some variable cleanups and use the NextOrFailure in the ServeDNS function. * More TODOs
This commit is contained in:
parent
87a39a6353
commit
3e196a6d57
5 changed files with 123 additions and 154 deletions
|
@ -3,31 +3,33 @@ package reverse
|
|||
import (
|
||||
"net"
|
||||
|
||||
"github.com/miekg/coredns/request"
|
||||
"github.com/miekg/coredns/middleware"
|
||||
"github.com/miekg/coredns/middleware/pkg/dnsutil"
|
||||
"github.com/miekg/coredns/request"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
// Reverse provides dynamic reverse dns and the related forward rr
|
||||
// Reverse provides dynamic reverse DNS and the related forward RR.
|
||||
type Reverse struct {
|
||||
Next middleware.Handler
|
||||
Networks networks
|
||||
}
|
||||
|
||||
// ServeDNS implements the middleware.Handler interface.
|
||||
func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
||||
var rr dns.RR
|
||||
nextHandler := true
|
||||
func (re Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
||||
var (
|
||||
rr dns.RR
|
||||
fallThrough bool
|
||||
)
|
||||
|
||||
state := request.Request{W: w, Req: r}
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.Authoritative, m.RecursionAvailable, m.Compress = true, true, true
|
||||
|
||||
switch state.QType(){
|
||||
switch state.QType() {
|
||||
case dns.TypePTR:
|
||||
address := dnsutil.ExtractAddressFromReverse(state.Name())
|
||||
|
||||
|
@ -38,11 +40,11 @@ func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dn
|
|||
|
||||
ip := net.ParseIP(address)
|
||||
// loop through the configured networks
|
||||
for _, n := range reverse.Networks {
|
||||
if (n.IPnet.Contains(ip)) {
|
||||
nextHandler = n.Fallthrough
|
||||
for _, n := range re.Networks {
|
||||
if n.IPnet.Contains(ip) {
|
||||
fallThrough = n.Fallthrough
|
||||
rr = &dns.PTR{
|
||||
Hdr: dns.RR_Header{Name: state.QName(), Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: n.TTL},
|
||||
Hdr: dns.RR_Header{Name: state.QName(), Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: n.TTL},
|
||||
Ptr: n.ipToHostname(ip),
|
||||
}
|
||||
break
|
||||
|
@ -50,9 +52,9 @@ func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dn
|
|||
}
|
||||
|
||||
case dns.TypeA:
|
||||
for _, n := range reverse.Networks {
|
||||
for _, n := range re.Networks {
|
||||
if dns.IsSubDomain(n.Zone, state.Name()) {
|
||||
nextHandler = n.Fallthrough
|
||||
fallThrough = n.Fallthrough
|
||||
|
||||
// skip if requesting an v4 address and network is not v4
|
||||
if n.IPnet.IP.To4() == nil {
|
||||
|
@ -62,8 +64,8 @@ func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dn
|
|||
result := n.hostnameToIP(state.Name())
|
||||
if result != nil {
|
||||
rr = &dns.A{
|
||||
Hdr: dns.RR_Header{Name: state.QName(), Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: n.TTL},
|
||||
A: result,
|
||||
Hdr: dns.RR_Header{Name: state.QName(), Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: n.TTL},
|
||||
A: result,
|
||||
}
|
||||
break
|
||||
}
|
||||
|
@ -71,9 +73,9 @@ func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dn
|
|||
}
|
||||
|
||||
case dns.TypeAAAA:
|
||||
for _, n := range reverse.Networks {
|
||||
for _, n := range re.Networks {
|
||||
if dns.IsSubDomain(n.Zone, state.Name()) {
|
||||
nextHandler = n.Fallthrough
|
||||
fallThrough = n.Fallthrough
|
||||
|
||||
// Do not use To16 which tries to make v4 in v6
|
||||
if n.IPnet.IP.To4() != nil {
|
||||
|
@ -93,13 +95,8 @@ func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dn
|
|||
|
||||
}
|
||||
|
||||
if rr == nil {
|
||||
if reverse.Next == nil || !nextHandler {
|
||||
// could not resolv
|
||||
w.WriteMsg(m)
|
||||
return dns.RcodeNameError, nil
|
||||
}
|
||||
return reverse.Next.ServeDNS(ctx, w, r)
|
||||
if rr == nil && !fallThrough {
|
||||
return middleware.NextOrFailure(re.Name(), re.Next, ctx, w, r)
|
||||
}
|
||||
|
||||
m.Answer = append(m.Answer, rr)
|
||||
|
@ -109,6 +106,4 @@ func (reverse Reverse) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dn
|
|||
}
|
||||
|
||||
// Name implements the Handler interface.
|
||||
func (reverse Reverse) Name() string {
|
||||
return "reverse"
|
||||
}
|
||||
func (re Reverse) Name() string { return "reverse" }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue