aboutsummaryrefslogtreecommitdiff
path: root/middleware/hosts/hosts.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/hosts/hosts.go')
-rw-r--r--middleware/hosts/hosts.go136
1 files changed, 0 insertions, 136 deletions
diff --git a/middleware/hosts/hosts.go b/middleware/hosts/hosts.go
deleted file mode 100644
index 28efc47ec..000000000
--- a/middleware/hosts/hosts.go
+++ /dev/null
@@ -1,136 +0,0 @@
-package hosts
-
-import (
- "net"
-
- "golang.org/x/net/context"
-
- "github.com/coredns/coredns/middleware"
- "github.com/coredns/coredns/middleware/pkg/dnsutil"
- "github.com/coredns/coredns/request"
- "github.com/miekg/dns"
-)
-
-// Hosts is the middleware handler
-type Hosts struct {
- Next middleware.Handler
- *Hostsfile
-
- Fallthrough bool
-}
-
-// ServeDNS implements the middleware.Handle interface.
-func (h Hosts) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
- state := request.Request{W: w, Req: r}
- qname := state.Name()
-
- answers := []dns.RR{}
-
- zone := middleware.Zones(h.Origins).Matches(qname)
- if zone == "" {
- // PTR zones don't need to be specified in Origins
- if state.Type() != "PTR" {
- // If this doesn't match we need to fall through regardless of h.Fallthrough
- return middleware.NextOrFailure(h.Name(), h.Next, ctx, w, r)
- }
- }
-
- switch state.QType() {
- case dns.TypePTR:
- names := h.LookupStaticAddr(dnsutil.ExtractAddressFromReverse(qname))
- if len(names) == 0 {
- // If this doesn't match we need to fall through regardless of h.Fallthrough
- return middleware.NextOrFailure(h.Name(), h.Next, ctx, w, r)
- }
- answers = h.ptr(qname, names)
- case dns.TypeA:
- ips := h.LookupStaticHostV4(qname)
- answers = a(qname, ips)
- case dns.TypeAAAA:
- ips := h.LookupStaticHostV6(qname)
- answers = aaaa(qname, ips)
- }
-
- if len(answers) == 0 {
- if h.Fallthrough {
- return middleware.NextOrFailure(h.Name(), h.Next, ctx, w, r)
- }
- if !h.otherRecordsExist(state.QType(), qname) {
- return dns.RcodeNameError, nil
- }
- }
-
- m := new(dns.Msg)
- m.SetReply(r)
- m.Authoritative, m.RecursionAvailable, m.Compress = true, true, true
- m.Answer = answers
-
- state.SizeAndDo(m)
- m, _ = state.Scrub(m)
- w.WriteMsg(m)
- return dns.RcodeSuccess, nil
-}
-
-func (h Hosts) otherRecordsExist(qtype uint16, qname string) bool {
- switch qtype {
- case dns.TypeA:
- if len(h.LookupStaticHostV6(qname)) > 0 {
- return true
- }
- case dns.TypeAAAA:
- if len(h.LookupStaticHostV4(qname)) > 0 {
- return true
- }
- default:
- if len(h.LookupStaticHostV4(qname)) > 0 {
- return true
- }
- if len(h.LookupStaticHostV6(qname)) > 0 {
- return true
- }
- }
- return false
-
-}
-
-// Name implements the middleware.Handle interface.
-func (h Hosts) Name() string { return "hosts" }
-
-// a takes a slice of net.IPs and returns a slice of A RRs.
-func a(zone string, ips []net.IP) []dns.RR {
- answers := []dns.RR{}
- for _, ip := range ips {
- r := new(dns.A)
- r.Hdr = dns.RR_Header{Name: zone, Rrtype: dns.TypeA,
- Class: dns.ClassINET, Ttl: 3600}
- r.A = ip
- answers = append(answers, r)
- }
- return answers
-}
-
-// aaaa takes a slice of net.IPs and returns a slice of AAAA RRs.
-func aaaa(zone string, ips []net.IP) []dns.RR {
- answers := []dns.RR{}
- for _, ip := range ips {
- r := new(dns.AAAA)
- r.Hdr = dns.RR_Header{Name: zone, Rrtype: dns.TypeAAAA,
- Class: dns.ClassINET, Ttl: 3600}
- r.AAAA = ip
- answers = append(answers, r)
- }
- return answers
-}
-
-// ptr takes a slice of host names and filters out the ones that aren't in Origins, if specified, and returns a slice of PTR RRs.
-func (h *Hosts) ptr(zone string, names []string) []dns.RR {
- answers := []dns.RR{}
- for _, n := range names {
- r := new(dns.PTR)
- r.Hdr = dns.RR_Header{Name: zone, Rrtype: dns.TypePTR,
- Class: dns.ClassINET, Ttl: 3600}
- r.Ptr = dns.Fqdn(n)
- answers = append(answers, r)
- }
- return answers
-}