getOffset($dhcp_lt);
$ts = $ts + $offset;
return strftime("%Y/%m/%d %I:%M:%S%p", $ts);
} else {
return strftime("%Y/%m/%d %H:%M:%S", $ts);
}
}
function remove_duplicate($array, $field) {
foreach ($array as $sub) {
$cmp[] = $sub[$field];
}
$unique = array_unique(array_reverse($cmp, true));
foreach ($unique as $k => $rien) {
$new[] = $array[$k];
}
return $new;
}
function parse_duid($duid_string) {
$parsed_duid = array();
for ($i = 0; $i < strlen($duid_string); $i++) {
$s = substr($duid_string, $i, 1);
if ($s == '\\') {
$n = substr($duid_string, $i+1, 1);
if (($n == '\\') || ($n == '"')) {
$parsed_duid[] = sprintf("%02x", ord($n));
} elseif (is_numeric($n)) {
$parsed_duid[] = sprintf("%02x", octdec(substr($duid_string, $i+1, 3)));
$i += 3;
}
} else {
$parsed_duid[] = sprintf("%02x", ord($s));
}
}
$iaid = array_slice($parsed_duid, 0, 4);
$duid = array_slice($parsed_duid, 4);
return array($iaid, $duid);
}
$awk = "/usr/bin/awk";
/* this pattern sticks comments into a single array item */
$cleanpattern = "'{ gsub(\"^#.*\", \"\");} { gsub(\"^server-duid.*\", \"\");} { gsub(\";$\", \"\"); print;}'";
/* We then split the leases file by } */
$splitpattern = "'BEGIN { RS=\"}\";} {for (i=1; i<=NF; i++) printf \"%s \", \$i; printf \"}\\n\";}'";
/* stuff the leases file in a proper format into a array by line */
exec("/bin/cat {$leasesfile} | {$awk} {$cleanpattern} | {$awk} {$splitpattern} | /usr/bin/grep '^ia-.. '", $leases_content);
$leases_count = count($leases_content);
exec("/usr/sbin/ndp -an", $rawdata);
$ndpdata = array();
foreach ($rawdata as $line) {
$elements = preg_split('/\s+/ ', $line);
if ($elements[1] != "(incomplete)") {
$ndpent = array();
$ip = trim(str_replace(array('(', ')'), '', $elements[0]));
$ndpent['mac'] = trim($elements[1]);
$ndpent['interface'] = trim($elements[2]);
$ndpdata[$ip] = $ndpent;
}
}
$pools = array();
$leases = array();
$prefixes = array();
$mappings = array();
$i = 0;
$l = 0;
$p = 0;
// Put everything together again
while ($i < $leases_count) {
$entry = array();
/* split the line by space */
$duid_split = array();
preg_match('/ia-.. "(.*)" { (.*)/ ', $leases_content[$i], $duid_split);
if (!empty($duid_split[1])) {
$iaid_duid = parse_duid($duid_split[1]);
$entry['iaid'] = hexdec(implode("", array_reverse($iaid_duid[0])));
$entry['duid'] = implode(":", $iaid_duid[1]);
$data = explode(" ", $duid_split[2]);
} else {
$data = explode(" ", $leases_content[$i]);
}
/* walk the fields */
$f = 0;
$fcount = count($data);
/* with less then 12 fields there is nothing useful */
if ($fcount < 12) {
$i++;
continue;
}
while ($f < $fcount) {
switch ($data[$f]) {
case "failover":
$pools[$p]['name'] = $data[$f+2];
$pools[$p]['mystate'] = $data[$f+7];
$pools[$p]['peerstate'] = $data[$f+14];
$pools[$p]['mydate'] = $data[$f+10];
$pools[$p]['mydate'] .= " " . $data[$f+11];
$pools[$p]['peerdate'] = $data[$f+17];
$pools[$p]['peerdate'] .= " " . $data[$f+18];
$p++;
$i++;
continue 3;
case "ia-pd":
$is_prefix = true;
case "ia-na":
$entry['iaid'] = $tmp_iaid;
$entry['duid'] = $tmp_duid;
if ($data[$f+1][0] == '"') {
$duid = "";
/* FIXME: This needs a safety belt to prevent an infinite loop */
while ($data[$f][strlen($data[$f])-1] != '"') {
$duid .= " " . $data[$f+1];
$f++;
}
$entry['duid'] = $duid;
} else {
$entry['duid'] = $data[$f+1];
}
$entry['type'] = "dynamic";
$f = $f+2;
break;
case "iaaddr":
$entry['ip'] = $data[$f+1];
$entry['type'] = "dynamic";
if (in_array($entry['ip'], array_keys($ndpdata))) {
$entry['online'] = 'online';
} else {
$entry['online'] = 'offline';
}
$f = $f+2;
break;
case "iaprefix":
$is_prefix = true;
$entry['prefix'] = $data[$f+1];
$entry['type'] = "dynamic";
$f = $f+2;
break;
case "starts":
$entry['start'] = $data[$f+2];
$entry['start'] .= " " . $data[$f+3];
$f = $f+3;
break;
case "ends":
$entry['end'] = $data[$f+2];
$entry['end'] .= " " . $data[$f+3];
$f = $f+3;
break;
case "tstp":
$f = $f+3;
break;
case "tsfp":
$f = $f+3;
break;
case "atsfp":
$f = $f+3;
break;
case "cltt":
$entry['start'] = $data[$f+2];
$entry['start'] .= " " . $data[$f+3];
$f = $f+3;
break;
case "binding":
switch ($data[$f+2]) {
case "active":
$entry['act'] = "active";
break;
case "free":
$entry['act'] = "expired";
$entry['online'] = "offline";
break;
case "backup":
$entry['act'] = "reserved";
$entry['online'] = "offline";
break;
case "released":
$entry['act'] = "released";
$entry['online'] = "offline";
}
$f = $f+1;
break;
case "next":
/* skip the next binding statement */
$f = $f+3;
break;
case "hardware":
$f = $f+2;
break;
case "client-hostname":
if ($data[$f+1] != "") {
$entry['hostname'] = preg_replace('/"/', '', $data[$f+1]);
} else {
$hostname = gethostbyaddr($entry['ip']);
if ($hostname != "") {
$entry['hostname'] = $hostname;
}
}
$f = $f+1;
break;
case "uid":
$f = $f+1;
break;
}
$f++;
}
if ($is_prefix) {
$prefixes[] = $entry;
} else {
$leases[] = $entry;
$mappings[$entry['iaid'] . $entry['duid']] = $entry['ip'];
}
$l++;
$i++;
$is_prefix = false;
}
if (count($leases) > 0) {
$leases = remove_duplicate($leases, "ip");
}
if (count($prefixes) > 0) {
$prefixes = remove_duplicate($prefixes, "prefix");
}
if (count($pools) > 0) {
$pools = remove_duplicate($pools, "name");
asort($pools);
}
foreach ($config['interfaces'] as $ifname => $ifarr) {
if (is_array($config['dhcpdv6'][$ifname]) &&
is_array($config['dhcpdv6'][$ifname]['staticmap'])) {
foreach ($config['dhcpdv6'][$ifname]['staticmap'] as $static) {
$slease = array();
$slease['ip'] = $static['ipaddrv6'];
$slease['type'] = "static";
$slease['duid'] = $static['duid'];
$slease['start'] = "";
$slease['end'] = "";
$slease['hostname'] = htmlentities($static['hostname']);
$slease['act'] = "static";
if (in_array($slease['ip'], array_keys($ndpdata))) {
$slease['online'] = 'online';
} else {
$slease['online'] = 'offline';
}
$leases[] = $slease;
}
}
}
if ($_GET['order']) {
usort($leases, "leasecmp");
}
/* only print pool status when we have one */
if (count($pools) > 0) {
?>
=gettext('Pool status')?>
=gettext("Failover Group")?> |
=gettext("My State")?> |
=gettext("Since")?> |
=gettext("Peer State")?> |
=gettext("Since")?> |
=$data['name']?> |
=$data['mystate']?> |
=adjust_gmt($data['mydate'])?> |
=$data['peerstate']?> |
=adjust_gmt($data['peerdate'])?> |
'. gettext("No leases file found. Is the DHCP server active?") .'';
}
?>
=gettext('Delegated Prefixes')?>
=gettext("IPv6 Prefix")?> |
=gettext("IAID")?> |
=gettext("DUID")?> |
=gettext("Start")?> |
=gettext("End")?> |
=gettext("State")?> |
$dhcpifconf) {
if (is_array($dhcpifconf['staticmap'])) {
foreach ($dhcpifconf['staticmap'] as $staticent) {
if ($data['ip'] == $staticent['ipaddr']) {
$data['if'] = $dhcpif;
break;
}
}
}
/* exit as soon as we have an interface */
if ($data['if'] != "") {
break;
}
}
} else {
$data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
}
{
$dip = "";
}
?>
|
=$data['prefix']?>
=gettext('Routed To')?>: =$mappings[$data['iaid'] . $data['duid']]?>
|
=$data['iaid']?> |
=$data['duid']?> |
=adjust_gmt($data['start'])?> |
=adjust_gmt($data['end'])?> |
n/a |
n/a |
=$data['act']?> |
=gettext("Show active and static leases only")?>
=gettext("Show all configured leases")?>