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..87c6edae17 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/Config']); +} + function frr_firewall($fw) { global $config; 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/conf/actions.d/actions_quagga.conf b/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf index dfac46b1bd..956860ba84 100644 --- a/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf +++ b/net/frr/src/opnsense/service/conf/actions.d/actions_quagga.conf @@ -18,7 +18,7 @@ message:restarting frr description:Restart FRR [reload] -command:service frr reload; /usr/local/opnsense/scripts/frr/carp_event_handler +command:/usr/local/opnsense/scripts/frr/setup.sh; /usr/local/etc/rc.d/frr reload; /usr/local/opnsense/scripts/frr/carp_event_handler parameters: type:script message:reloading frr diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS index 9ee342bb4c..00a67700dc 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS @@ -1,7 +1 @@ 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 -ospfd_carp.conf:/usr/local/etc/frr/ospfd_carp.conf -sa_policies.conf:/usr/local/etc/frr/sa_policies.conf -syslog-ng-frr-events.conf:/usr/local/etc/syslog-ng.conf.d/frr-events.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/+TARGETS new file mode 100644 index 0000000000..d7cd39de17 --- /dev/null +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/+TARGETS @@ -0,0 +1,6 @@ +!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 +!ospfd_carp.conf:/usr/local/etc/frr/ospfd_carp.conf +!sa_policies.conf:/usr/local/etc/frr/sa_policies.conf +!syslog-ng-frr-events.conf:/usr/local/etc/syslog-ng.conf.d/frr-events.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bfdd.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/bfdd.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bfdd.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bgpd.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/bgpd.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/frr.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/frr.conf new file mode 100644 index 0000000000..cb8dc1b43d --- /dev/null +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/frr.conf @@ -0,0 +1,8 @@ +{# Main configuration file #} +{% include "OPNsense/Quagga/Config/zebra.conf" %} +{% include "OPNsense/Quagga/Config/ripd.conf" %} +{% include "OPNsense/Quagga/Config/ospfd.conf" %} +{% include "OPNsense/Quagga/Config/ospf6d.conf" %} +{% include "OPNsense/Quagga/Config/bgpd.conf" %} +{% include "OPNsense/Quagga/Config/bfdd.conf" %} +{% include "OPNsense/Quagga/Config/staticd.conf" %} diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospf6d.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospf6d.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d_carp.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospf6d_carp.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospf6d_carp.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospf6d_carp.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospfd.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospfd.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd_carp.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospfd_carp.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/ospfd_carp.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ospfd_carp.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/ripd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ripd.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/ripd.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/ripd.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/sa_policies.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/sa_policies.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/sa_policies.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/sa_policies.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/staticd.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/staticd.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/staticd.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/staticd.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/syslog-ng-frr-events.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/syslog-ng-frr-events.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/syslog-ng-frr-events.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/syslog-ng-frr-events.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/vtysh.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/vtysh.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/vtysh.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/vtysh.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/zebra.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/zebra.conf similarity index 100% rename from net/frr/src/opnsense/service/templates/OPNsense/Quagga/zebra.conf rename to net/frr/src/opnsense/service/templates/OPNsense/Quagga/Config/zebra.conf diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr.conf b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr.conf deleted file mode 100644 index b8da1a348f..0000000000 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr.conf +++ /dev/null @@ -1,8 +0,0 @@ -{# Main configuration file #} -{% include "OPNsense/Quagga/zebra.conf" %} -{% include "OPNsense/Quagga/ripd.conf" %} -{% include "OPNsense/Quagga/ospfd.conf" %} -{% include "OPNsense/Quagga/ospf6d.conf" %} -{% include "OPNsense/Quagga/bgpd.conf" %} -{% include "OPNsense/Quagga/bfdd.conf" %} -{% include "OPNsense/Quagga/staticd.conf" %}