forked from Comcast/pulsar-client-go
-
Notifications
You must be signed in to change notification settings - Fork 14
/
main.go
77 lines (68 loc) · 2.11 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright 2018 Comcast Cable Communications Management, LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"bytes"
"flag"
"fmt"
"io/ioutil"
"os"
"path"
"github.com/Comcast/pulsar-client-go/frame"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
func main() {
var args = struct {
device string
port int
dir string
}{
device: "lo0",
port: 6650,
dir: "corpus",
}
flag.StringVar(&args.device, "device", args.device, "device to capture packets from")
flag.IntVar(&args.port, "port", args.port, "port to capture packets on")
flag.StringVar(&args.dir, "dir", args.dir, "directory to store corpus files")
flag.Parse()
handle, err := pcap.OpenLive(args.device, 1600, true, pcap.BlockForever)
if err != nil {
panic(err)
}
defer handle.Close()
if err := handle.SetBPFFilter(fmt.Sprintf("tcp and port %d", args.port)); err != nil {
panic(err)
}
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
handlePacket(args.dir, packet)
}
}
func handlePacket(outputDir string, pkt gopacket.Packet) {
data := pkt.Layer(layers.LayerTypeTCP).LayerPayload()
if len(data) == 0 {
return
}
var f frame.Frame
if err := f.Decode(bytes.NewReader(data)); err != nil {
fmt.Fprintln(os.Stderr, err, data)
return
}
p := path.Join(outputDir, fmt.Sprintf("%d-%s", pkt.Metadata().Timestamp.UnixNano(), f.BaseCmd.GetType().String()))
if err := ioutil.WriteFile(p, data, os.ModePerm); err != nil {
panic(err)
}
fmt.Printf("Captured %q message > %s\n", f.BaseCmd.GetType(), p)
}