1
1
package main
2
2
3
3
import (
4
+ "os/exec"
4
5
"flag"
5
6
"fmt"
6
7
"io/ioutil"
@@ -11,13 +12,46 @@ import (
11
12
"github.com/google/gopacket/pcap"
12
13
)
13
14
14
- // main
15
- func main () {
16
- var err error
15
+ type Metric struct {
16
+ Rate int
17
+ CurrentValue int
18
+ PrevValue int
19
+ }
20
+
21
+ func getHandleFunc (metric * int , metricDescription string ) func (w http.ResponseWriter , r * http.Request ){
22
+ return func (w http.ResponseWriter , r * http.Request ) {
23
+ if _ , err := w .Write ([]byte (fmt .Sprintf ("%d\n " , * metric ))); err != nil {
24
+ log .Fatal ("Can't write " , metricDescription )
25
+ }
26
+ }
27
+ }
17
28
18
- requests := 0
19
- responses := 0
29
+ func createPacketSource (device string , filter string ) (* gopacket.PacketSource , * pcap.Handle ) {
30
+ var (
31
+ snapshotLen int32 = 1024
32
+ promiscuous bool = true
33
+ timeout time.Duration = 100 * time .Millisecond
34
+ err error
35
+ handler * pcap.Handle
36
+ packetSource * gopacket.PacketSource
37
+ )
38
+
39
+ handler , err = pcap .OpenLive (device , snapshotLen , promiscuous , timeout )
40
+ if err != nil {
41
+ log .Fatal (err )
42
+ }
20
43
44
+ if err := handler .SetBPFFilter (filter ); err != nil {
45
+ log .Fatal (err )
46
+ }
47
+
48
+ packetSource = gopacket .NewPacketSource (handler , handler .LinkType ())
49
+
50
+ return packetSource , handler
51
+ }
52
+
53
+ // main
54
+ func main () {
21
55
// cmd line options
22
56
var (
23
57
device = flag .String ("device" , "docker0" , "device to sniff packets from" )
@@ -34,72 +68,79 @@ func main() {
34
68
log .SetOutput (ioutil .Discard )
35
69
}
36
70
71
+ requests := & Metric {
72
+ Rate : 0 ,
73
+ CurrentValue : 0 ,
74
+ PrevValue : 0 ,
75
+ }
76
+
77
+ responses := & Metric {
78
+ Rate : 0 ,
79
+ CurrentValue : 0 ,
80
+ PrevValue : 0 ,
81
+ }
82
+
83
+ ticker := time .NewTicker (1 * time .Second )
37
84
85
+ //requests2 := 0
38
86
go func () {
39
- http .HandleFunc ("/requests" , func (w http.ResponseWriter , r * http.Request ) {
40
- if _ , err := w .Write ([]byte (fmt .Sprintf ("%d\n " , requests ))); err != nil {
41
- log .Fatal ("Can't write rate" )
87
+ command := exec .Command ("/bin/sleep" , "100" )
88
+ command .Start ()
89
+ for {
90
+ std , err := command .Output ()
91
+ time .Sleep (2 * time .Second )
92
+ if (err != nil ) {
93
+ log .Fatal (err )
42
94
}
43
- })
44
- http .HandleFunc ("/responses" , func (w http.ResponseWriter , r * http.Request ) {
45
- if _ , err := w .Write ([]byte (fmt .Sprintf ("%d\n " , responses ))); err != nil {
46
- log .Fatal ("Can't write rate" )
47
- }
48
- })
49
- log .Fatal (http .ListenAndServe (":6666" , nil ))
95
+ fmt .Println (std )
96
+ fmt .Println ("foo" )
97
+ }
98
+ //requests2 = os.Run("")
50
99
}()
51
100
52
- requestFilter := fmt .Sprintf ("src %s and dst %s and (tcp[0xd] & tcp-syn) != 0" , * clientIP , * gorbIP )
53
- responseFilter := fmt .Sprintf ("dst %s and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" , * clientIP )
54
-
101
+ // requestFilter := fmt.Sprintf("src %s and dst %s and (tcp[0xd] & tcp-syn) != 0", *clientIP, *gorbIP)
102
+ requestFilter := fmt .Sprintf ("tcp and dst %s and tcp[(tcp[0xc] >> 4) << 2 : 4] = 0x47455420" , * gorbIP )
55
103
fmt .Printf ("Request filter: %s\n " , requestFilter )
56
- fmt .Printf ("Response filter: %s\n " , responseFilter )
57
-
58
- // Open device
59
- var requestPacketSource * gopacket.PacketSource
60
- var responsePacketSource * gopacket.PacketSource
61
104
62
- var (
63
- snapshotLen int32 = 1024
64
- promiscuous bool = true
65
- timeout time.Duration = 1 * time .Second
66
- handle_res * pcap.Handle
67
- handle_req * pcap.Handle
68
- )
69
-
70
- handle_req , err = pcap .OpenLive (* device , snapshotLen , promiscuous , timeout )
71
- if err != nil {
72
- log .Fatal (err )
73
- }
74
- defer handle_req .Close ()
105
+ requestPacketSource , requestHandler := createPacketSource (* device , requestFilter )
106
+ defer requestHandler .Close ()
75
107
76
- if err := handle_req .SetBPFFilter (requestFilter ); err != nil {
77
- log .Fatal (err )
78
- }
108
+ responseFilter := fmt .Sprintf ("dst %s and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" , * clientIP )
109
+ fmt .Printf ("Response filter: %s\n " , responseFilter )
79
110
80
- requestPacketSource = gopacket .NewPacketSource (handle_req , handle_req .LinkType ())
111
+ responsePacketSource , responseHandler := createPacketSource (* device , responseFilter )
112
+ defer responseHandler .Close ()
81
113
82
- handle_res , err = pcap . OpenLive ( * device , snapshotLen , promiscuous , timeout )
83
- if err != nil {
84
- log . Fatal ( err )
85
- }
86
- defer handle_res . Close ( )
114
+ go func () {
115
+ http . HandleFunc ( "/request/count" , getHandleFunc ( & requests . CurrentValue , "request count" ))
116
+ http . HandleFunc ( "/response/count" , getHandleFunc ( & responses . CurrentValue , "response count" ) )
117
+ http . HandleFunc ( "/request/rate" , getHandleFunc ( & requests . Rate , "request rate" ))
118
+ http . HandleFunc ( "/response/rate" , getHandleFunc ( & responses . Rate , "response rate" ) )
87
119
88
- if err := handle_res .SetBPFFilter (responseFilter ); err != nil {
89
- log .Fatal (err )
90
- }
91
- responsePacketSource = gopacket .NewPacketSource (handle_res , handle_res .LinkType ())
120
+ log .Fatal (http .ListenAndServe (":6666" , nil ))
121
+ }()
92
122
93
123
for {
94
124
select {
125
+ case <- ticker .C :
126
+ go func () {
127
+ requests .Rate = requests .CurrentValue - requests .PrevValue
128
+ requests .PrevValue = requests .CurrentValue
129
+ responses .Rate = responses .CurrentValue - responses .PrevValue
130
+ responses .PrevValue = responses .CurrentValue
131
+ }()
95
132
case request := <- requestPacketSource .Packets ():
96
- log .Print (request )
97
- requests += 1
98
- log .Print ("Requests: " , requests )
133
+ go func () {
134
+ log .Print (request )
135
+ requests .CurrentValue += 1
136
+ log .Print ("Requests: " , requests .CurrentValue )
137
+ }()
99
138
case response := <- responsePacketSource .Packets ():
100
- log .Print (response )
101
- responses += 1
102
- log .Print ("Responses: " , responses )
139
+ go func () {
140
+ log .Print (response )
141
+ responses .CurrentValue += 1
142
+ log .Print ("Responses: " , responses .CurrentValue )
143
+ }()
103
144
}
104
145
}
105
146
}
0 commit comments