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..6870a62da2 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->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..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
@@ -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..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
@@ -5,11 +5,23 @@
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
+ 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.
@@ -28,12 +40,14 @@
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.
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..e18ff7db95
--- /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();
+ }
+}
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..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
@@ -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 6e9507e4b9..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,12 +1,27 @@
//OPNsense/quagga/general
Quagga Routing configuration
- 1.0.3
+ 1.0.4
0
Y
+
+ Y
+
+
+
+
+
+
+
+
+
+
+ 0
+ Y
+
Y
traditional
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 @@