@@ -48,6 +48,19 @@ func (t *Tui) LoadInterfaces() ([]string, error) {
48
48
return interfaces , nil
49
49
}
50
50
51
+ func (t * Tui ) LoadSearchData (needle string ) ([]string , error ) {
52
+ err , out , _ := utils .Shellout (fmt .Sprintf (
53
+ "ufw status numbered | sed '/^$/d' | awk '{$2=$2};1' | tail -n +4 | sed -r 's/(\\ [(\\ s)([0-9]+)\\ ])/\\ [\\ 3\\ ] /;s/(\\ [([0-9]+)\\ ])/\\ [\\ 2\\ ] /;s/\\ (out\\ )//;s/(\\ w)\\ s(\\ (v6\\ ))/\\ 1/;s/([A-Z]{2,})\\ s([A-Z]{2,3})/\\ 1-\\ 2/;s/^(.*)\\ s([A-Z]{2,}(-[A-Z]{2,3})?)\\ s(.*)\\ s(on)\\ s(.*)\\ s(#.*)?/\\ 1_\\ 5_\\ 6 - \\ 2 \\ 4 \\ 7/;s/([A-Z][a-z]+\\ /[a-z]{3})\\ s(([A-Z]+).*)/\\ 1 - \\ 2/;s/(\\ ]\\ s+)([0-9]{2,})\\ s([A-Z]{2,}(-[A-Z]{2,3})?)/\\ 1Anywhere \\ 2 \\ 3/;s/(\\ ]\\ s+)(([0-9]{1,3}\\ .){3}[0-9]{1,3}(\\ /[0-9]{1,2})?)\\ s([A-Z]{2,}-[A-Z]{2,3})/\\ 1\\ 2 - \\ 5/;s/([A-Z][a-z]+)\\ s(([A-Z]+).*)/\\ 1 - \\ 2/;s/(\\ ]\\ s+)(.*)\\ s([0-9]+)(\\ /[a-z]{3})/\\ 1\\ 2\\ 4 \\ 3/;s/(\\ ]\\ s+)\\ /([a-z]{3})\\ s/\\ 1\\ 2 /;s/^(.*)\\ s(on)\\ s(.*)\\ s([A-Z]{2,}(-[A-Z]{2,3})?)\\ s(.*)/\\ 1_\\ 2_\\ 3 - \\ 4 \\ 6/' | grep -E %v" ,
54
+ needle ,
55
+ ))
56
+ if err != nil {
57
+ return []string {}, nil
58
+ }
59
+ rows := strings .Split (out , "\n " )
60
+
61
+ return rows , nil
62
+ }
63
+
51
64
func (t * Tui ) LoadTableData () ([]string , error ) {
52
65
err , out , _ := utils .Shellout ("ufw status numbered | sed '/^$/d' | awk '{$2=$2};1' | tail -n +4 | sed -r 's/(\\ [(\\ s)([0-9]+)\\ ])/\\ [\\ 3\\ ] /;s/(\\ [([0-9]+)\\ ])/\\ [\\ 2\\ ] /;s/\\ (out\\ )//;s/(\\ w)\\ s(\\ (v6\\ ))/\\ 1/;s/([A-Z]{2,})\\ s([A-Z]{2,3})/\\ 1-\\ 2/;s/^(.*)\\ s([A-Z]{2,}(-[A-Z]{2,3})?)\\ s(.*)\\ s(on)\\ s(.*)\\ s(#.*)?/\\ 1_\\ 5_\\ 6 - \\ 2 \\ 4 \\ 7/;s/([A-Z][a-z]+\\ /[a-z]{3})\\ s(([A-Z]+).*)/\\ 1 - \\ 2/;s/(\\ ]\\ s+)([0-9]{2,})\\ s([A-Z]{2,}(-[A-Z]{2,3})?)/\\ 1Anywhere \\ 2 \\ 3/;s/(\\ ]\\ s+)(([0-9]{1,3}\\ .){3}[0-9]{1,3}(\\ /[0-9]{1,2})?)\\ s([A-Z]{2,}-[A-Z]{2,3})/\\ 1\\ 2 - \\ 5/;s/([A-Z][a-z]+)\\ s(([A-Z]+).*)/\\ 1 - \\ 2/;s/(\\ ]\\ s+)(.*)\\ s([0-9]+)(\\ /[a-z]{3})/\\ 1\\ 2\\ 4 \\ 3/;s/(\\ ]\\ s+)\\ /([a-z]{3})\\ s/\\ 1\\ 2 /;s/^(.*)\\ s(on)\\ s(.*)\\ s([A-Z]{2,}(-[A-Z]{2,3})?)\\ s(.*)/\\ 1_\\ 2_\\ 3 - \\ 4 \\ 6/'" )
53
66
@@ -132,6 +145,24 @@ func (t *Tui) CreateModal(text string, confirm func(), cancel func(), finally fu
132
145
}), true , true )
133
146
}
134
147
148
+ func (t * Tui ) SearchForm () {
149
+ t .form .AddInputField ("Regex" , "" , 20 , nil , nil ).SetFieldTextColor (tcell .ColorWhite ).AddButton ("Search" , func () {
150
+ needle := t .form .GetFormItem (0 ).(* tview.InputField ).GetText ()
151
+ data , _ := t .LoadSearchData (needle )
152
+
153
+ if len (data ) > 0 {
154
+ t .table .Clear ()
155
+ t .CreateTable (data )
156
+ } else {
157
+ t .secondHelp .SetText (" No result." )
158
+ }
159
+ }).AddButton ("Cancel" , func () {
160
+ t .Reset ()
161
+ t .ReloadTable ()
162
+ t .app .SetFocus (t .menu )
163
+ })
164
+ }
165
+
135
166
func (t * Tui ) CreateForm () {
136
167
t .help .SetText ("Use <Tab> and <Enter> keys to navigate through the form" ).SetBorderPadding (1 , 0 , 1 , 1 )
137
168
interfaces , _ := t .LoadInterfaces ()
@@ -340,6 +371,11 @@ func (t *Tui) RemoveRule() {
340
371
func (t * Tui ) CreateMenu () {
341
372
menuList := tview .NewList ()
342
373
menuList .
374
+ AddItem ("Search a rule" , "" , '/' , func () {
375
+ t .SearchForm ()
376
+ t .app .SetFocus (t .form )
377
+ t .help .SetText ("Press <Esc> to go back to the menu selection" ).SetBorderPadding (1 , 0 , 1 , 0 )
378
+ }).
343
379
AddItem ("Add a rule" , "" , 'a' , func () {
344
380
t .CreateForm ()
345
381
t .app .SetFocus (t .form )
0 commit comments