diff options
Diffstat (limited to 'middleware/whoami/whoami.go')
-rw-r--r-- | middleware/whoami/whoami.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/middleware/whoami/whoami.go b/middleware/whoami/whoami.go new file mode 100644 index 000000000..4117db35e --- /dev/null +++ b/middleware/whoami/whoami.go @@ -0,0 +1,50 @@ +package whoami + +import ( + "net" + "strconv" + + "github.com/miekg/coredns/middleware" + "github.com/miekg/coredns/request" + + "github.com/miekg/dns" + "golang.org/x/net/context" +) + +type Whoami struct { + Next middleware.Handler +} + +func (wh Whoami) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { + state := request.Request{W: w, Req: r} + + a := new(dns.Msg) + a.SetReply(r) + a.Compress = true + a.Authoritative = true + + ip := state.IP() + var rr dns.RR + + switch state.Family() { + case 1: + rr = new(dns.A) + rr.(*dns.A).Hdr = dns.RR_Header{Name: state.QName(), Rrtype: state.QType(), Class: state.QClass()} + rr.(*dns.A).A = net.ParseIP(ip).To4() + case 2: + rr = new(dns.AAAA) + rr.(*dns.AAAA).Hdr = dns.RR_Header{Name: state.QName(), Rrtype: state.QType(), Class: state.QClass()} + rr.(*dns.AAAA).AAAA = net.ParseIP(ip) + } + + srv := new(dns.SRV) + srv.Hdr = dns.RR_Header{Name: "_" + state.Proto() + "." + state.QName(), Rrtype: dns.TypeSRV, Class: state.QClass()} + port, _ := strconv.Atoi(state.Port()) + srv.Port = uint16(port) + + a.Extra = append(a.Extra, rr) + a.Extra = append(a.Extra, srv) + + w.WriteMsg(a) + return 0, nil +} |