Commit 79b87986 authored by Franco Fichtner's avatar Franco Fichtner

igmpproxy: pluginify

parent 30122eae
......@@ -48,6 +48,7 @@
/usr/local/etc/inc/plugins.inc.d/if_ipsec.inc
/usr/local/etc/inc/plugins.inc.d/if_legacy_opt.inc
/usr/local/etc/inc/plugins.inc.d/if_openvpn.inc
/usr/local/etc/inc/plugins.inc.d/igmpproxy.inc
/usr/local/etc/inc/plugins.inc.d/miniupnpd.inc
/usr/local/etc/inc/plugins.inc.d/relayd.inc
/usr/local/etc/inc/plugins.inc.d/relayd/dns.proto
......
<?php
/*
Copyright (C) 2014-2016 Franco Fichtner <franco@opnsense.org>
Copyright (C) 2010 Ermal Luci
Copyright (C) 2005-2006 Colin Smith <ethethlay@gmail.com>
Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>
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.
*/
function igmpproxy_enabled()
{
global $config;
return isset($config['igmpproxy']['igmpentry']);
}
function igmpproxy_services()
{
$services = array();
if (!igmpproxy_enabled()) {
return $services;
}
$pconfig = array();
$pconfig['name'] = 'igmpproxy';
$pconfig['description'] = gettext('IGMP Proxy');
$pconfig['php']['restart'] = array('igmpproxy_configure_do');
$pconfig['php']['start'] = array('igmpproxy_configure_do');
$services[] = $pconfig;
return $services;
}
function igmpproxy_configure()
{
return array('igmpproxy_configure_do');
}
function igmpproxy_configure_do($verbose = false)
{
global $config;
killbyname('igmpproxy');
if (!igmpproxy_enabled()) {
return;
}
if ($verbose) {
echo 'Starting IGMP Proxy...';
flush();
}
$iflist = get_configured_interface_list();
$igmpconf = <<<EOD
##------------------------------------------------------
## Enable Quickleave mode (Sends Leave instantly)
##------------------------------------------------------
quickleave
EOD;
foreach ($config['igmpproxy']['igmpentry'] as $igmpcf) {
unset($iflist[$igmpcf['ifname']]);
$realif = get_real_interface($igmpcf['ifname']);
if (empty($igmpcf['threshold'])) {
$threshld = 1;
} else {
$threshld = $igmpcf['threshold'];
}
$igmpconf .= "phyint {$realif} {$igmpcf['type']} ratelimit 0 threshold {$threshld}\n";
if ($igmpcf['address'] <> "") {
$item = explode(" ", $igmpcf['address']);
foreach($item as $iww) {
$igmpconf .= "altnet {$iww}\n";
}
}
$igmpconf .= "\n";
}
foreach ($iflist as $ifn) {
$realif = get_real_interface($ifn);
$igmpconf .= "phyint {$realif} disabled\n";
}
$igmpconf .= "\n";
file_put_contents('/usr/local/etc/igmpproxy.conf', $igmpconf);
mwexec('/usr/local/etc/rc.d/igmpproxy onestart');
if ($verbose) {
print "done.\n";
}
}
......@@ -41,6 +41,7 @@
require_once('dyndns.class');
require_once('plugins.inc.d/bsnmpd.inc');
require_once('plugins.inc.d/dnsmasq.inc');
require_once('plugins.inc.d/igmpproxy.inc');
require_once('plugins.inc.d/relayd.inc');
require_once('plugins.inc.d/unbound.inc');
......@@ -1321,65 +1322,6 @@ EOD;
}
}
function services_igmpproxy_configure($verbose = false)
{
global $config;
/* kill any running igmpproxy */
killbyname("igmpproxy");
if (!isset($config['igmpproxy']['igmpentry']) || !is_array($config['igmpproxy']['igmpentry']) || (count($config['igmpproxy']['igmpentry']) == 0)) {
return;
}
if ($verbose) {
echo 'Starting IGMP Proxy...';
flush();
}
$iflist = get_configured_interface_list();
$igmpconf = <<<EOD
##------------------------------------------------------
## Enable Quickleave mode (Sends Leave instantly)
##------------------------------------------------------
quickleave
EOD;
foreach ($config['igmpproxy']['igmpentry'] as $igmpcf) {
unset($iflist[$igmpcf['ifname']]);
$realif = get_real_interface($igmpcf['ifname']);
if (empty($igmpcf['threshold'])) {
$threshld = 1;
} else {
$threshld = $igmpcf['threshold'];
}
$igmpconf .= "phyint {$realif} {$igmpcf['type']} ratelimit 0 threshold {$threshld}\n";
if ($igmpcf['address'] <> "") {
$item = explode(" ", $igmpcf['address']);
foreach($item as $iww) {
$igmpconf .= "altnet {$iww}\n";
}
}
$igmpconf .= "\n";
}
foreach ($iflist as $ifn) {
$realif = get_real_interface($ifn);
$igmpconf .= "phyint {$realif} disabled\n";
}
$igmpconf .= "\n";
@file_put_contents('/usr/local/etc/igmpproxy.conf', $igmpconf);
mwexec('/usr/local/etc/rc.d/igmpproxy onestart');
if ($verbose) {
print "done.\n";
}
}
function services_dhcrelay_configure($verbose = false)
{
global $config;
......@@ -1984,15 +1926,6 @@ function services_get()
$services[] = $pconfig;
}
if (isset($config['igmpproxy']['igmpentry']) && is_array($config['igmpproxy']['igmpentry']) && (count($config['igmpproxy']['igmpentry']) > 0)) {
$pconfig = array();
$pconfig['name'] = "igmpproxy";
$pconfig['description'] = gettext("IGMP proxy");
$pconfig['php']['restart'] = array('services_igmpproxy_configure');
$pconfig['php']['start'] = array('services_igmpproxy_configure');
$services[] = $pconfig;
}
if (isset($config['system']['ssh']['enabled'])) {
$pconfig = array();
$pconfig['name'] = 'sshd';
......
......@@ -211,9 +211,6 @@ if ($kern_hz == '1000') {
set_single_sysctl('net.inet.tcp.rexmit_min' , '30');
}
/* start the igmpproxy daemon */
services_igmpproxy_configure(true);
/* If powerd is enabled, lets launch it */
activate_powerd();
......
......@@ -211,11 +211,9 @@ if (!is_ipaddr($oldip) || $curwanip != $oldip || !is_ipaddrv4($config['interface
/* reload graphing functions */
enable_rrd_graphing();
/* reload igmpproxy */
services_igmpproxy_configure();
/* restart snmp */
/* XXX reload plugins */
bsnmpd_configure_do();
igmpproxy_configure_do();
/* reconfigure ntpd */
system_ntp_configure(false);
......
......@@ -158,8 +158,9 @@ if (substr($interface_real, 0, 4) != "ovpn")
/* reload graphing functions */
enable_rrd_graphing();
/* reload igmpproxy */
services_igmpproxy_configure();
/* XXX reload plugins */
bsnmpd_configure_do();
igmpproxy_configure_do();
/* reconfigure ntpd */
system_ntp_configure(false);
......@@ -523,8 +523,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
}
}
}
/* restart snmp so that it binds to correct address */
/* XXX restart plugins o that the bind to correct address */
bsnmpd_configure_do();
igmpproxy_configure_do();
/* sync filter configuration */
setup_gateways_monitor();
filter_configure();
......
......@@ -60,7 +60,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
exit;
} elseif (!empty($_POST['apply'])) {
/* reload all components that use igmpproxy */
relayd_configure_do();
filter_configure();
clear_subsystem_dirty('loadbalancer');
......
......@@ -49,7 +49,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
exit;
} else {
/* reload all components that use igmpproxy */
services_igmpproxy_configure();
igmpproxy_configure_do();
clear_subsystem_dirty('igmpproxy');
header(url_safe('Location: /services_igmpproxy.php'));
exit;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment