coredns-override/ResponseWrapper.go

51 lines
879 B
Go
Raw Normal View History

2022-03-31 20:00:17 +00:00
package override
2022-03-31 19:46:56 +00:00
import (
"net"
"github.com/miekg/dns"
)
type Rule struct {
Search net.IP
Override net.IP
}
type ResponseWrapper struct {
dns.ResponseWriter
Rules []Rule
}
func (r *ResponseWrapper) WriteMsg(res *dns.Msg) error {
for _, r := range r.Rules {
for _, rr := range res.Answer {
2022-04-02 23:33:22 +00:00
overideRR(r, rr)
}
for _, rr := range res.Extra {
overideRR(r, rr)
2022-03-31 19:46:56 +00:00
}
}
return r.ResponseWriter.WriteMsg(res)
}
2022-04-02 23:33:22 +00:00
func overideRR(r Rule, rr dns.RR) {
if rr.Header().Rrtype == dns.TypeA {
a := rr.(*dns.A)
if a.A.Equal(r.Search) {
a.A = r.Override
}
} else if rr.Header().Rrtype == dns.TypeAAAA {
a := rr.(*dns.AAAA)
if a.AAAA.Equal(r.Search) {
a.AAAA = r.Override
}
}
}
2022-03-31 19:46:56 +00:00
func (r *ResponseWrapper) Write(buf []byte) (int, error) {
log.Warning("ResponseWrapper called with Write: not ensuring overide")
return r.ResponseWriter.Write(buf)
}