netshovel

Network Archaeology library for Go
git clone https://git.woozle.org/neale/netshovel.git

netshovel / examples / simple
Neale Pickett  ·  2020-09-24

simple.go

 1package main
 2
 3import (
 4	"fmt"
 5	"io"
 6	"log"
 7	"strings"
 8	"sync"
 9
10	"github.com/dirtbags/netshovel"
11	"github.com/google/gopacket"
12	"github.com/google/gopacket/tcpassembly"
13)
14
15var wg sync.WaitGroup
16
17type SimpleStreamFactory struct {
18}
19
20type SimpleStream struct {
21	*netshovel.Stream
22}
23
24type SimplePacket struct {
25	netshovel.Packet
26}
27
28func NewSimplePacket() SimplePacket {
29	return SimplePacket{
30		Packet: netshovel.NewPacket(),
31	}
32}
33
34func (f *SimpleStreamFactory) New(net, transport gopacket.Flow) tcpassembly.Stream {
35	stream := &SimpleStream{
36		Stream: netshovel.NewStream(net, transport),
37	}
38	wg.Add(1)
39	go stream.Decode(&wg)
40
41	return stream
42}
43
44func (stream SimpleStream) Display(pkt SimplePacket) {
45	out := new(strings.Builder)
46
47	fmt.Fprintf(out, "Simple %v:%v → %v:%v\n",
48		stream.Net.Src().String(), stream.Transport.Src().String(),
49		stream.Net.Dst().String(), stream.Transport.Dst().String(),
50	)
51	out.WriteString(pkt.Describe())
52	fmt.Println(out.String())
53}
54
55func (stream SimpleStream) Decode(wg *sync.WaitGroup) {
56	for {
57		pkt := NewSimplePacket()
58
59		utterance, err := stream.Read(-1)
60		if err != nil {
61			if err != io.EOF {
62				log.Println(err)
63			}
64			break
65		}
66
67		pkt.Payload = utterance.Data
68		pkt.When = utterance.When
69		stream.Display(pkt)
70	}
71	wg.Done()
72}
73
74func main() {
75	netshovel.Shovel(&SimpleStreamFactory{})
76	wg.Wait()
77}