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 @@ - - - - - - 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..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 @@ -45,6 +45,12 @@ POSSIBILITY OF SUCH DAMAGE. updateServiceControlUI('quagga'); } }); + + /* Manual configuration, hide all config elements except manual_config fields */ + $("#general\\.manual_config").on("change", function () { + $(".manual_config_hide").closest("tr").toggle(!$(this).is(":checked")); + $(".selectpicker").selectpicker("refresh"); + }); }); 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..00a67700dc --- /dev/null +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/rc_conf_d/+TARGETS @@ -0,0 +1 @@ +frr:/etc/rc.conf.d/frr 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