$rien) {
$new[] = $array[$k];
}
return $new;
}
$awk = "/usr/bin/awk";
/* this pattern sticks comments into a single array item */
$cleanpattern = "'{ gsub(\"#.*\", \"\");} { 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}", $leases_content);
$leases_count = count($leases_content);
exec("/usr/sbin/arp -an", $rawdata);
$arpdata_ip = array();
$arpdata_mac = array();
foreach ($rawdata as $line) {
$elements = explode(' ', $line);
if ($elements[3] != "(incomplete)") {
$arpent = array();
$arpdata_ip[] = trim(str_replace(array('(', ')'), '', $elements[1]));
$arpdata_mac[] = strtolower(trim($elements[3]));
}
}
unset($rawdata);
$pools = array();
$leases = array();
$i = 0;
$l = 0;
$p = 0;
// Put everything together again
foreach ($leases_content as $lease) {
/* split the line by space */
$data = explode(" ", $lease);
/* walk the fields */
$f = 0;
$fcount = count($data);
/* with less than 20 fields there is nothing useful */
if ($fcount < 20) {
$i++;
continue;
}
while ($f < $fcount) {
switch ($data[$f]) {
case "failover":
$pools[$p]['name'] = trim($data[$f+2], '"');
$pools[$p]['name'] = "{$pools[$p]['name']} (" . convert_friendly_interface_to_friendly_descr(substr($pools[$p]['name'], 5)) . ")";
$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 "lease":
$leases[$l]['ip'] = $data[$f+1];
$leases[$l]['type'] = "dynamic";
$f = $f+2;
break;
case "starts":
$leases[$l]['start'] = $data[$f+2];
$leases[$l]['start'] .= " " . $data[$f+3];
$f = $f+3;
break;
case "ends":
if ($data[$f+1] == "never") {
// Quote from dhcpd.leases(5) man page:
// If a lease will never expire, date is never instead of an actual date.
$leases[$l]['end'] = gettext("Never");
$f = $f+1;
} else {
$leases[$l]['end'] = $data[$f+2];
$leases[$l]['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":
$f = $f+3;
break;
case "binding":
switch ($data[$f+2]) {
case "active":
$leases[$l]['act'] = "active";
break;
case "free":
$leases[$l]['act'] = "expired";
$leases[$l]['online'] = "offline";
break;
case "backup":
$leases[$l]['act'] = "reserved";
$leases[$l]['online'] = "offline";
break;
}
$f = $f+1;
break;
case "next":
/* skip the next binding statement */
$f = $f+3;
break;
case "rewind":
/* skip the rewind binding statement */
$f = $f+3;
break;
case "hardware":
$leases[$l]['mac'] = $data[$f+2];
/* check if it's online and the lease is active */
if (in_array($leases[$l]['ip'], $arpdata_ip)) {
$leases[$l]['online'] = 'online';
} else {
$leases[$l]['online'] = 'offline';
}
$f = $f+2;
break;
case "client-hostname":
if ($data[$f+1] <> "") {
$leases[$l]['hostname'] = preg_replace('/"/', '', $data[$f+1]);
} else {
$hostname = gethostbyaddr($leases[$l]['ip']);
if ($hostname <> "") {
$leases[$l]['hostname'] = $hostname;
}
}
$f = $f+1;
break;
case "uid":
$f = $f+1;
break;
}
$f++;
}
$l++;
$i++;
/* slowly chisel away at the source array */
array_shift($leases_content);
}
/* remove the old array */
unset($lease_content);
/* remove duplicate items by mac address */
if (count($leases) > 0) {
$leases = remove_duplicate($leases, "ip");
}
if (count($pools) > 0) {
$pools = remove_duplicate($pools, "name");
asort($pools);
}
foreach ($config['interfaces'] as $ifname => $ifarr) {
if (is_array($config['dhcpd'][$ifname]) &&
is_array($config['dhcpd'][$ifname]['staticmap'])) {
$staticmap_array_index = 0;
foreach ($config['dhcpd'][$ifname]['staticmap'] as $static) {
$slease = array();
$slease['ip'] = $static['ipaddr'];
$slease['type'] = "static";
$slease['mac'] = $static['mac'];
$slease['if'] = $ifname;
$slease['start'] = "";
$slease['end'] = "";
$slease['hostname'] = htmlentities($static['hostname']);
$slease['act'] = "static";
$slease['online'] = in_array(strtolower($slease['mac']), $arpdata_mac) ? 'online' : 'offline';
$slease['staticmap_array_index'] = $staticmap_array_index;
$leases[] = $slease;
$staticmap_array_index++;
}
}
}
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")?> |
foreach ($pools as $data):?>
=$data['name']?> |
=$data['mystate']?> |
=adjust_gmt($data['mydate'])?> |
=$data['peerstate']?> |
=adjust_gmt($data['peerdate'])?> |
endforeach?>
=gettext('Leases')?>
|
=gettext("IP address")?> |
=gettext("MAC address")?> |
=gettext("Hostname")?> |
=gettext("Start")?> |
=gettext("End")?> |
=gettext("Online")?> |
=gettext("Lease Type")?> |
$dhcpifconf) {
if (!is_array($dhcpifconf['range']))
continue;
if (($lip >= ip2ulong($dhcpifconf['range']['from'])) && ($lip <= ip2ulong($dhcpifconf['range']['to']))) {
$data['if'] = $dhcpif;
$dhcp_leases_subnet_counter[$dlsc]['dhcpif'] = $dhcpif;
$dhcp_leases_subnet_counter[$dlsc]['from'] = $dhcpifconf['range']['from'];
$dhcp_leases_subnet_counter[$dlsc]['to'] = $dhcpifconf['range']['to'];
$dhcp_leases_subnet_counter[$dlsc]['count'] = $dhcp_leases_subnet_counter[$dlsc]['count']+1;
break;
}
$dlsc++;
}
}
$mac = $data['mac'];
$mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
?>
|
=$data['ip']?> |
=$mac?>
if(isset($mac_man[$mac_hi])):?>
(=$mac_man[$mac_hi]?>)
|
=htmlentities($data['hostname'])?> |
if ($data['type'] != "static"):?>
=adjust_gmt($data['start'])?> |
=adjust_gmt($data['end'])?> |
else: ?>
n/a |
n/a |
endif; ?>
=$data['online']?> |
=$data['act']?> |
if ($data['type'] == "dynamic"): ?>
" href="services_dhcp_edit.php?if==$data['if']?>&mac==$data['mac']?>&hostname==htmlspecialchars($data['hostname'])?>">
else: ?>
endif; ?>
" href="services_wol_edit.php?if==$data['if']?>&mac==$data['mac']?>&descr==htmlentities($data['hostname'])?>">
if ($data['online'] != "online"):?>
" href="services_wol.php?if==$data['if']?>&mac==$data['mac']?>">
endif; ?>
if ($data['type'] == "dynamic" && $data['online'] != "online"):?>
endif?>
|
endforeach; ?>
=gettext('Leases in use')?>
=gettext("Interface")?> |
=gettext("Pool Start")?> |
=gettext("Pool End")?> |
=gettext("# of leases in use")?> |
foreach ($dhcp_leases_subnet_counter as $listcounters):?>
=$iflist[$listcounters['dhcpif']]?> |
=$listcounters['from']?> |
=$listcounters['to']?> |
=$listcounters['count']?> |
endforeach; ?>
=gettext("Show active and static leases only")?>
=gettext("Show all configured leases")?>