diff options
Diffstat (limited to 'src/etc/rc.linkup')
-rwxr-xr-x | src/etc/rc.linkup | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/etc/rc.linkup b/src/etc/rc.linkup new file mode 100755 index 0000000..153cd49 --- /dev/null +++ b/src/etc/rc.linkup @@ -0,0 +1,165 @@ +#!/usr/local/bin/php-cgi -f +<?php +/* + rc.linkup - devd hotplug actions + part of pfSense + + Copyright (C) 2003-2005 Scott Ullrich <sullrich@gmail.com>. + 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. +*/ + +/* parse the configuration and include all functions used below */ +require_once("globals.inc"); +require_once("config.inc"); +require_once("filter.inc"); +require_once("shaper.inc"); +require_once("interfaces.inc"); + +if (platform_booting()) { + return; +} + +function handle_argument_group($iface, $argument2) { + global $config; + + if (!is_array($config['interfaces'][$iface])) { + log_error("Cannot find interface configuration for {$iface}"); + return; + } + + if (!isset($config['interfaces'][$iface]['enable'])) { + if (!platform_booting()) { + log_error("Linkup detected on disabled interface...Ignoring"); + } + return; + } + + $ipaddr = $config['interfaces'][$iface]['ipaddr']; + $ip6addr = $config['interfaces'][$iface]['ipaddrv6']; + $staticv4 = false; + if (empty($ipaddr)) { + $staticv4 = true; + } else { + $staticv4 = is_ipaddrv4($ipaddr); + } + $staticv6 = false; + if (empty($ip6addr)) { + $staticv6 = true; + } else { + $staticv6 = is_ipaddrv6($ip6addr); + } + if ($staticv4 === true && $staticv6 === true) { + $friendly = convert_friendly_interface_to_friendly_descr($iface); + log_error("Hotplug event detected for {$friendly}({$iface}) but ignoring since interface is configured with static IP ({$ipaddr} {$ip6addr})"); + interfaces_staticarp_configure($iface); + switch ($argument2) { + case 'start': + case 'up': + $iface = get_real_interface($iface); + /* NOTE: Do not generate event for OpenVPN since the daemon does that for us. */ + if (substr($iface, 0, 4) != "ovpn") { + send_event("interface newip {$iface}"); + } + break; + } + } else { + switch ($argument2) { + case "stop": + case "down": + log_error("DEVD Ethernet detached event for {$iface}"); + interface_bring_down($iface); + break; + case "start": + case "up": + log_error("DEVD Ethernet attached event for {$iface}"); + log_error("HOTPLUG: Configuring interface {$iface}"); + require_once("vpn.inc"); + require_once("captiveportal.inc"); + // Do not try to readd to bridge otherwise em(4) has problems + interface_configure($iface, true, true); + break; + } + } +} + +if (isset($_GET['interface'])) { + if (!empty($_GET['interface'])) { + $realiface = $_GET['interface']; + } + $action = $_GET['action']; +} else { + if ($argc < 3) { + log_error("HOTPLUG event: The required number of parameters not passed!"); + return; + } + $action = $argv[1]; + $realiface = $argv[2]; +} + +switch ($action) { + case "start": + case "stop": + break; + default: + log_error("HOTPLUG event: Action parameter ($action) passed is wrong - only start/stop/up/down are allowed!"); + return; + /* NOTREACHED */ + break; +} + +if (!empty($realiface)) { + if (substr($realiface, 0, 4) == 'ovpn') { + log_error("Ignoring link event for ovpn interface"); + return; + } + $rclinkuplock = lock("rclinkup{$realiface}", LOCK_EX); + $interface = convert_real_interface_to_friendly_interface_name($realiface); + if (!empty($interface)) { + handle_argument_group($interface, $action); + } + if ($action == 'start') { + /* Check if there is any child on this one as ppp types and trigger them */ + if (is_array($config['ppps']['ppp'])) { + foreach ($config['ppps']['ppp'] as $pppidx => $ppp) { + if ($ppp['type'] == 'ppp') { + continue; + } + $ports = explode(',', $ppp['ports']); + foreach ($ports as $pid => $parent_if) { + /* The loop here is because ppp types can have real and assigned interfaces as members */ + $tmpiface = get_real_interface($parent_if); + if ($tmpiface != $realiface) { + continue; + } + $tmpiface = convert_real_interface_to_friendly_interface_name($ppp['if']); + if (!empty($tmpiface)) { + interface_configure($tmpiface, true, true); + } + } + } + } + } + unlock($rclinkuplock); +} +?> |