Skip to content

Commit b5b3f5c

Browse files
authored
Adding a basic search feature (#4)
1 parent 7ef8c33 commit b5b3f5c

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

internal/core/service/tufw.go

+36
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ func (t *Tui) LoadInterfaces() ([]string, error) {
4848
return interfaces, nil
4949
}
5050

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+
5164
func (t *Tui) LoadTableData() ([]string, error) {
5265
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/'")
5366

@@ -132,6 +145,24 @@ func (t *Tui) CreateModal(text string, confirm func(), cancel func(), finally fu
132145
}), true, true)
133146
}
134147

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+
135166
func (t *Tui) CreateForm() {
136167
t.help.SetText("Use <Tab> and <Enter> keys to navigate through the form").SetBorderPadding(1, 0, 1, 1)
137168
interfaces, _ := t.LoadInterfaces()
@@ -340,6 +371,11 @@ func (t *Tui) RemoveRule() {
340371
func (t *Tui) CreateMenu() {
341372
menuList := tview.NewList()
342373
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+
}).
343379
AddItem("Add a rule", "", 'a', func() {
344380
t.CreateForm()
345381
t.app.SetFocus(t.form)

0 commit comments

Comments
 (0)