Add etcd middleware

This middleware acts in the same way as SkyDNS. We might add options
to allow it to be behave different, but for now it will suffice.

A Corefile like:
.:1053 {
    etcd miek.nl
    proxy . 8.8.8.8:53
}
will perform lookup in etcd and proxy everything not miek.nl to Google
for further resolution.

The internal etcd forwarding *also* uses the proxy infrastructure,
meaning you get health check and such for (almost) free
This commit is contained in:
Miek Gieben
2016-03-20 17:44:58 +00:00
parent 15518b5b6f
commit 8f9f2cd1ab
19 changed files with 1575 additions and 8 deletions

View File

@@ -17,6 +17,7 @@ type ResponseRecorder struct {
dns.ResponseWriter
rcode int
size int
msg *dns.Msg
start time.Time
}
@@ -27,6 +28,7 @@ func NewResponseRecorder(w dns.ResponseWriter) *ResponseRecorder {
return &ResponseRecorder{
ResponseWriter: w,
rcode: 0,
msg: nil,
start: time.Now(),
}
}
@@ -36,6 +38,7 @@ func NewResponseRecorder(w dns.ResponseWriter) *ResponseRecorder {
func (r *ResponseRecorder) WriteMsg(res *dns.Msg) error {
r.rcode = res.Rcode
r.size = res.Len()
r.msg = res
return r.ResponseWriter.WriteMsg(res)
}
@@ -63,6 +66,11 @@ func (r *ResponseRecorder) Start() time.Time {
return r.start
}
// Reply returns the written message from the ResponseRecorder.
func (r *ResponseRecorder) Reply() *dns.Msg {
return r.msg
}
// Hijack implements dns.Hijacker. It simply wraps the underlying
// ResponseWriter's Hijack method if there is one, or returns an error.
func (r *ResponseRecorder) Hijack() {