| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | package proxy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"time"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/plugin/dnstap"
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	"github.com/coredns/coredns/plugin/dnstap/msg"
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	"github.com/coredns/coredns/request"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 11:01:06 +01:00
										 |  |  | 	"context"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	tap "github.com/dnstap/golang-dnstap"
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	b := msg.New().Time(start).HostPort(host)
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	t := ex.Transport()
 | 
					
						
							|  |  |  | 	if t == "" {
 | 
					
						
							|  |  |  | 		t = state.Proto()
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	if t == "tcp" {
 | 
					
						
							|  |  |  | 		b.SocketProto = tap.SocketProtocol_TCP
 | 
					
						
							|  |  |  | 	} else {
 | 
					
						
							|  |  |  | 		b.SocketProto = tap.SocketProtocol_UDP
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	if tapper.Pack() {
 | 
					
						
							|  |  |  | 		b.Msg(state.Req)
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	m, err := b.ToOutsideQuery(tap.Message_FORWARDER_QUERY)
 | 
					
						
							|  |  |  | 	if err != nil {
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 		return err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 	tapper.TapMessage(m)
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Response
 | 
					
						
							|  |  |  | 	if reply != nil {
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 		if tapper.Pack() {
 | 
					
						
							|  |  |  | 			b.Msg(reply)
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 		m, err := b.Time(time.Now()).ToOutsideResponse(tap.Message_FORWARDER_RESPONSE)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 			return err
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 		tapper.TapMessage(m)
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	}
 | 
					
						
							| 
									
										
										
										
											2018-03-01 03:19:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-25 19:46:41 +01:00
										 |  |  | 	return nil
 | 
					
						
							|  |  |  | }
 |