From c5c70b173c0dce5ea8a78d77598745803ffa0883 Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 23 Jun 2026 15:23:03 +0200 Subject: [PATCH 01/11] net/frr: Manual configuration override, WIP --- net/frr/src/etc/inc/plugins.inc.d/frr.inc | 16 +++++ .../OPNsense/Quagga/Api/ServiceController.php | 3 +- .../OPNsense/Quagga/forms/general.xml | 6 ++ .../System/Status/FrrManualConfigStatus.php | 63 +++++++++++++++++++ .../app/models/OPNsense/Quagga/General.xml | 1 + net/frr/src/opnsense/scripts/frr/setup.sh | 3 + .../templates/OPNsense/Quagga/+TARGETS | 1 - .../OPNsense/Quagga/rc.conf.d/+TARGETS | 1 + .../OPNsense/Quagga/{ => rc.conf.d}/frr | 0 9 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php create mode 100644 net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/+TARGETS rename net/frr/src/opnsense/service/templates/OPNsense/Quagga/{ => rc.conf.d}/frr (100%) diff --git a/net/frr/src/etc/inc/plugins.inc.d/frr.inc b/net/frr/src/etc/inc/plugins.inc.d/frr.inc index 19ff9f038a..d76ba8f8fd 100644 --- a/net/frr/src/etc/inc/plugins.inc.d/frr.inc +++ b/net/frr/src/etc/inc/plugins.inc.d/frr.inc @@ -40,6 +40,22 @@ function frr_carp_enabled() (string)$model->enablecarp == '1'; } +function frr_configure() +{ + return [ + 'frr_sync' => ['frr_configure_do'], + ]; +} + +function frr_configure_do($verbose = false) +{ + $model = new \OPNsense\Quagga\General(); + if (!$model->enabled->isEmpty() || !$model->manual_config-isEmpty()) { + return; + } + //(new \OPNsense\Core\Backend())->configdpRun('template reload', ['OPNsense/Quagga']); +} + function frr_firewall($fw) { global $config; diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php index 9ddce03578..901b6ecfd2 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php @@ -38,7 +38,8 @@ class ServiceController extends ApiMutableServiceControllerBase { protected static $internalServiceClass = '\OPNsense\Quagga\General'; - protected static $internalServiceTemplate = 'OPNsense/Quagga'; + // We intentionally only reload this template to allow manual_config for the templates + protected static $internalServiceTemplate = 'OPNsense/Quagga/rc.conf.d'; protected static $internalServiceEnabled = 'enabled'; protected static $internalServiceName = 'quagga'; diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml index f8baf46fef..b3f80005b2 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml @@ -5,6 +5,12 @@ checkbox This will activate the routing service. Without enabling it globally, none of the individual services will run. + + general.manual_config + + checkbox + Disable configuration file generation and manage the file (/usr/local/etc/frr/frr.conf) manually. + general.profile diff --git a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php new file mode 100644 index 0000000000..8ad279bab2 --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php @@ -0,0 +1,63 @@ +internalPriority = 2; + $this->internalPersistent = true; + $this->internalIsBanner = true; + $this->internalTitle = gettext('FRR manual configuration'); + $this->internalScope = [ + '/ui/quagga/general', + '/ui/quagga/bgp', + '/ui/quagga/ospf', + '/ui/quagga/ospf6', + '/ui/quagga/rip', + '/ui/quagga/bfd', + '/ui/quagga/static_routes' + ]; + } + + public function collectStatus() + { + if (!(new General())->$model->manual_config->isEmpty()) { + $this->internalMessage = gettext( + 'Configuration file generation is disabled. Settings configured in the GUI may no longer affect the active FRR configuration.' + ); + $this->internalStatus = SystemStatusCode::NOTICE; + } + } +} \ No newline at end of file diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml index 6e9507e4b9..705ca381fe 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml @@ -7,6 +7,7 @@ 0 Y + Y traditional diff --git a/net/frr/src/opnsense/scripts/frr/setup.sh b/net/frr/src/opnsense/scripts/frr/setup.sh index bda37d2c33..cf6deb35d8 100755 --- a/net/frr/src/opnsense/scripts/frr/setup.sh +++ b/net/frr/src/opnsense/scripts/frr/setup.sh @@ -19,6 +19,9 @@ chown -R $user:$group /var/run/frr touch /var/log/frr.log chown $user:$group /var/log/frr.log +# Reload templates here since we allow manual_config +/usr/local/sbin/pluginctl -c frr_sync + # register Security Associations /usr/local/opnsense/scripts/frr/register_sas diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS index 9ee342bb4c..5edbeebd2e 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS @@ -1,4 +1,3 @@ -frr:/etc/rc.conf.d/frr frr.conf:/usr/local/etc/frr/frr.conf vtysh.conf:/usr/local/etc/frr/vtysh.conf ospf6d_carp.conf:/usr/local/etc/frr/ospf6d_carp.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/+TARGETS new file mode 100644 index 0000000000..979ada4d25 --- /dev/null +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/+TARGETS @@ -0,0 +1 @@ +frr:/etc/rc.conf.d/frr \ No newline at end of file diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/frr similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/frr From d0b02d6d4e80743dbed2ba5545e1fe50005bdd33 Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 23 Jun 2026 15:26:34 +0200 Subject: [PATCH 02/11] net/frr: Typo in previous --- .../library/OPNsense/System/Status/FrrManualConfigStatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php index 8ad279bab2..0ff652e27b 100644 --- a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php +++ b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php @@ -53,7 +53,7 @@ public function __construct() public function collectStatus() { - if (!(new General())->$model->manual_config->isEmpty()) { + if (!(new General())->manual_config->isEmpty()) { $this->internalMessage = gettext( 'Configuration file generation is disabled. Settings configured in the GUI may no longer affect the active FRR configuration.' ); From 78f2965c2b91c0d269a5c547810d66810b270e60 Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 23 Jun 2026 16:48:09 +0200 Subject: [PATCH 03/11] net/frr: Typo in previous --- net/frr/src/etc/inc/plugins.inc.d/frr.inc | 4 ++-- .../OPNsense/Quagga/Api/ServiceController.php | 2 +- .../OPNsense/System/Status/FrrManualConfigStatus.php | 10 ++-------- net/frr/src/opnsense/scripts/frr/setup.sh | 2 +- .../OPNsense/Quagga/{rc.conf.d => rc_conf_d}/+TARGETS | 0 .../OPNsense/Quagga/{rc.conf.d => rc_conf_d}/frr | 0 6 files changed, 6 insertions(+), 12 deletions(-) rename net/frr/src/opnsense/service/templates/OPNsense/Quagga/{rc.conf.d => rc_conf_d}/+TARGETS (100%) rename net/frr/src/opnsense/service/templates/OPNsense/Quagga/{rc.conf.d => rc_conf_d}/frr (100%) diff --git a/net/frr/src/etc/inc/plugins.inc.d/frr.inc b/net/frr/src/etc/inc/plugins.inc.d/frr.inc index d76ba8f8fd..6870a62da2 100644 --- a/net/frr/src/etc/inc/plugins.inc.d/frr.inc +++ b/net/frr/src/etc/inc/plugins.inc.d/frr.inc @@ -50,10 +50,10 @@ function frr_configure() function frr_configure_do($verbose = false) { $model = new \OPNsense\Quagga\General(); - if (!$model->enabled->isEmpty() || !$model->manual_config-isEmpty()) { + if (!$model->manual_config->isEmpty()) { return; } - //(new \OPNsense\Core\Backend())->configdpRun('template reload', ['OPNsense/Quagga']); + (new \OPNsense\Core\Backend())->configdpRun('template reload', ['OPNsense/Quagga']); } function frr_firewall($fw) diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php index 901b6ecfd2..9cca7f1784 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/ServiceController.php @@ -39,7 +39,7 @@ class ServiceController extends ApiMutableServiceControllerBase { protected static $internalServiceClass = '\OPNsense\Quagga\General'; // We intentionally only reload this template to allow manual_config for the templates - protected static $internalServiceTemplate = 'OPNsense/Quagga/rc.conf.d'; + protected static $internalServiceTemplate = 'OPNsense/Quagga/rc_conf_d'; protected static $internalServiceEnabled = 'enabled'; protected static $internalServiceName = 'quagga'; diff --git a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php index 0ff652e27b..52cadf4aa2 100644 --- a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php +++ b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php @@ -41,13 +41,7 @@ public function __construct() $this->internalIsBanner = true; $this->internalTitle = gettext('FRR manual configuration'); $this->internalScope = [ - '/ui/quagga/general', - '/ui/quagga/bgp', - '/ui/quagga/ospf', - '/ui/quagga/ospf6', - '/ui/quagga/rip', - '/ui/quagga/bfd', - '/ui/quagga/static_routes' + '/ui/quagga/*' ]; } @@ -55,7 +49,7 @@ public function collectStatus() { if (!(new General())->manual_config->isEmpty()) { $this->internalMessage = gettext( - 'Configuration file generation is disabled. Settings configured in the GUI may no longer affect the active FRR configuration.' + 'Manual config is enabled. Settings configured in the GUI may no longer affect the active FRR configuration.' ); $this->internalStatus = SystemStatusCode::NOTICE; } diff --git a/net/frr/src/opnsense/scripts/frr/setup.sh b/net/frr/src/opnsense/scripts/frr/setup.sh index cf6deb35d8..6b2b71e7f2 100755 --- a/net/frr/src/opnsense/scripts/frr/setup.sh +++ b/net/frr/src/opnsense/scripts/frr/setup.sh @@ -20,7 +20,7 @@ touch /var/log/frr.log chown $user:$group /var/log/frr.log # Reload templates here since we allow manual_config -/usr/local/sbin/pluginctl -c frr_sync +# /usr/local/sbin/pluginctl -c frr_sync # register Security Associations /usr/local/opnsense/scripts/frr/register_sas diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/+TARGETS rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/frr b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/frr similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc.conf.d/frr rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/frr From 8ecb91e6501e713b77a1133aa91f756b4ac3ae9b Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 23 Jun 2026 16:59:22 +0200 Subject: [PATCH 04/11] net/frr: Some options are in the rc file, some in zebra. Distinguish whats still possible to be changed in general options by hiding zebra relevant options --- .../OPNsense/Quagga/forms/general.xml | 6 +++++ .../app/views/OPNsense/Quagga/general.volt | 24 +++++++++++++++++++ net/frr/src/opnsense/scripts/frr/setup.sh | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml index b3f80005b2..95ad8038c1 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml @@ -3,12 +3,15 @@ general.enabled checkbox + This will activate the routing service. Without enabling it globally, none of the individual services will run. general.manual_config checkbox + + true Disable configuration file generation and manage the file (/usr/local/etc/frr/frr.conf) manually. @@ -22,12 +25,14 @@ general.enablecarp checkbox + This will activate the routing service only on the master device. The backup device will stop the service completely. general.enablesnmp checkbox + This will activate support for Net-SNMP AgentX. @@ -46,6 +51,7 @@ general.fwrules checkbox + Enable automatically created firewall rules, when additional policies are needed, disable this and define your own custom policies in the Firewall section. diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt index 0421762229..e385b4e0e0 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt @@ -45,6 +45,30 @@ POSSIBILITY OF SUCH DAMAGE. updateServiceControlUI('quagga'); } }); + + /* Manual configuration, hide all config elements except manual_config fields */ + $("#general\\.manual_config").change(function() { + let manual_config = $(this).is(':checked'); + + if (manual_config) { + if (!$("#show_advanced_frm_general_settings").hasClass('fa-toggle-on')) { + /* enforce advanced mode so the user notices the checkbox */ + $("#show_advanced_frm_general_settings").click(); + } + + $("#frm_general_settings").find('tr').each(function() { + if ($(this).find('.manual_config').length == 0) { + $(this).hide(); + } else { + $(this).show(); + } + }); + } else { + $("#frm_general_settings").find('tr').show(); + } + + $('.selectpicker').selectpicker('refresh'); + }); }); diff --git a/net/frr/src/opnsense/scripts/frr/setup.sh b/net/frr/src/opnsense/scripts/frr/setup.sh index 6b2b71e7f2..cf6deb35d8 100755 --- a/net/frr/src/opnsense/scripts/frr/setup.sh +++ b/net/frr/src/opnsense/scripts/frr/setup.sh @@ -20,7 +20,7 @@ touch /var/log/frr.log chown $user:$group /var/log/frr.log # Reload templates here since we allow manual_config -# /usr/local/sbin/pluginctl -c frr_sync +/usr/local/sbin/pluginctl -c frr_sync # register Security Associations /usr/local/opnsense/scripts/frr/register_sas From fd8327ae15b987683d5da40e4c2b2c00c07766ba Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 23 Jun 2026 17:03:30 +0200 Subject: [PATCH 05/11] net/frr: Make manual config banner text better --- .../library/OPNsense/System/Status/FrrManualConfigStatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php index 52cadf4aa2..ce78a15280 100644 --- a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php +++ b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php @@ -49,7 +49,7 @@ public function collectStatus() { if (!(new General())->manual_config->isEmpty()) { $this->internalMessage = gettext( - 'Manual config is enabled. Settings configured in the GUI may no longer affect the active FRR configuration.' + 'Manual FRR configuration is enabled. Configuration file generation is disabled. Settings configured here may no longer affect the active FRR configuration.' ); $this->internalStatus = SystemStatusCode::NOTICE; } From c344ee326281ec8c2df3893d79688586910fdbc9 Mon Sep 17 00:00:00 2001 From: Monviech Date: Tue, 23 Jun 2026 17:04:50 +0200 Subject: [PATCH 06/11] make sweep --- .../library/OPNsense/System/Status/FrrManualConfigStatus.php | 2 +- .../service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php index ce78a15280..c7fa7cff08 100644 --- a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php +++ b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php @@ -54,4 +54,4 @@ public function collectStatus() $this->internalStatus = SystemStatusCode::NOTICE; } } -} \ No newline at end of file +} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS index 979ada4d25..00a67700dc 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS @@ -1 +1 @@ -frr:/etc/rc.conf.d/frr \ No newline at end of file +frr:/etc/rc.conf.d/frr From c1ca8d8cad6e1781f91c1cb3c3d9c6e580067bef Mon Sep 17 00:00:00 2001 From: Monviech Date: Wed, 24 Jun 2026 14:15:18 +0200 Subject: [PATCH 07/11] net/frr: Reflect the individual daemon enabled sections into the general model --- .../OPNsense/Quagga/forms/general.xml | 7 ++ .../Quagga/FieldTypes/EnableDaemonField.php | 52 ++++++++++++++ .../app/models/OPNsense/Quagga/General.php | 68 ++++++++++++------- .../app/models/OPNsense/Quagga/General.xml | 12 ++++ 4 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml index 95ad8038c1..60cebb034a 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml @@ -6,6 +6,13 @@ This will activate the routing service. Without enabling it globally, none of the individual services will run. + + general.daemons + + select_multiple + + Shows which FRR daemons are enabled by the individual daemon pages. This remains relevant when manual configuration is enabled because the rc.d service wrapper is still generated. + general.manual_config diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php new file mode 100644 index 0000000000..4924186ecf --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php @@ -0,0 +1,52 @@ +object()->OPNsense->quagga ?? null; + $enabled = []; + + foreach (self::CONFIG_SECTIONS as $section) { + if (!empty($quagga?->{$section}?->enabled)) { + $enabled[] = $section; + } + } + + $this->setValue(implode(',', $enabled)); + + return parent::actionPostLoadingEvent(); + } +} \ No newline at end of file diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php index 187796732a..14acfa938c 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php @@ -1,35 +1,51 @@ object(); + $enabledSections = $this->daemons->getValues(); + + foreach (EnableDaemonField::CONFIG_SECTIONS as $section) { + $config->OPNsense->quagga->{$section}->enabled = + in_array($section, $enabledSections, true) ? '1' : '0'; + } + + return $result; + } } diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml index 705ca381fe..e25931315c 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml @@ -7,6 +7,18 @@ 0 Y + + N + Y + + + + + + + + + Y From 9493df728ac762b147f92252fd7b12993cd1d3be Mon Sep 17 00:00:00 2001 From: Monviech Date: Wed, 24 Jun 2026 14:30:34 +0200 Subject: [PATCH 08/11] not needed here --- .../app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php | 2 +- net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php index 4924186ecf..e18ff7db95 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/FieldTypes/EnableDaemonField.php @@ -49,4 +49,4 @@ protected function actionPostLoadingEvent() return parent::actionPostLoadingEvent(); } -} \ No newline at end of file +} diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml index e25931315c..a7709bee13 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml @@ -8,7 +8,6 @@ Y - N Y From 3ed50d809e1959007c17e22d4cb69a6ef18fc383 Mon Sep 17 00:00:00 2001 From: Monviech Date: Wed, 24 Jun 2026 18:57:00 +0200 Subject: [PATCH 09/11] net/frr: Simplify hiding logic in general.volt, make sweep --- .../OPNsense/Quagga/forms/general.xml | 11 +++------ .../app/models/OPNsense/Quagga/General.php | 20 ++++++++-------- .../app/views/OPNsense/Quagga/general.volt | 24 +++---------------- 3 files changed, 16 insertions(+), 39 deletions(-) diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml index 60cebb034a..c1b22a8bc4 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/general.xml @@ -3,62 +3,57 @@ general.enabled checkbox - This will activate the routing service. Without enabling it globally, none of the individual services will run. general.daemons select_multiple - Shows which FRR daemons are enabled by the individual daemon pages. This remains relevant when manual configuration is enabled because the rc.d service wrapper is still generated. general.manual_config checkbox - - true Disable configuration file generation and manage the file (/usr/local/etc/frr/frr.conf) manually. general.profile dropdown - true + Control FRR’s default profile: traditional reflects defaults adhering mostly to IETF standards or common practices in wide-area internet routing. datacenter reflects a single administrative domain with intradomain links using aggressive timers. general.enablecarp checkbox - This will activate the routing service only on the master device. The backup device will stop the service completely. general.enablesnmp checkbox - This will activate support for Net-SNMP AgentX. general.enablesyslog checkbox + Sends logs to the OPNsense integrated syslog-ng service. general.sysloglevel dropdown + This is the detail level of the log. A higher level means more data is logged. general.fwrules checkbox - Enable automatically created firewall rules, when additional policies are needed, disable this and define your own custom policies in the Firewall section. diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php index 14acfa938c..c4cfafd66b 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.php @@ -35,17 +35,17 @@ class General extends BaseModel { - public function serializeToConfig($validateFullModel = false, $disable_validation = false) - { - $result = parent::serializeToConfig($validateFullModel, $disable_validation); - $config = Config::getInstance()->object(); - $enabledSections = $this->daemons->getValues(); + public function serializeToConfig($validateFullModel = false, $disable_validation = false) + { + $result = parent::serializeToConfig($validateFullModel, $disable_validation); + $config = Config::getInstance()->object(); + $enabledSections = $this->daemons->getValues(); - foreach (EnableDaemonField::CONFIG_SECTIONS as $section) { - $config->OPNsense->quagga->{$section}->enabled = + foreach (EnableDaemonField::CONFIG_SECTIONS as $section) { + $config->OPNsense->quagga->{$section}->enabled = in_array($section, $enabledSections, true) ? '1' : '0'; - } + } - return $result; - } + return $result; + } } diff --git a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt index e385b4e0e0..7d4526f38d 100644 --- a/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt +++ b/net/frr/src/opnsense/mvc/app/views/OPNsense/Quagga/general.volt @@ -47,27 +47,9 @@ POSSIBILITY OF SUCH DAMAGE. }); /* Manual configuration, hide all config elements except manual_config fields */ - $("#general\\.manual_config").change(function() { - let manual_config = $(this).is(':checked'); - - if (manual_config) { - if (!$("#show_advanced_frm_general_settings").hasClass('fa-toggle-on')) { - /* enforce advanced mode so the user notices the checkbox */ - $("#show_advanced_frm_general_settings").click(); - } - - $("#frm_general_settings").find('tr').each(function() { - if ($(this).find('.manual_config').length == 0) { - $(this).hide(); - } else { - $(this).show(); - } - }); - } else { - $("#frm_general_settings").find('tr').show(); - } - - $('.selectpicker').selectpicker('refresh'); + $("#general\\.manual_config").on("change", function () { + $(".manual_config_hide").closest("tr").toggle(!$(this).is(":checked")); + $(".selectpicker").selectpicker("refresh"); }); }); From bc38525ad80ee391d32d80b1d243a0684671487b Mon Sep 17 00:00:00 2001 From: Monviech Date: Wed, 24 Jun 2026 19:13:11 +0200 Subject: [PATCH 10/11] net/frr: Hide daemon specific menu entries when manual_config is enabled --- .../System/Status/FrrManualConfigStatus.php | 57 ------------ .../app/models/OPNsense/Quagga/Menu/Menu.php | 86 +++++++++++++++++++ .../app/models/OPNsense/Quagga/Menu/Menu.xml | 6 -- 3 files changed, 86 insertions(+), 63 deletions(-) delete mode 100644 net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php create mode 100644 net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.php diff --git a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php b/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php deleted file mode 100644 index c7fa7cff08..0000000000 --- a/net/frr/src/opnsense/mvc/app/library/OPNsense/System/Status/FrrManualConfigStatus.php +++ /dev/null @@ -1,57 +0,0 @@ -internalPriority = 2; - $this->internalPersistent = true; - $this->internalIsBanner = true; - $this->internalTitle = gettext('FRR manual configuration'); - $this->internalScope = [ - '/ui/quagga/*' - ]; - } - - public function collectStatus() - { - if (!(new General())->manual_config->isEmpty()) { - $this->internalMessage = gettext( - 'Manual FRR configuration is enabled. Configuration file generation is disabled. Settings configured here may no longer affect the active FRR configuration.' - ); - $this->internalStatus = SystemStatusCode::NOTICE; - } - } -} diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.php b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.php new file mode 100644 index 0000000000..b593cb87c6 --- /dev/null +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/Menu/Menu.php @@ -0,0 +1,86 @@ +object(); + + if (!empty($config->OPNsense?->quagga?->general?->manual_config)) { + return; + } + + $this->appendItem('Routing', 'RIP', [ + 'url' => '/ui/quagga/rip/index', + 'fixedname' => gettext('RIP'), + 'cssClass' => 'fa fa-expand fa-fw', + 'order' => 10, + ]); + + $this->appendItem('Routing', 'OSPF', [ + 'url' => '/ui/quagga/ospf/index', + 'fixedname' => gettext('OSPF'), + 'cssClass' => 'fa fa-map fa-fw', + 'order' => 20, + ]); + + $this->appendItem('Routing', 'OSPFv3', [ + 'url' => '/ui/quagga/ospf6/index', + 'fixedname' => gettext('OSPFv3'), + 'cssClass' => 'fa fa-map fa-fw', + 'order' => 25, + ]); + + $this->appendItem('Routing', 'BGP', [ + 'url' => '/ui/quagga/bgp/index', + 'fixedname' => gettext('BGP'), + 'cssClass' => 'fa fa-globe fa-fw', + 'order' => 40, + ]); + + $this->appendItem('Routing', 'BFD', [ + 'url' => '/ui/quagga/bfd/index', + 'fixedname' => gettext('BFD'), + 'cssClass' => 'fa fa-exchange fa-fw', + 'order' => 50, + ]); + + $this->appendItem('Routing', 'STATIC', [ + 'url' => '/ui/quagga/static/index', + 'fixedname' => gettext('STATIC'), + 'cssClass' => 'fa fa-expand fa-fw', + 'order' => 60, + ]); + } +} 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 4241ec17da..d58b29aecc 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 @@ -1,12 +1,6 @@ - - - - - - From 2e2abac7a5b53e30f58fbcd684d2d91819bde78b Mon Sep 17 00:00:00 2001 From: Monviech Date: Wed, 24 Jun 2026 19:19:33 +0200 Subject: [PATCH 11/11] net/frr: Better force a migration for manual_config to ensure its always there --- .../opnsense/mvc/app/models/OPNsense/Quagga/General.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml index a7709bee13..3feba1959c 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/General.xml @@ -1,7 +1,7 @@ //OPNsense/quagga/general Quagga Routing configuration - 1.0.3 + 1.0.4 0 @@ -18,7 +18,10 @@ - + + 0 + Y + Y traditional