-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathInterfaceSelector.go
105 lines (96 loc) · 2.22 KB
/
InterfaceSelector.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"strings"
"github.com/google/gopacket/pcap"
"github.com/gotk3/gotk3/gtk"
)
func PromptInterfaceName(callback func(string)) error {
builder, err := gtk.BuilderNewFromFile("res/interfaceselector.ui")
if err != nil {
return err
}
mainWidget_, err := builder.GetObject("maindialog")
if err != nil {
return err
}
mainWidget, ok := mainWidget_.(*gtk.Dialog)
if !ok {
return invalidUi("maindialog")
}
model_, err := builder.GetObject("interfaceliststore")
if err != nil {
return err
}
model, ok := model_.(*gtk.ListStore)
if !ok {
return invalidUi("liststore")
}
devs, err := pcap.FindAllDevs()
if err != nil {
return err
}
for _, dev := range devs {
var addrStringBuilder strings.Builder
for _, addr := range dev.Addresses {
addrStringBuilder.WriteString(addr.IP.String())
addrStringBuilder.WriteString(", ")
}
var addrs string
if addrStringBuilder.Len() > 2 {
// Remove trailing comma
addrs = addrStringBuilder.String()[:addrStringBuilder.Len()-2]
}
model.InsertWithValues(nil, -1, []int{0, 1, 2}, []interface{}{dev.Name, dev.Description, addrs})
}
cancelButton_, err := builder.GetObject("cancelbutton")
if err != nil {
return err
}
cancelButton, ok := cancelButton_.(*gtk.Button)
if !ok {
return invalidUi("cancelbutton")
}
cancelButton.Connect("clicked", func() {
mainWidget.Hide()
mainWidget.Destroy()
})
okButton_, err := builder.GetObject("okbutton")
if err != nil {
return err
}
okButton, ok := okButton_.(*gtk.Button)
if !ok {
return invalidUi("okbutton")
}
sel_, err := builder.GetObject("itfselection")
if err != nil {
return err
}
sel, ok := sel_.(*gtk.TreeSelection)
if !ok {
return invalidUi("sel")
}
okButton.Connect("clicked", func() {
mainWidget.Hide()
_, iter, ok := sel.GetSelected()
if !ok {
mainWidget.Destroy()
return
}
name, err := model.GetValue(iter, 0)
if err != nil {
println("selection failed:", err.Error())
return
}
nameG, err := name.GoValue()
if err != nil {
println("selection failed:", err.Error())
return
}
callback(nameG.(string))
})
mainWidget.SetIconFromFile("res/app-icon.ico")
mainWidget.SetTitle("Choose interface to capture from")
mainWidget.ShowAll()
return nil
}