From 46a1ad4ed08309ede6a612b674f0b9c71e1e4119 Mon Sep 17 00:00:00 2001 From: Aaron Turner Date: Thu, 15 Oct 2020 20:53:31 -0700 Subject: [PATCH] Add str2pcap tool for taking debug logs and making a pcap Super basic right now. Need to add unit tests & actually parse the log? --- CHANGELOG.md | 1 + Makefile | 9 +++++- str2pcap/main.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 str2pcap/main.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c4ece..f853f46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Added: - Support for Wireguard (LinkType RAW) interfaces #29 +- Add str2pcap for improved debugging of logs ## v0.0.4 - 02-10-2020 diff --git a/Makefile b/Makefile index 6b883dc..c9da4d5 100644 --- a/Makefile +++ b/Makefile @@ -23,8 +23,15 @@ BUILDINFOS := $(shell date +%FT%T%z)$(BUILDINFOSDET) HOSTNAME := $(shell hostname) LDFLAGS := -X "main.Version=$(PROJECT_VERSION)" -X "main.Buildinfos=$(BUILDINFOS)" -X "main.Tag=$(PROJECT_TAG)" -X "main.CommitID=$(PROJECT_COMMIT)" OUTPUT_NAME := $(DIST_DIR)$(PROJECT_NAME)-$(PROJECT_VERSION)-$(GOOS)-$(GOARCH) +STR2PCAP_NAME := $(DIST_DIR)str2pcap-$(PROJECT_VERSION)-$(GOOS)-$(GOARCH) -ALL: $(OUTPUT_NAME) ## Build binary + +ALL: $(OUTPUT_NAME) str2pcap ## Build binary + +str2pcap: $(STR2PCAP_NAME) + +$(STR2PCAP_NAME): str2pcap/*.go + go build -o $(STR2PCAP_NAME) str2pcap/*.go include help.mk # place after ALL target and before all other targets diff --git a/str2pcap/main.go b/str2pcap/main.go new file mode 100644 index 0000000..ac27eaa --- /dev/null +++ b/str2pcap/main.go @@ -0,0 +1,74 @@ +package main + +// Code to take a file with each line representing a packet in hex +// Intended to be used with the log output from udp-proxy-2020 + +import ( + "bufio" + "encoding/hex" + "os" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcapgo" + log "github.com/sirupsen/logrus" + flag "github.com/spf13/pflag" +) + +func main() { + var out = flag.String("out", "", "Pcap file to create") + var in = flag.String("in", "", "Input file name with packet data to read") + var dlt = flag.Uint8("dlt", 1, "DLT value") + var debug = flag.Bool("debug", false, "Enable debugging") + + flag.Parse() + if *debug == true { + log.SetReportCaller(true) + log.SetLevel(log.DebugLevel) + } else { + log.SetLevel(log.WarnLevel) + } + + if len(*out) == 0 || len(*in) == 0 { + log.Fatal("Please specify --in, --out and --dlt") + } + + infile, err := os.Open(*in) + if err != nil { + log.Fatalf("--in %s: %s", *in, err) + } + inScanner := bufio.NewScanner(infile) + inScanner.Split(bufio.ScanLines) + + fh, err := os.Create(*out) + if err != nil { + log.Fatalf("--out %s: %s", *out, err) + } + + var linktype = layers.LinkType(*dlt) + pcap := pcapgo.NewWriterNanos(fh) + pcap.WriteFileHeader(65535, linktype) + var i = 0 + for inScanner.Scan() { + i += 1 + bytes, err := hex.DecodeString(inScanner.Text()) + if err != nil { + log.Fatalf("reading line %d: %s", i, err) + } + + ci := gopacket.CaptureInfo{ + Timestamp: time.Time{}, + CaptureLength: len(bytes), + Length: len(bytes), + InterfaceIndex: 0, + } + err = pcap.WritePacket(ci, bytes) + if err != nil { + log.Fatal(err) + } + } + + infile.Close() + // no method to close a gopcap Writer???? WTF? +}