diff options
Diffstat (limited to 'plugin/proxy/dnstap.go')
-rw-r--r-- | plugin/proxy/dnstap.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/plugin/proxy/dnstap.go b/plugin/proxy/dnstap.go new file mode 100644 index 000000000..430b43847 --- /dev/null +++ b/plugin/proxy/dnstap.go @@ -0,0 +1,54 @@ +package proxy + +import ( + "time" + + "github.com/coredns/coredns/plugin/dnstap" + "github.com/coredns/coredns/request" + + tap "github.com/dnstap/golang-dnstap" + "github.com/miekg/dns" + "golang.org/x/net/context" +) + +func toDnstap(ctx context.Context, host string, ex Exchanger, state request.Request, reply *dns.Msg, start time.Time) error { + tapper := dnstap.TapperFromContext(ctx) + if tapper == nil { + return nil + } + + // Query + b := tapper.TapBuilder() + b.TimeSec = uint64(start.Unix()) + if err := b.HostPort(host); err != nil { + return err + } + + t := ex.Transport() + if t == "" { + t = state.Proto() + } + if t == "tcp" { + b.SocketProto = tap.SocketProtocol_TCP + } else { + b.SocketProto = tap.SocketProtocol_UDP + } + + if err := b.Msg(state.Req); err != nil { + return err + } + + if err := tapper.TapMessage(b.ToOutsideQuery(tap.Message_FORWARDER_QUERY)); err != nil { + return err + } + + // Response + if reply != nil { + b.TimeSec = uint64(time.Now().Unix()) + if err := b.Msg(reply); err != nil { + return err + } + return tapper.TapMessage(b.ToOutsideResponse(tap.Message_FORWARDER_RESPONSE)) + } + return nil +} |