From 4ba8e4bcb34354c685a5a2fcea9000495d6440e5 Mon Sep 17 00:00:00 2001 From: heper Date: Mon, 9 Nov 2015 12:59:17 +0100 Subject: add static leases --- src/usr/local/bin/dhcpd_gather_stats.php | 318 ++++++++++++++++--------------- 1 file changed, 169 insertions(+), 149 deletions(-) (limited to 'src') diff --git a/src/usr/local/bin/dhcpd_gather_stats.php b/src/usr/local/bin/dhcpd_gather_stats.php index 21005b6..f76f9d9 100644 --- a/src/usr/local/bin/dhcpd_gather_stats.php +++ b/src/usr/local/bin/dhcpd_gather_stats.php @@ -25,172 +25,192 @@ */ require_once("config.inc"); - -$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases"; -$leases_contents = file($leasesfile); -$dhcpif = $argv[1] ; - +require("interfaces.inc"); /* echo the rrd required syntax */ echo "N:"; $result = "NaN"; +$result_static="NaN"; -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; -} -$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\";}'"; +if (isset($argv[1])) { -/* stuff the leases file in a proper format into a array by line */ -exec("/bin/cat {$leasesfile} | {$awk} {$cleanpattern} | {$awk} {$splitpattern}", $leases_content); -$pools = array(); -$leases = array(); -$i = 0; -$l = 0; -$p = 0; + $leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases"; + $leases_contents = file($leasesfile); + $dhcpif = $argv[1] ; -// 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; + + + + 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; } - 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"); + $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); + $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; - } else { - $leases[$l]['end'] = $data[$f+2]; - $leases[$l]['end'] .= " " . $data[$f+3]; + break; + case "next": + /* skip the next binding statement */ $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 "uid": - $f = $f+1; - break; + break; + case "rewind": + /* skip the rewind binding statement */ + $f = $f+3; + break; + case "uid": + $f = $f+1; + break; + } + $f++; } - $f++; + $l++; + $i++; + /* slowly chisel away at the source array */ + array_shift($leases_content); } - $l++; - $i++; - /* slowly chisel away at the source array */ - array_shift($leases_content); -} -/* remove the old array */ -unset($lease_content); + /* remove the old array */ + unset($lease_content); -/* remove duplicate items by mac address */ -if (count($leases) > 0) { - $leases = remove_duplicate($leases, "ip"); -} + /* 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); -} + 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['act'] = "static"; - $slease['staticmap_array_index'] = $staticmap_array_index; - $leases[] = $slease; - $staticmap_array_index++; + 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['act'] = "static"; + $slease['staticmap_array_index'] = $staticmap_array_index; + $leases[] = $slease; + $staticmap_array_index++; + } } } -} - + $ifcfgip = get_interface_ip($dhcpif); + $ifcfgsn = get_interface_subnet($dhcpif); + $subnet_start = ip2ulong(long2ip32(ip2long($ifcfgip) & gen_subnet_mask_long($ifcfgsn))); + $subnet_end = ip2ulong(long2ip32(ip2long($ifcfgip) | (~gen_subnet_mask_long($ifcfgsn)))); -foreach ($leases as $data) { - $lip = ip2ulong($data['ip']); - if ($data['act'] != "active" && $data['act'] != "static" && $_GET['all'] != 1) - continue; - if ($data['act'] != "static") { - if (($lip >= ip2ulong($config['dhcpd'][$dhcpif]['range']['from'])) && ($lip <= ip2ulong($config['dhcpd'][$dhcpif]['range']['to']))) { - $result = $result + 1; - + foreach ($leases as $data) { + $lip = ip2ulong($data['ip']); + + if ($data['act'] != "active" && $data['act'] != "static" && $_GET['all'] != 1) + continue; + if ($data['act'] != "static") { + if (($lip >= ip2ulong($config['dhcpd'][$dhcpif]['range']['from'])) && ($lip <= ip2ulong($config['dhcpd'][$dhcpif]['range']['to']))) { + $result = $result + 1; + + } + } + else { + + + if (($lip >= $subnet_start) && ($lip <= $subnet_end)) { + $result_static = $result_static + 1; + } + + } } } -echo "$result" ; +echo "$result:$result_static" ; -- cgit v1.1