Skip to content

Commit 08bc7c4

Browse files
mininetmininet
mininet
authored and
mininet
committed
new
1 parent a3cb0d4 commit 08bc7c4

File tree

1 file changed

+96
-55
lines changed

1 file changed

+96
-55
lines changed

esspresso.go

+96-55
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"os/exec"
45
"flag"
56
"fmt"
67
"io/ioutil"
@@ -11,13 +12,46 @@ import (
1112
"github.com/google/gopacket/pcap"
1213
)
1314

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+
}
1728

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+
}
2043

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() {
2155
// cmd line options
2256
var (
2357
device = flag.String("device", "docker0", "device to sniff packets from")
@@ -34,72 +68,79 @@ func main() {
3468
log.SetOutput(ioutil.Discard)
3569
}
3670

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)
3784

85+
//requests2 := 0
3886
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)
4294
}
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("")
5099
}()
51100

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)
55103
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
61104

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()
75107

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)
79110

80-
requestPacketSource = gopacket.NewPacketSource(handle_req, handle_req.LinkType())
111+
responsePacketSource, responseHandler := createPacketSource(*device, responseFilter)
112+
defer responseHandler.Close()
81113

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"))
87119

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+
}()
92122

93123
for {
94124
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+
}()
95132
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+
}()
99138
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+
}()
103144
}
104145
}
105146
}

0 commit comments

Comments
 (0)