From ca9bd30a95c5b47286aac46f5c7b99ab3d36650d Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Tue, 27 Jun 2023 17:48:24 +0200 Subject: [PATCH] net/frr - BFD diagnostics in new style (#3487) * BFD diagnostics in new style. * Add tree support for BFD diagnostics. * net/frr - cleanups for BFD diagnostics (https://github.com/opnsense/plugins/pull/3485). * net/frr - cleanups for BFD diagnostics (https://github.com/opnsense/plugins/pull/3485). parse summary data and wrap into bootgrid. * net/frr - cleanups for BFD diagnostics (https://github.com/opnsense/plugins/pull/3485). trim frr summary info. --------- Co-authored-by: Mark O. Stitson --- .../Quagga/Api/DiagnosticsController.php | 42 ++++++++++++++++++- .../OPNsense/Quagga/DiagnosticsController.php | 25 +++++++++++ .../app/models/OPNsense/Quagga/Menu/Menu.xml | 1 + .../views/OPNsense/Quagga/diagnostics.volt | 17 ++++++++ .../conf/actions.d/actions_quagga.conf | 18 ++++++++ 5 files changed, 102 insertions(+), 1 deletion(-) diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php index c9e7f3ff5..59d30d1a4 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/DiagnosticsController.php @@ -237,7 +237,7 @@ class DiagnosticsController extends ApiControllerBase public function searchOspfneighborAction(): array { $records = []; - $payload = $this->getInformation("ospf", "neighbor", "json")['response']; + $payload = $this->getInformation("ospf", "neighbor", "json"); if (!empty($payload['neighbors'])) { foreach ($payload['neighbors'] as $neighborid => $neighbor) { foreach ($neighbor as $item) { @@ -312,4 +312,44 @@ class DiagnosticsController extends ApiControllerBase { return $this->getInformation("ospfv3", "interface", $format); } + + private function bfdTreeFetch($topic) + { + $records = []; + $payload = $this->getInformation("bfd", $topic, "json")['response']; + if (!empty($payload)) { + foreach ($payload as $peer) { + $peerid = $peer['peer']; + $records[$peerid] = $peer; + } + } + return ["response" => $records]; + } + + public function bfdsummaryAction(): array + { + $records = []; + foreach (explode("\n", $this->getInformation("bfd", "summary", "plain")['response']) as $line) { + $parts = preg_split('/\s+/', trim($line)); + if (count($parts) == 4 && filter_var($parts[0], FILTER_VALIDATE_INT) !== false) { + $records[] = [ + 'id' => $parts[0], + 'local' => $parts[1], + 'peer' => $parts[2], + 'status' => $parts[3] + ]; + } + } + return $this->searchRecordsetBase($records); + } + + public function bfdneighborsAction(): array + { + return $this->bfdTreeFetch('neighbors'); + } + + public function bfdcountersAction(): array + { + return $this->bfdTreeFetch('counters'); + } } diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php index 923e0d3ed..15b1e440b 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/DiagnosticsController.php @@ -95,6 +95,31 @@ class DiagnosticsController extends \OPNsense\Base\IndexController $this->view->default_tab = 'routing'; $this->view->pick('OPNsense/Quagga/diagnostics'); } + public function bfdAction() + { + $this->view->tabs = [ + [ + 'name' => 'summary', + 'endpoint' => '/api/quagga/diagnostics/bfdsummary', + 'tabhead' => gettext('Summary'), + 'type' => 'bfdsummary' + ], + [ + 'name' => 'neighbors', + 'endpoint' => '/api/quagga/diagnostics/bfdneighbors', + 'tabhead' => gettext('Neighbors'), + 'type' => 'tree' + ], + [ + 'name' => 'counters', + 'endpoint' => '/api/quagga/diagnostics/bfdcounters', + 'tabhead' => gettext('Counters'), + 'type' => 'tree' + ] + ]; + $this->view->default_tab = 'summary'; + $this->view->pick('OPNsense/Quagga/diagnostics'); + } public function ospfv3Action() { $this->view->pick('OPNsense/Quagga/diagnosticsospfv3'); diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.xml index 450399f57..2a0fc1634 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.xml @@ -12,6 +12,7 @@ + diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt index 247317359..9e8524b63 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/diagnostics.volt @@ -86,6 +86,7 @@ POSSIBILITY OF SUCH DAMAGE. {% case 'bgproutetable' %} {% case 'ospfroutetable' %} {% case 'ospfneighbors' %} + {% case 'bfdsummary' %} if (all_grids["{{ tab['name'] }}"] === undefined) { /** * initialize bootgrid table for {{ tab['tabhead'] }} @@ -320,6 +321,22 @@ POSSIBILITY OF SUCH DAMAGE. {% break %} + {% case 'bfdsummary' %} +
+ + + + + + + + + + + +
{{ lang._('SessionId') }}{{ lang._('LocalAddress') }}{{ lang._('PeerAddress') }}{{ lang._('Status') }}
+
+ {% break %} {% case 'tree' %}