summaryrefslogtreecommitdiffstats
path: root/usr/local
diff options
context:
space:
mode:
authorDavid Wood <david@wood2.org.uk>2015-10-11 17:05:40 +0100
committerDavid Wood <david@wood2.org.uk>2015-10-11 17:05:40 +0100
commitc3485245640f29c0eabc40aebad5ec6dfe54cf15 (patch)
tree4a3173297c0d42da6a9a49bf9d9d632847740c32 /usr/local
parent8ed4a1392990544e6dc7731ad9ac474dbc2f0bb1 (diff)
downloadpfsense-c3485245640f29c0eabc40aebad5ec6dfe54cf15.zip
pfsense-c3485245640f29c0eabc40aebad5ec6dfe54cf15.tar.gz
Add /usr/local/sbin/ppp-ipv6 helper script
/usr/local/sbin/ppp-ipv6 <real interface> up|down Interface using SLAAC or DHCP6 going down: * bring down dhcp6c if it is running * disable router advertisements (and therefore SLAAC) * remove any autoconfigured IPv6 addresses Interface using SLAAC or DHCP6 coming up: * call interface_dhcpv6_configure() if dhcp6c not running and router advertisements off interface_dhcpv6_configure() will enable router advertisements, configure rtsold and dhcp6c, then set rtsold to prime dhcp6c as required.
Diffstat (limited to 'usr/local')
-rwxr-xr-xusr/local/sbin/ppp-ipv6123
1 files changed, 123 insertions, 0 deletions
diff --git a/usr/local/sbin/ppp-ipv6 b/usr/local/sbin/ppp-ipv6
new file mode 100755
index 0000000..a05a4c2
--- /dev/null
+++ b/usr/local/sbin/ppp-ipv6
@@ -0,0 +1,123 @@
+#!/usr/local/bin/php -f
+<?php
+/*
+ ppp-ipv6
+
+ PPP IPv6 helper
+
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/local/sbin/dhcp6c
+
+*/
+
+require_once("globals.inc");
+require_once("interfaces.inc");
+
+function interface_ipv6_lower($interface_real) {
+ global $g, $config;
+
+ if (!empty($interface_real)) {
+ $interface = convert_real_interface_to_friendly_interface_name($interface_real);
+
+ if (!empty($interface) && is_array($config['interfaces'][$interface]) && interface_isppp_type($interface)) {
+ $ifcfg = $config['interfaces'][$interface];
+
+ if (!empty($ifcfg['ipaddrv6'])) {
+ switch ($ifcfg['ipaddrv6']) {
+ case 'slaac':
+ case 'dhcp6':
+ // bring down dhcp6c if it is running
+ $pidv6 = find_dhcp6c_process($interface_real);
+ if ($pidv6) {
+ posix_kill($pidv6, SIGTERM);
+ sleep(3);
+ }
+ unlink_if_exists("{$g['varetc_path']}/dhcp6c_{$interface}.conf");
+
+ // disable router advertisements (and therefore SLAAC)
+ mwexec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6 -accept_rtadv");
+
+ // remove any autoconfigured IPv6 addresses
+ exec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6", $ifconfig_output);
+ foreach ($ifconfig_output as $output) {
+ if (preg_match('{ \A \s+ inet6 \s+ (\S+) .* autoconf .* \Z}xmsi', $output, $matches)) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6 " . escapeshellarg($matches[1]) . " delete");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+}
+
+function interface_ipv6_raise($interface_real) {
+ global $config;
+
+ if (!empty($interface_real)) {
+ $interface = convert_real_interface_to_friendly_interface_name($interface_real);
+
+ if (!empty($interface) && is_array($config['interfaces'][$interface]) && interface_isppp_type($interface)) {
+ $ifcfg = $config['interfaces'][$interface];
+
+ if (!empty($ifcfg['ipaddrv6'])) {
+ switch ($ifcfg['ipaddrv6']) {
+ case 'slaac':
+ case 'dhcp6':
+ $pidv6 = find_dhcp6c_process($interface_real);
+ if (empty($pidv6)) {
+ // only fire if router advertisements off
+ // (if router advertisements are on, rtsold might be primed to fire dhcp6c already)
+ exec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6", $ifconfig_output);
+ $start = true;
+ foreach ($ifconfig_output as $output) {
+ if (preg_match('{ \A .* ACCEPT_RTADV .* \Z}xmsi', $output)) {
+ $start = false;
+ break;
+ }
+ }
+ if ($start) {
+ interface_dhcpv6_configure($interface, $ifcfg);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+}
+
+// main entry point
+if ($argc != 3) {
+ goto error;
+}
+
+$interface_real = trim($argv[1], " \n\t");
+if (empty($interface_real)) {
+ goto error;
+}
+
+switch (strtolower($argv[2])) {
+ case 'up':
+ interface_ipv6_raise($interface_real);
+ break;
+ case 'down':
+ interface_ipv6_lower($interface_real);
+ break;
+ default:
+ goto error;
+ break;
+}
+
+exit(0);
+
+error:
+if (!empty($argv[0])) {
+ echo("Usage: " . substr(strrchr('/' . $argv[0], '/'), 1) . " <PPP interface> up|down\n");
+}
+exit(1);
+
+?>
OpenPOWER on IntegriCloud