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}