diff options
Diffstat (limited to 'src/usr/local/sbin/prefixes.php')
-rw-r--r-- | src/usr/local/sbin/prefixes.php | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/usr/local/sbin/prefixes.php b/src/usr/local/sbin/prefixes.php new file mode 100644 index 0000000..118bd9e --- /dev/null +++ b/src/usr/local/sbin/prefixes.php @@ -0,0 +1,93 @@ +<?php + +$leases_file = "/var/dhcpd/var/db/dhcpd6.leases"; +if (!file_exists($leases_file)) { + exit(1); +} + +$fd = fopen($leases_file, 'r'); + +$duid_arr = array(); +while (( $line = fgets($fd, 4096)) !== false) { + // echo "$line"; + if (preg_match("/^(ia-[np][ad])[ ]+\"(.*?)\"/i", $line, $duidmatch)) { + $type = $duidmatch[1]; + $duid = $duidmatch[2]; + continue; + } + + /* is it active? otherwise just discard */ + if (preg_match("/binding state active/i", $line, $activematch)) { + $active = true; + continue; + } + + if (preg_match("/iaaddr[ ]+([0-9a-f:]+)[ ]+/i", $line, $addressmatch)) { + $ia_na = $addressmatch[1]; + continue; + } + + if (preg_match("/iaprefix[ ]+([0-9a-f:\/]+)[ ]+/i", $line, $prefixmatch)) { + $ia_pd = $prefixmatch[1]; + continue; + } + + /* closing bracket */ + if (preg_match("/^}/i", $line)) { + switch ($type) { + case "ia-na": + $duid_arr[$duid][$type] = $ia_na; + break; + case "ia-pd": + $duid_arr[$duid][$type] = $ia_pd; + break; + } + unset($type); + unset($duid); + unset($active); + unset($ia_na); + unset($ia_pd); + continue; + } +} +fclose($fd); + +$routes = array(); +foreach ($duid_arr as $entry) { + if (!empty($entry['ia-pd'])) { + $routes[$entry['ia-na']] = $entry['ia-pd']; + } +} + +// echo "add routes\n"; +if (count($routes) > 0) { + foreach ($routes as $address => $prefix) { + echo "/sbin/route change -inet6 {$prefix} {$address}\n"; + } +} + +/* get clog from dhcpd */ +$dhcpdlogfile = "/var/log/dhcpd.log"; +$expires = array(); +if (file_exists($dhcpdlogfile)) { + $fd = popen("clog $dhcpdlogfile", 'r'); + while (($line = fgets($fd)) !== false) { + //echo $line; + if (preg_match("/releases[ ]+prefix[ ]+([0-9a-f:]+\/[0-9]+)/i", $line, $expire)) { + if (in_array($expire[1], $routes)) { + continue; + } + $expires[$expire[1]] = $expire[1]; + } + } + pclose($fd); +} + +// echo "remove routes\n"; +if (count($expires) > 0) { + foreach ($expires as $prefix) { + echo "/sbin/route delete -inet6 {$prefix['prefix']}\n"; + } +} + +?> |