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 }