@@ -2,11 +2,17 @@ package tui
2
2
3
3
import (
4
4
"fmt"
5
+ "os"
6
+ "path/filepath"
5
7
"runtime/debug"
6
8
"strings"
9
+ "time"
7
10
8
11
"github.com/ddddddO/packemon"
9
12
"github.com/gdamore/tcell/v2"
13
+ "github.com/gopacket/gopacket"
14
+ "github.com/gopacket/gopacket/layers"
15
+ "github.com/gopacket/gopacket/pcapgo"
10
16
"github.com/rivo/tview"
11
17
)
12
18
@@ -30,22 +36,35 @@ func (t *tui) updateView(passive *packemon.Passive) {
30
36
t .grid .Clear ()
31
37
})
32
38
33
- rows := make ([]int , len (viewers ))
34
- columns := make ([]int , len (viewers ))
39
+ t .grid .RemoveItem (t .grid ) // ほんと?
40
+
41
+ // +1 分は、PCAP保存領域用(savingPCAPView)
42
+ rows := make ([]int , len (viewers )+ 1 )
43
+ columns := make ([]int , len (viewers )+ 1 )
44
+ rows [0 ] = 5
45
+ columns [0 ] = 30
35
46
for i := range viewers {
36
47
rows [i ] = viewers [i ].rows ()
37
48
columns [i ] = viewers [i ].columns ()
38
49
}
39
- t .grid .RemoveItem (t .grid ) // ほんと?
40
- t .grid .SetRows (rows ... ).SetColumns (columns ... ).SetBorders (false )
50
+
51
+ // SetRows しなくなったので、各テーブルの rows メソッドいらないかも
52
+ // t.grid.SetRows(rows...).SetColumns(columns...).SetBorders(false)
53
+ t .grid .SetColumns (columns ... ).SetBorders (false )
54
+
41
55
for i := range viewers {
42
56
t .grid .AddItem (viewers [i ].viewTable (), i , 0 , 1 , 3 , 0 , 0 , false ) // focus=true にするとスクロールしない
43
57
}
58
+ savingPCAPView := t .savingPCAPView (passive )
59
+ row := len (viewers )
60
+ t .grid .AddItem (savingPCAPView , row , 0 , 1 , 3 , 0 , 0 , false )
61
+
44
62
t .grid .SetInputCapture (
45
63
func (event * tcell.EventKey ) * tcell.EventKey {
46
64
if event .Key () == tcell .KeyEscape {
47
65
t .grid .Clear ()
48
66
t .pages .SwitchToPage ("history" )
67
+ t .app .SetFocus (t .pages )
49
68
}
50
69
return event
51
70
})
@@ -130,6 +149,61 @@ func passiveToViewers(passive *packemon.Passive) []Viewer {
130
149
return viewers
131
150
}
132
151
152
+ func (t * tui ) savingPCAPView (p * packemon.Passive ) * tview.Form {
153
+ now := time .Now ()
154
+ fpath := fmt .Sprintf ("./packemon_pcap/%s.pcap" , now .Format ("20060102150405" ))
155
+ form := tview .NewForm ().
156
+ AddInputField ("File Name" , fpath , 40 , func (textToCheck string , lastChar rune ) bool {
157
+ if len (textToCheck ) < 40 {
158
+ fpath = textToCheck
159
+ return true
160
+ } else if len (textToCheck ) > 40 {
161
+ return false
162
+ }
163
+ fpath = textToCheck
164
+ return true
165
+ }, nil ).
166
+ AddButton ("Save" , func () {
167
+ if p .EthernetFrame == nil {
168
+ t .addErrPageForMonitor (fmt .Errorf ("Empty ethernet frame..." ))
169
+ return
170
+ }
171
+
172
+ dir := filepath .Dir (fpath )
173
+ if err := os .MkdirAll (dir , 0755 ); err != nil {
174
+ t .addErrPageForMonitor (err )
175
+ return
176
+ }
177
+
178
+ f , err := os .Create (fpath )
179
+ if err != nil {
180
+ t .addErrPageForMonitor (err )
181
+ return
182
+ }
183
+ defer f .Close ()
184
+
185
+ pcapw := pcapgo .NewWriter (f )
186
+ if err := pcapw .WriteFileHeader (1500 , layers .LinkTypeEthernet ); err != nil {
187
+ t .addErrPageForMonitor (err )
188
+ return
189
+ }
190
+ ci := gopacket.CaptureInfo {
191
+ Timestamp : now ,
192
+ CaptureLength : 1500 ,
193
+ Length : 1500 ,
194
+ // InterfaceIndex: intf.Index, // 必須ではなさそう
195
+ }
196
+ if err := pcapw .WritePacket (ci , p .EthernetFrame .Bytes ()); err != nil {
197
+ t .addErrPageForMonitor (err )
198
+ return
199
+ }
200
+ })
201
+ form .SetBorder (true )
202
+ form .Box = tview .NewBox ().SetBorder (true ).SetTitle (" Save PACP " ).SetTitleAlign (tview .AlignLeft ).SetBorderPadding (1 , 1 , 1 , 1 )
203
+
204
+ return form
205
+ }
206
+
133
207
func tableCellTitle (title string ) * tview.TableCell {
134
208
return tview .NewTableCell (padding (title ))
135
209
}
0 commit comments