mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	
		
			
	
	
		
			73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package debug
 | ||
|  | 
 | ||
|  | import (
 | ||
|  | 	"bytes"
 | ||
|  | 	"fmt"
 | ||
|  | 
 | ||
|  | 	"github.com/coredns/coredns/plugin/pkg/log"
 | ||
|  | 
 | ||
|  | 	"github.com/miekg/dns"
 | ||
|  | )
 | ||
|  | 
 | ||
|  | // Hexdump converts the dns message m to a hex dump Whireshark can import.
 | ||
|  | // See https://www.wireshark.org/docs/man-pages/text2pcap.html.
 | ||
|  | // This output looks like this:
 | ||
|  | //
 | ||
|  | // 00000 dc bd 01 00 00 01 00 00 00 00 00 01 07 65 78 61
 | ||
|  | // 000010 6d 70 6c 65 05 6c 6f 63 61 6c 00 00 01 00 01 00
 | ||
|  | // 000020 00 29 10 00 00 00 80 00 00 00
 | ||
|  | // 00002a
 | ||
|  | //
 | ||
|  | // Hexdump will use log.Debug to write the dump to the log, each line
 | ||
|  | // is prefixed with 'debug: ' so the data can be easily extracted.
 | ||
|  | //
 | ||
|  | // msg will prefix the pcap dump.
 | ||
|  | func Hexdump(m *dns.Msg, v ...interface{}) {
 | ||
|  | 	if !log.D {
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	buf, _ := m.Pack()
 | ||
|  | 	if len(buf) == 0 {
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	out := "\n" + string(hexdump(buf))
 | ||
|  | 	v = append(v, out)
 | ||
|  | 	log.Debug(v...)
 | ||
|  | }
 | ||
|  | 
 | ||
|  | // Hexdumpf dumps a DNS message as Hexdump, but allows a format string.
 | ||
|  | func Hexdumpf(m *dns.Msg, format string, v ...interface{}) {
 | ||
|  | 	if !log.D {
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	buf, _ := m.Pack()
 | ||
|  | 	if len(buf) == 0 {
 | ||
|  | 		return
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	format += "\n%s"
 | ||
|  | 	v = append(v, hexdump(buf))
 | ||
|  | 	log.Debugf(format, v...)
 | ||
|  | }
 | ||
|  | 
 | ||
|  | func hexdump(data []byte) []byte {
 | ||
|  | 	b := new(bytes.Buffer)
 | ||
|  | 
 | ||
|  | 	newline := ""
 | ||
|  | 	for i := 0; i < len(data); i++ {
 | ||
|  | 		if i%16 == 0 {
 | ||
|  | 			fmt.Fprintf(b, "%s%s%06x", newline, prefix, i)
 | ||
|  | 			newline = "\n"
 | ||
|  | 		}
 | ||
|  | 		fmt.Fprintf(b, " %02x", data[i])
 | ||
|  | 	}
 | ||
|  | 	fmt.Fprintf(b, "\n%s%06x", prefix, len(data))
 | ||
|  | 
 | ||
|  | 	return b.Bytes()
 | ||
|  | }
 | ||
|  | 
 | ||
|  | const prefix = "debug: "
 |