diff options
author | 2017-07-24 23:12:50 +0200 | |
---|---|---|
committer | 2017-07-24 14:12:50 -0700 | |
commit | 1b7492be6e07f4b8306c0b4a56d79f37485ae61c (patch) | |
tree | 02510da5a7cf228821373a8090bac29055764aba /middleware/dnstap/handler.go | |
parent | f33b02689c564c1de8774f7f99d2400231a76069 (diff) | |
download | coredns-1b7492be6e07f4b8306c0b4a56d79f37485ae61c.tar.gz coredns-1b7492be6e07f4b8306c0b4a56d79f37485ae61c.tar.zst coredns-1b7492be6e07f4b8306c0b4a56d79f37485ae61c.zip |
WIP: middleware/dnstap (#711)
middleware/dnstap add
Diffstat (limited to 'middleware/dnstap/handler.go')
-rw-r--r-- | middleware/dnstap/handler.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/middleware/dnstap/handler.go b/middleware/dnstap/handler.go new file mode 100644 index 000000000..20121ff2e --- /dev/null +++ b/middleware/dnstap/handler.go @@ -0,0 +1,51 @@ +package dnstap + +import ( + "fmt" + "golang.org/x/net/context" + "io" + + "github.com/coredns/coredns/middleware" + "github.com/coredns/coredns/middleware/dnstap/msg" + "github.com/coredns/coredns/middleware/dnstap/taprw" + + tap "github.com/dnstap/golang-dnstap" + "github.com/miekg/dns" +) + +type Dnstap struct { + Next middleware.Handler + Out io.Writer + Pack bool +} + +func tapMessageTo(w io.Writer, m *tap.Message) error { + frame, err := msg.Marshal(m) + if err != nil { + return fmt.Errorf("marshal: %s", err) + } + _, err = w.Write(frame) + return err +} + +func (h Dnstap) TapMessage(m *tap.Message) error { + return tapMessageTo(h.Out, m) +} + +func (h Dnstap) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { + rw := taprw.ResponseWriter{ResponseWriter: w, Taper: &h, Query: r, Pack: h.Pack} + rw.QueryEpoch() + + code, err := middleware.NextOrFailure(h.Name(), h.Next, ctx, &rw, r) + if err != nil { + // ignore dnstap errors + return code, err + } + + if err := rw.DnstapError(); err != nil { + return code, middleware.Error("dnstap", err) + } + + return code, nil +} +func (h Dnstap) Name() string { return "dnstap" } |