46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
// Package meship implements a plugin that returns details about the resolving
|
|
// querying it.
|
|
package meship
|
|
|
|
import (
|
|
"context"
|
|
|
|
_meshname "github.com/zhoreeq/meshname/pkg/meshname"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
const name = "meship"
|
|
|
|
// Meship is a plugin that resolves .meship domains
|
|
type Meship struct{}
|
|
|
|
// ServeDNS implements the plugin.Handler interface.
|
|
func (mn Meship) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
|
a := new(dns.Msg)
|
|
a.SetReply(r)
|
|
a.Authoritative = true
|
|
|
|
for _, q := range r.Question {
|
|
labels := dns.SplitDomainName(q.Name)
|
|
if len(labels) != 2 || q.Qtype != dns.TypeAAAA || q.Qclass != dns.ClassINET {
|
|
//s.log.Debugln("Error: invalid resource requested")
|
|
continue
|
|
}
|
|
|
|
if resolvedAddr, err := _meshname.IPFromDomain(&labels[0]); err == nil {
|
|
answer := new(dns.AAAA)
|
|
answer.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 3600}
|
|
answer.AAAA = resolvedAddr
|
|
|
|
a.Answer = append(a.Answer, answer)
|
|
}
|
|
}
|
|
|
|
w.WriteMsg(a)
|
|
return 0, nil
|
|
}
|
|
|
|
// Name implements the Handler interface.
|
|
func (mn Meship) Name() string { return name }
|