From 63bdff8cf3a2dbbd1b071e6a3c83e09f7faa3b1f Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Mon, 21 Jun 2021 18:27:21 +0200 Subject: [PATCH] Firewall: Diagnostics: States Dump - refactor to MVC. o add api endpoint and ui to kill states using filter (kill by host or network as well) o show ruleids in service control spot to filter states for a specific (auto-generated) rule o support passing a ruleid to the ui page to limit selection, e.g. /ui/diagnostics/firewall/states#d0953c4424f27d5249027086b4599999 --- .../Diagnostics/Api/FirewallController.php | 55 +++++++++++++- .../mvc/app/models/OPNsense/Core/ACL/ACL.xml | 1 + .../views/OPNsense/Diagnostics/fw_states.volt | 71 ++++++++++++++++++- src/opnsense/scripts/filter/kill_states.py | 52 ++++++++++++++ src/opnsense/scripts/filter/list_rule_ids.py | 44 ++++++++++++ src/opnsense/scripts/filter/list_states.py | 2 +- .../conf/actions.d/actions_filter.conf | 11 +++ 7 files changed, 232 insertions(+), 4 deletions(-) create mode 100755 src/opnsense/scripts/filter/kill_states.py create mode 100755 src/opnsense/scripts/filter/list_rule_ids.py 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 78555c616..70a872a5e 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/FirewallController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/FirewallController.php @@ -166,16 +166,20 @@ class FirewallController extends ApiControllerBase } ]); $searchPhrase = ''; - $ruleLabel = ''; + $ruleId = ''; $itemsPerPage = $this->request->getPost('rowCount', 'int', 9999); $currentPage = $this->request->getPost('current', 'int', 1); + if ($this->request->getPost('ruleid', 'string', '') != '') { + $ruleId = $filter->sanitize($this->request->getPost('ruleid'), 'query'); + } + if ($this->request->getPost('searchPhrase', 'string', '') != '') { $searchPhrase = $filter->sanitize($this->request->getPost('searchPhrase'), 'query'); } $response = (new Backend())->configdpRun('filter list states', [$searchPhrase, $itemsPerPage, - ($currentPage - 1) * $itemsPerPage, $ruleLabel]); + ($currentPage - 1) * $itemsPerPage, $ruleId]); $response = json_decode($response, true); if ($response != null) { foreach ($response['details'] as &$row) { @@ -214,4 +218,51 @@ class FirewallController extends ApiControllerBase } return ['result' => ""]; } + + /** + * drop pf states by filter and/or rule id + */ + public function killStatesAction() + { + if ($this->request->isPost()) { + $filter = new Filter([ + 'query' => function ($value) { + return preg_replace("/[^0-9,a-z,A-Z, ,\/,*,\-,_,.,\#]/", "", $value); + }, + 'hexval' => function ($value) { + return preg_replace("/[^0-9,a-f,A-F]/", "", $value); + } + ]); + $ruleid = null; + $filterString = null; + if (!empty($this->request->getPost('filter'))) { + $filterString = $filter->sanitize($this->request->getPost('filter'), 'query'); + } + if (!empty($this->request->getPost('ruleid'))) { + $ruleid = $filter->sanitize($this->request->getPost('ruleid'), 'hexval'); + } + if ($filterString != null || $ruleid != null) { + $response = (new Backend())->configdpRun("filter kill states", [$filterString, $ruleid]); + $response = json_decode($response, true); + if ($response != null) { + return ["result" => "ok", "dropped_states" => $response['dropped_states']]; + } + } + } + return ["result" => "failed"]; + } + + /** + * return rule'ids and descriptions from running config + */ + public function listRuleIdsAction() + { + if ($this->request->isGet()) { + $response = json_decode((new Backend())->configdpRun("filter list rule_ids"), true); + if ($response != null) { + return ["items" => $response]; + } + } + return ["items" => []]; + } } diff --git a/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml b/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml index f266b1562..6e58f3097 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml @@ -177,6 +177,7 @@ ui/diagnostics/firewall/states* api/diagnostics/firewall/query_states* api/diagnostics/firewall/del_state* + api/diagnostics/firewall/kill_states* diff --git a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_states.volt b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_states.volt index db779abb1..91c9679ff 100644 --- a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_states.volt +++ b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_states.volt @@ -68,17 +68,86 @@ POSSIBILITY OF SUCH DAMAGE. } return ""; } - } + }, + requestHandler:function(request){ + if ($("#ruleid").val() != "") { + request['ruleid'] = $("#ruleid").val(); + } + return request; + }, } } ); grid_states.on('loaded.rs.jquery.bootgrid', function() { $('[data-toggle="tooltip"]').tooltip(); + if ($(".search-field").val() !== "") { + $("#actKillStates").show(); + } else { + $("#actKillStates").hide(); + } }); + + // collect rule id's + ajaxGet("/api/diagnostics/firewall/list_rule_ids", {}, function(data, status){ + if (data.items) { + for (let i=0; i < data.items.length ; ++i) { + $("#ruleid").append($("