plugin/dnstap: various cleanups (#4179)

* plugin/dnstap: various cleanups

A recent issue made me look into this plugin, I suspect various other
cleanups (hopefully deletion of code) can be made as well

Remove identical functions ToClientQuery etc, and just use tap.Message
as the base type in plugin. Keep msg/ for a few helper functions that
may proof useful.

This remove the whole test directory as we will just check the things we
are interested in which gives much better feedback and keeps that code
closer together.

tapwr dir is also not needed, writer_test.go was just duplicating the
tests already done. This moves writer.go to the top directory.

Make the only user of dnstap, the forward plugin, use the newer code
also remove the test, a better test there would be a full e2e test to
see the correct thing happens.

Cleanup the Tapper interface and move it to dnstapio where it belongs,
remove higher level interfaces that are not used. This remove
dnstap.Tapper and dnstap.IORoutines.

Use the standard mechanism for getting access to a plugin and remove
shuffling the plugin into the context.

Signed-off-by: Miek Gieben <miek@miek.nl>

* use opts to get the correct proto

Signed-off-by: Miek Gieben <miek@miek.nl>

* Various fixes

Signed-off-by: Miek Gieben <miek@miek.nl>

* Remove bad addr test, as dnstap is only called from within coredns where these fields have been preparsed

Signed-off-by: Miek Gieben <miek@miek.nl>

* dnstap: remove saving the error

all these fields have been preparsed, no need for dnstap to be pedantic
and check (and save!) this error again.

Simplifies it a bit more.

Signed-off-by: Miek Gieben <miek@miek.nl>

* Update plugin/forward/dnstap.go

Co-authored-by: Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com>

* Code review

Signed-off-by: Miek Gieben <miek@miek.nl>

* add back in preferUDP

Signed-off-by: Miek Gieben <miek@miek.nl>

* nit

Signed-off-by: Miek Gieben <miek@miek.nl>

Co-authored-by: Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com>
This commit is contained in:
Miek Gieben 2020-10-12 19:10:35 +02:00 committed by GitHub
parent 02f2474824
commit b3b8a7e4b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 297 additions and 783 deletions

View file

@ -5,7 +5,7 @@ import (
"time"
"github.com/coredns/coredns/plugin"
"github.com/coredns/coredns/plugin/dnstap/taprw"
"github.com/coredns/coredns/plugin/dnstap/dnstapio"
tap "github.com/dnstap/golang-dnstap"
"github.com/miekg/dns"
@ -14,75 +14,29 @@ import (
// Dnstap is the dnstap handler.
type Dnstap struct {
Next plugin.Handler
IO IORoutine
io dnstapio.Tapper
// Set to true to include the relevant raw DNS message into the dnstap messages.
JoinRawMessage bool
// IncludeRawMessage will include the raw DNS message into the dnstap messages if true.
IncludeRawMessage bool
}
type (
// IORoutine is the dnstap I/O thread as defined by: <http://dnstap.info/Architecture>.
IORoutine interface {
Dnstap(tap.Dnstap)
}
// Tapper is implemented by the Context passed by the dnstap handler.
Tapper interface {
TapMessage(message *tap.Message)
Pack() bool
}
)
// ContextKey defines the type of key that is used to save data into the context.
type ContextKey string
const (
// DnstapSendOption specifies the Dnstap message to be send. Default is sent all.
DnstapSendOption ContextKey = "dnstap-send-option"
)
// TapMessage implements Tapper.
// TapMessage sends the message m to the dnstap interface.
func (h Dnstap) TapMessage(m *tap.Message) {
t := tap.Dnstap_MESSAGE
h.IO.Dnstap(tap.Dnstap{
Type: &t,
Message: m,
})
}
// Pack returns true if the raw DNS message should be included into the dnstap messages.
func (h Dnstap) Pack() bool {
return h.JoinRawMessage
h.io.Dnstap(tap.Dnstap{Type: &t, Message: m})
}
// ServeDNS logs the client query and response to dnstap and passes the dnstap Context.
func (h Dnstap) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
// Add send option into context so other plugin can decide on which DNSTap
// message to be sent out
sendOption := taprw.SendOption{Cq: true, Cr: true}
newCtx := context.WithValue(ctx, DnstapSendOption, &sendOption)
newCtx = ContextWithTapper(newCtx, h)
rw := &taprw.ResponseWriter{
rw := &ResponseWriter{
ResponseWriter: w,
Tapper: &h,
Dnstap: h,
Query: r,
Send: &sendOption,
QueryEpoch: time.Now(),
QueryTime: time.Now(),
}
code, err := plugin.NextOrFailure(h.Name(), h.Next, newCtx, rw, r)
if err != nil {
// ignore dnstap errors
return code, err
}
if err = rw.DnstapError(); err != nil {
return code, plugin.Error("dnstap", err)
}
return code, nil
return plugin.NextOrFailure(h.Name(), h.Next, ctx, rw, r)
}
// Name returns dnstap.
// Name implements the plugin.Plugin interface.
func (h Dnstap) Name() string { return "dnstap" }