From caed6e2504c0ae0e9e723b0cd0f4fe929a436f29 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Tue, 22 Jun 2021 11:19:39 +0200 Subject: [PATCH] Firewall: Diagnostics: States Dump - refactor to MVC. o a rudimentary column sort --- .../OPNsense/Diagnostics/Api/FirewallController.php | 7 ++++++- src/opnsense/scripts/filter/list_states.py | 11 +++++++++++ .../service/conf/actions.d/actions_filter.conf | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/FirewallController.php b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/FirewallController.php index 70a872a5e..ce40541c4 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/FirewallController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/FirewallController.php @@ -167,6 +167,7 @@ class FirewallController extends ApiControllerBase ]); $searchPhrase = ''; $ruleId = ''; + $sortBy = ''; $itemsPerPage = $this->request->getPost('rowCount', 'int', 9999); $currentPage = $this->request->getPost('current', 'int', 1); @@ -177,9 +178,13 @@ class FirewallController extends ApiControllerBase if ($this->request->getPost('searchPhrase', 'string', '') != '') { $searchPhrase = $filter->sanitize($this->request->getPost('searchPhrase'), 'query'); } + if ($this->request->has('sort') && is_array($this->request->getPost("sort"))) { + $tmp = array_keys($this->request->getPost("sort")); + $sortBy = $tmp[0] . " ". $this->request->getPost("sort")[$tmp[0]] ; + } $response = (new Backend())->configdpRun('filter list states', [$searchPhrase, $itemsPerPage, - ($currentPage - 1) * $itemsPerPage, $ruleId]); + ($currentPage - 1) * $itemsPerPage, $ruleId, $sortBy]); $response = json_decode($response, true); if ($response != null) { foreach ($response['details'] as &$row) { diff --git a/src/opnsense/scripts/filter/list_states.py b/src/opnsense/scripts/filter/list_states.py index 5a47ad3f3..bf74722c2 100755 --- a/src/opnsense/scripts/filter/list_states.py +++ b/src/opnsense/scripts/filter/list_states.py @@ -40,11 +40,22 @@ if __name__ == '__main__': parser.add_argument('--label', help='label / rule id', default='') parser.add_argument('--limit', help='limit number of results', default='') parser.add_argument('--offset', help='offset results', default='') + parser.add_argument('--sort_by', help='sort by (field asc|desc)', default='') inputargs = parser.parse_args() result = { 'details': query_states(rule_label=inputargs.label, filter_str=inputargs.filter) } + # sort results + if inputargs.sort_by.strip() != '': + sort_key = inputargs.sort_by.split()[0] + sort_desc = inputargs.sort_by.split()[-1] == 'desc' + result['details'] = sorted( + result['details'], + key=lambda k: str(k[sort_key]).lower() if sort_key in k else '', + reverse=sort_desc + ) + result['total_entries'] = len(result['details']) # apply offset and limit if inputargs.offset.isdigit(): diff --git a/src/opnsense/service/conf/actions.d/actions_filter.conf b/src/opnsense/service/conf/actions.d/actions_filter.conf index ac4adcfea..09e4a5be6 100644 --- a/src/opnsense/service/conf/actions.d/actions_filter.conf +++ b/src/opnsense/service/conf/actions.d/actions_filter.conf @@ -37,7 +37,7 @@ message:request content of pf %s table [list.states] command:/usr/local/opnsense/scripts/filter/list_states.py -parameters: --filter=%s --limit=%s --offset=%s --label=%s +parameters: --filter=%s --limit=%s --offset=%s --label=%s --sort_by=%s type:script_output message:request pf states