122 lines
2.2 KiB
Go
122 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/coreos/etcd/Godeps/_workspace/src/github.com/akrennmair/gopcap"
|
|
)
|
|
|
|
const (
|
|
TYPE_IP = 0x0800
|
|
TYPE_ARP = 0x0806
|
|
TYPE_IP6 = 0x86DD
|
|
|
|
IP_ICMP = 1
|
|
IP_INIP = 4
|
|
IP_TCP = 6
|
|
IP_UDP = 17
|
|
)
|
|
|
|
var out *bufio.Writer
|
|
var errout *bufio.Writer
|
|
|
|
func main() {
|
|
var device *string = flag.String("i", "", "interface")
|
|
var snaplen *int = flag.Int("s", 65535, "snaplen")
|
|
var hexdump *bool = flag.Bool("X", false, "hexdump")
|
|
expr := ""
|
|
|
|
out = bufio.NewWriter(os.Stdout)
|
|
errout = bufio.NewWriter(os.Stderr)
|
|
|
|
flag.Usage = func() {
|
|
fmt.Fprintf(errout, "usage: %s [ -i interface ] [ -s snaplen ] [ -X ] [ expression ]\n", os.Args[0])
|
|
errout.Flush()
|
|
os.Exit(1)
|
|
}
|
|
|
|
flag.Parse()
|
|
|
|
if len(flag.Args()) > 0 {
|
|
expr = flag.Arg(0)
|
|
}
|
|
|
|
if *device == "" {
|
|
devs, err := pcap.Findalldevs()
|
|
if err != nil {
|
|
fmt.Fprintf(errout, "tcpdump: couldn't find any devices: %s\n", err)
|
|
}
|
|
if 0 == len(devs) {
|
|
flag.Usage()
|
|
}
|
|
*device = devs[0].Name
|
|
}
|
|
|
|
h, err := pcap.Openlive(*device, int32(*snaplen), true, 0)
|
|
if h == nil {
|
|
fmt.Fprintf(errout, "tcpdump: %s\n", err)
|
|
errout.Flush()
|
|
return
|
|
}
|
|
defer h.Close()
|
|
|
|
if expr != "" {
|
|
ferr := h.Setfilter(expr)
|
|
if ferr != nil {
|
|
fmt.Fprintf(out, "tcpdump: %s\n", ferr)
|
|
out.Flush()
|
|
}
|
|
}
|
|
|
|
for pkt := h.Next(); pkt != nil; pkt = h.Next() {
|
|
pkt.Decode()
|
|
fmt.Fprintf(out, "%s\n", pkt.String())
|
|
if *hexdump {
|
|
Hexdump(pkt)
|
|
}
|
|
out.Flush()
|
|
}
|
|
}
|
|
|
|
func min(a, b int) int {
|
|
if a < b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|
|
|
|
func Hexdump(pkt *pcap.Packet) {
|
|
for i := 0; i < len(pkt.Data); i += 16 {
|
|
Dumpline(uint32(i), pkt.Data[i:min(i+16, len(pkt.Data))])
|
|
}
|
|
}
|
|
|
|
func Dumpline(addr uint32, line []byte) {
|
|
fmt.Fprintf(out, "\t0x%04x: ", int32(addr))
|
|
var i uint16
|
|
for i = 0; i < 16 && i < uint16(len(line)); i++ {
|
|
if i%2 == 0 {
|
|
out.WriteString(" ")
|
|
}
|
|
fmt.Fprintf(out, "%02x", line[i])
|
|
}
|
|
for j := i; j <= 16; j++ {
|
|
if j%2 == 0 {
|
|
out.WriteString(" ")
|
|
}
|
|
out.WriteString(" ")
|
|
}
|
|
out.WriteString(" ")
|
|
for i = 0; i < 16 && i < uint16(len(line)); i++ {
|
|
if line[i] >= 32 && line[i] <= 126 {
|
|
fmt.Fprintf(out, "%c", line[i])
|
|
} else {
|
|
out.WriteString(".")
|
|
}
|
|
}
|
|
out.WriteString("\n")
|
|
}
|