mirror of
https://github.com/opnsense/plugins.git
synced 2026-06-09 00:42:34 -04:00
Add CARP hook for mDNS repeater. (#2762)
Only run the repeater on one node. Fixes #2595.
This commit is contained in:
parent
6a7babcf20
commit
9ff548829c
4 changed files with 100 additions and 13 deletions
74
net/mdns-repeater/src/etc/rc.syshook.d/carp/50-mdns
Normal file
74
net/mdns-repeater/src/etc/rc.syshook.d/carp/50-mdns
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
#!/usr/local/bin/php
|
||||
<?php
|
||||
|
||||
/*
|
||||
Copyright (C) 2022 Markus Reiter <me@reitermark.us>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +1,20 @@
|
|||
<form>
|
||||
<field>
|
||||
<id>mdnsrepeater.enabled</id>
|
||||
<label>Enabled</label>
|
||||
<type>checkbox</type>
|
||||
<help>Enable the repeater.</help>
|
||||
</field>
|
||||
<field>
|
||||
<id>mdnsrepeater.interfaces</id>
|
||||
<label>Listen Interfaces</label>
|
||||
<type>select_multiple</type>
|
||||
<help>At least two interfaces must be selected.</help>
|
||||
</field>
|
||||
<field>
|
||||
<id>mdnsrepeater.enabled</id>
|
||||
<label>Enable</label>
|
||||
<type>checkbox</type>
|
||||
<help>Enable the repeater.</help>
|
||||
</field>
|
||||
<field>
|
||||
<id>mdnsrepeater.enablecarp</id>
|
||||
<label>Enable CARP Failover</label>
|
||||
<type>checkbox</type>
|
||||
<help>This will activate the repeater service only on the master device.</help>
|
||||
</field>
|
||||
<field>
|
||||
<id>mdnsrepeater.interfaces</id>
|
||||
<label>Listen Interfaces</label>
|
||||
<type>select_multiple</type>
|
||||
<help>At least two interfaces must be selected.</help>
|
||||
</field>
|
||||
</form>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,16 @@
|
|||
<model>
|
||||
<mount>//OPNsense/MDNSRepeater</mount>
|
||||
<version>1.0.0</version>
|
||||
<version>1.0.1</version>
|
||||
<description>mdns-repeater settings</description>
|
||||
<items>
|
||||
<enabled type="BooleanField">
|
||||
<default>0</default>
|
||||
<Required>Y</Required>
|
||||
</enabled>
|
||||
<enablecarp type="BooleanField">
|
||||
<default>0</default>
|
||||
<Required>Y</Required>
|
||||
</enablecarp>
|
||||
<interfaces type="InterfaceField">
|
||||
<default>lan</default>
|
||||
<Required>Y</Required>
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
|
|||
Loading…
Reference in a new issue