From 9ff548829c34a59d79cbf4e5c6b2f0ce2b459712 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Tue, 1 Feb 2022 08:05:41 +0100 Subject: [PATCH] Add CARP hook for mDNS repeater. (#2762) Only run the repeater on one node. Fixes #2595. --- .../src/etc/rc.syshook.d/carp/50-mdns | 74 +++++++++++++++++++ .../OPNsense/MDNSRepeater/forms/general.xml | 30 +++++--- .../OPNsense/MDNSRepeater/MDNSRepeater.xml | 6 +- .../OPNsense/MDNSRepeater/mdnsrepeater | 3 + 4 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 net/mdns-repeater/src/etc/rc.syshook.d/carp/50-mdns diff --git a/net/mdns-repeater/src/etc/rc.syshook.d/carp/50-mdns b/net/mdns-repeater/src/etc/rc.syshook.d/carp/50-mdns new file mode 100644 index 000000000..379f111b7 --- /dev/null +++ b/net/mdns-repeater/src/etc/rc.syshook.d/carp/50-mdns @@ -0,0 +1,74 @@ +#!/usr/local/bin/php + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require_once("config.inc"); +require_once("util.inc"); +require_once('interfaces.inc'); +require_once("plugins.inc.d/mdnsrepeater.inc"); + +$mdns_repeater = new \OPNsense\MDNSRepeater\MDNSRepeater(); +$mdns_repeater_carp_enabled = + (string)$mdns_repeater->enabled == '1' && + (string)$mdns_repeater->enablecarp == '1'; + +if ($mdns_repeater_carp_enabled) { + $subsystem = !empty($argv[1]) ? $argv[1] : ''; + $type = !empty($argv[2]) ? $argv[2] : ''; + + if ($type != 'MASTER' && $type != 'BACKUP') { + log_error("Carp '$type' event unknown from source '{$subsystem}'"); + exit(1); + } + + if (!strstr($subsystem, '@')) { + log_error("Carp '$type' event triggered from wrong source '{$subsystem}'"); + exit(1); + } + + list ($vhid, $iface) = explode('@', $subsystem); + + $friendly_interface = convert_real_interface_to_friendly_interface_name($iface); + $mdns_repeater_interfaces = explode(',', $mdns_repeater->interfaces); + if (!in_array($friendly_interface, $mdns_repeater_interfaces)) { + exit(0); + } + + $backend = new \OPNsense\Core\Backend(); + + switch ($type) { + case 'MASTER': + touch('/var/run/mdns-repeater.CARP_MASTER'); + $backend->configdRun('mdnsrepeater start'); + break; + case 'BACKUP': + @unlink('/var/run/mdns-repeater.CARP_MASTER'); + $backend->configdRun('mdnsrepeater stop'); + break; + } +} diff --git a/net/mdns-repeater/src/opnsense/mvc/app/controllers/OPNsense/MDNSRepeater/forms/general.xml b/net/mdns-repeater/src/opnsense/mvc/app/controllers/OPNsense/MDNSRepeater/forms/general.xml index e6a87140e..d7a8bea2c 100644 --- a/net/mdns-repeater/src/opnsense/mvc/app/controllers/OPNsense/MDNSRepeater/forms/general.xml +++ b/net/mdns-repeater/src/opnsense/mvc/app/controllers/OPNsense/MDNSRepeater/forms/general.xml @@ -1,14 +1,20 @@
- - mdnsrepeater.enabled - - checkbox - Enable the repeater. - - - mdnsrepeater.interfaces - - select_multiple - At least two interfaces must be selected. - + + mdnsrepeater.enabled + + checkbox + Enable the repeater. + + + mdnsrepeater.enablecarp + + checkbox + This will activate the repeater service only on the master device. + + + mdnsrepeater.interfaces + + select_multiple + At least two interfaces must be selected. +
diff --git a/net/mdns-repeater/src/opnsense/mvc/app/models/OPNsense/MDNSRepeater/MDNSRepeater.xml b/net/mdns-repeater/src/opnsense/mvc/app/models/OPNsense/MDNSRepeater/MDNSRepeater.xml index 245cc6ebe..b3affd176 100644 --- a/net/mdns-repeater/src/opnsense/mvc/app/models/OPNsense/MDNSRepeater/MDNSRepeater.xml +++ b/net/mdns-repeater/src/opnsense/mvc/app/models/OPNsense/MDNSRepeater/MDNSRepeater.xml @@ -1,12 +1,16 @@ //OPNsense/MDNSRepeater - 1.0.0 + 1.0.1 mdns-repeater settings 0 Y + + 0 + Y + lan Y diff --git a/net/mdns-repeater/src/opnsense/service/templates/OPNsense/MDNSRepeater/mdnsrepeater b/net/mdns-repeater/src/opnsense/service/templates/OPNsense/MDNSRepeater/mdnsrepeater index feb71084a..7ca779ca5 100644 --- a/net/mdns-repeater/src/opnsense/service/templates/OPNsense/MDNSRepeater/mdnsrepeater +++ b/net/mdns-repeater/src/opnsense/service/templates/OPNsense/MDNSRepeater/mdnsrepeater @@ -1,6 +1,9 @@ {% if helpers.exists('OPNsense.MDNSRepeater.enabled') and OPNsense.MDNSRepeater.enabled == '1' %} {% from 'OPNsense/Macros/interface.macro' import physical_interface %} mdns_repeater_enable="YES" +{% if helpers.exists('OPNsense.MDNSRepeater.enablecarp') and OPNsense.MDNSRepeater.enablecarp == '1' %} +required_files="/var/run/mdns-repeater.CARP_MASTER" +{% endif %} {% set osifnames = OPNsense.MDNSRepeater.interfaces.split(',') %} {% set interface_list=[] %} {% for i in osifnames %}