diff --git a/net/frr/src/etc/rc.carp_service_status.d/carp_frr_ospf b/net/frr/src/etc/rc.carp_service_status.d/carp_frr_ospf new file mode 100755 index 000000000..91d761ef8 --- /dev/null +++ b/net/frr/src/etc/rc.carp_service_status.d/carp_frr_ospf @@ -0,0 +1,25 @@ +#!/bin/sh +if [ -f /etc/rc.conf.d/frr ]; then + . /etc/rc.conf.d/frr +fi + +if [ "$frr_enable" == "YES" ] && (`echo "$frr_daemons" | /usr/bin/grep -F -q -w "ospfd"`) && + (`echo "$frr_carp_demote" | /usr/bin/grep -F -q -w "ospfd"`) ; then + # OSPF enabled + OSPF_NEIGHBOR=`echo "show ip ospf neighbor" | /usr/local/bin/vtysh 2>&1` IFS= + if [ "$?" -eq 0 ]; then + # running, check if we can find any neighbors + IFS= + neighbors_count=`echo $OSPF_NEIGHBOR | grep "Full/" | wc -l` + unset IFS + if [ "$neighbors_count" -eq 0 ]; then + # no neighbors in state Full/* found + exit 2 + else + exit 0 + fi + else + # not running + exit 1 + fi +fi diff --git a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml index 825d5b638..0305f5891 100644 --- a/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml +++ b/net/frr/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/ospf.xml @@ -5,6 +5,16 @@ checkbox This will activate the OSPF service if routing protocols are enabled in "General". + + ospf.carp_demote + + checkbox + + Register CARP status monitor, when no neighbors are found, consider this node less attractive. + This feature needs syslog enabled using "Debugging" logging to catch all relevant status events. + This option is not compatible with "Enable CARP Failover". + + ospf.routerid diff --git a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml index 187742e4b..b15b9f2e4 100644 --- a/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml +++ b/net/frr/src/opnsense/mvc/app/models/OPNsense/Quagga/OSPF.xml @@ -7,6 +7,10 @@ 0 Y + + 0 + Y + N diff --git a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS index eeb0f1e51..b01f28018 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/+TARGETS @@ -5,3 +5,4 @@ ripd.conf:/usr/local/etc/frr/ripd.conf frr:/etc/rc.conf.d/frr zebra.conf:/usr/local/etc/frr/zebra.conf vtysh.conf:/usr/local/etc/frr/vtysh.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/frr b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr index bb4d09766..e2b5da14d 100644 --- a/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/frr @@ -11,6 +11,7 @@ if helpers.exists('OPNsense.quagga.bgp.enabled') and OPNsense.quagga.bgp.enabled if helpers.exists('OPNsense.quagga.ospf6.enabled') and OPNsense.quagga.ospf6.enabled == '1' %} ospf6d{% endif %}{% if helpers.exists('OPNsense.quagga.ripng.enabled') and OPNsense.quagga.ripng.enabled == '1' %} ripngd{% endif %}{% if helpers.exists('OPNsense.quagga.isis.enabled') and OPNsense.quagga.isis.enabled == '1' %} isisd{% endif %}" +frr_carp_demote="{% if not helpers.empty('OPNsense.quagga.ospf.carp_demote') %} ospfd{% endif %}" {% else %} frr_enable="NO" {% endif %} 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/syslog-ng-frr-events.conf new file mode 100644 index 000000000..9644313b8 --- /dev/null +++ b/net/frr/src/opnsense/service/templates/OPNsense/Quagga/syslog-ng-frr-events.conf @@ -0,0 +1,23 @@ +{% if not helpers.empty('OPNsense.quagga.general.enabled') + and not helpers.empty('OPNsense.quagga.ospf.enabled') + and not helpers.empty('OPNsense.quagga.ospf.carp_demote') %} +destination d_frr_event { + program("/usr/local/sbin/configctl -e -t 0.5 interface update carp service_status"); +}; + +filter f_frr_ospf { + program("ospfd") and ( + ( + level("info") or level("notice") + ) or ( + level("debug") and message(".*EXT .*ospf_ext_link_ism_change.*") + ) + ); +}; + +log { + source(s_all); + filter(f_frr_ospf); + destination(d_frr_event); +}; +{% endif %}