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; // Translate these once so we don't do it over and over in the loops below. $online_string = gettext("online"); $offline_string = gettext("offline"); $active_string = gettext("active"); $expired_string = gettext("expired"); $reserved_string = gettext("reserved"); $released_string = gettext("released"); $dynamic_string = gettext("dynamic"); $static_string = gettext("static"); // 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_string; $f = $f+2; break; case "iaaddr": $entry['ip'] = $data[$f+1]; $entry['type'] = $dynamic_string; if (in_array($entry['ip'], array_keys($ndpdata))) { $entry['online'] = $online_string; } else { $entry['online'] = $offline_string; } $f = $f+2; break; case "iaprefix": $is_prefix = true; $entry['prefix'] = $data[$f+1]; $entry['type'] = $dynamic_string; $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_string; break; case "free": $entry['act'] = $expired_string; $entry['online'] = $offline_string; break; case "backup": $entry['act'] = $reserved_string; $entry['online'] = $offline_string; break; case "released": $entry['act'] = $released_string; $entry['online'] = $offline_string; } $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_string; if (in_array($slease['ip'], array_keys($ndpdata))) { $slease['online'] = $online_string; } else { $slease['online'] = $offline_string; } $leases[] = $slease; } } } if ($_GET['order']) { usort($leases, "leasecmp"); } /* only print pool status when we have one */ if (count($pools) > 0) { ?>

' . gettext("No leases file found. Is the DHCP server active?") . ''; } ?>

$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'])); } $mac = trim($ndpdata[$data['ip']]['mac']); $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]); ?>
() n/a n/a " href="services_dhcpv6_edit.php?if=&duid=&hostname="> " href="services_wol_edit.php?if=&mac=&descr=">

$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 = ""; } ?>

:
n/a n/a