Commit b9f53dee authored by Ad Schellevis's avatar Ad Schellevis

(legacy) refactor status_dhcpv6_leases.php

parent ca46899b
<?php
/*
Copyright (C) 2014-2015 Deciso B.V.
Copyright (C) 2014-2016 Deciso B.V.
Copyright (C) 2004-2009 Scott Ullrich
Copyright (C) 2011 Seth Mos
Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
......@@ -34,61 +34,6 @@ require_once("pfsense-utils.inc");
require_once("interfaces.inc");
require_once("services.inc");
$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd6.leases";
if (($_GET['deleteip']) && (is_ipaddr($_GET['deleteip']))) {
/* Stop DHCPD */
killbyname("dhcpd");
/* Read existing leases */
$leases_contents = explode("\n", file_get_contents($leasesfile));
$newleases_contents = array();
$i=0;
while ($i < count($leases_contents)) {
/* Find the lease(s) we want to delete */
if ($leases_contents[$i] == " iaaddr {$_GET['deleteip']} {") {
/* The iaaddr line is two lines down from the start of the lease, so remove those two lines. */
array_pop($newleases_contents);
array_pop($newleases_contents);
/* Skip to the end of the lease declaration */
do {
$i++;
} while ($leases_contents[$i] != "}");
} else {
/* It's a line we want to keep, copy it over. */
$newleases_contents[] = $leases_contents[$i];
}
$i++;
}
/* Write out the new leases file */
$fd = fopen($leasesfile, 'w');
fwrite($fd, implode("\n", $newleases_contents));
fclose($fd);
/* Restart DHCP Service */
services_dhcpd_configure();
header("Location: status_dhcpv6_leases.php?all={$_GET['all']}");
}
// Load MAC-Manufacturer table
$mac_man = load_mac_manufacturer_table();
$service_hook = 'dhcpd';
include("head.inc");
?>
<body>
<?php include("fbegin.inc"); ?>
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<?php
function leasecmp($a, $b) {
return strcmp($a[$_GET['order']], $b[$_GET['order']]);
......@@ -102,10 +47,11 @@ function adjust_gmt($dt) {
$dhcpdv6 = $config['dhcpdv6'];
foreach ($dhcpdv6 as $dhcpv6leaseinlocaltime) {
$dhcpv6leaseinlocaltime = $dhcpv6leaseinlocaltime['dhcpv6leaseinlocaltime'];
if ($dhcpv6leaseinlocaltime == "yes")
if ($dhcpv6leaseinlocaltime == "yes") {
break;
}
}
}
$timezone = $config['system']['timezone'];
$ts = strtotime($dt . " GMT");
......@@ -115,17 +61,19 @@ function adjust_gmt($dt) {
$offset = $this_tz->getOffset($dhcp_lt);
$ts = $ts + $offset;
return strftime("%Y/%m/%d %I:%M:%S%p", $ts);
}
else
} else {
return strftime("%Y/%m/%d %H:%M:%S", $ts);
}
}
function remove_duplicate($array, $field) {
foreach ($array as $sub)
foreach ($array as $sub) {
$cmp[] = $sub[$field];
}
$unique = array_unique(array_reverse($cmp,true));
foreach ($unique as $k => $rien)
foreach ($unique as $k => $rien) {
$new[] = $array[$k];
}
return $new;
}
......@@ -150,19 +98,24 @@ function parse_duid($duid_string) {
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\";}'";
//$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd6.leases";
$leasesfile = "/tmp/dhcpd6.leases";
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$awk = "/usr/bin/awk";
/* 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) {
/* 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();
......@@ -171,18 +124,18 @@ foreach ($rawdata as $line) {
$ndpent['interface'] = trim($elements[2]);
$ndpdata[$ip] = $ndpent;
}
}
}
$pools = array();
$leases = array();
$prefixes = array();
$mappings = array();
$i = 0;
$l = 0;
$p = 0;
$pools = array();
$leases = array();
$prefixes = array();
$mappings = array();
$i = 0;
$l = 0;
$p = 0;
// Put everything together again
while($i < $leases_count) {
// Put everything together again
while($i < $leases_count) {
$entry = array();
/* split the line by space */
$duid_split = array();
......@@ -199,7 +152,7 @@ while($i < $leases_count) {
$f = 0;
$fcount = count($data);
/* with less then 12 fields there is nothing useful */
if($fcount < 12) {
if ($fcount < 12) {
$i++;
continue;
}
......@@ -302,11 +255,11 @@ while($i < $leases_count) {
$f = $f+2;
break;
case "client-hostname":
if($data[$f+1] <> "") {
if ($data[$f+1] <> "") {
$entry['hostname'] = preg_replace('/"/','',$data[$f+1]);
} else {
$hostname = gethostbyaddr($entry['ip']);
if($hostname <> "") {
if ($hostname <> "") {
$entry['hostname'] = $hostname;
}
}
......@@ -327,22 +280,22 @@ while($i < $leases_count) {
$l++;
$i++;
$is_prefix = false;
}
}
if(count($leases) > 0) {
if (count($leases) > 0) {
$leases = remove_duplicate($leases,"ip");
}
}
if(count($prefixes) > 0) {
if (count($prefixes) > 0) {
$prefixes = remove_duplicate($prefixes,"prefix");
}
}
if(count($pools) > 0) {
if (count($pools) > 0) {
$pools = remove_duplicate($pools,"name");
asort($pools);
}
}
foreach($config['interfaces'] as $ifname => $ifarr) {
foreach($config['interfaces'] as $ifname => $ifarr) {
if (isset($config['dhcpdv6'][$ifname]['staticmap'])) {
foreach($config['dhcpdv6'][$ifname]['staticmap'] as $static) {
$slease = array();
......@@ -363,83 +316,142 @@ foreach($config['interfaces'] as $ifname => $ifarr) {
$leases[] = $slease;
}
}
}
}
if ($_GET['order'])
if ($_GET['order']) {
usort($leases, "leasecmp");
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!empty($_POST['deleteip']) && is_ipaddr($_POST['deleteip'])) {
// delete dhcp lease
/* Stop DHCPD */
killbyname("dhcpd");
$fin = @fopen($leasesfile, "r");
$fout = @fopen($leasesfile.".new", "w");
if ($fin) {
$ip_to_remove = $_POST['deleteip'];
$iaaddr = "";
$content_to_flush = array();
while (($line = fgets($fin, 4096)) !== false) {
$fields = explode(' ', trim($line));
if ($fields[0] == 'iaaddr') {
// lease segment, record ip
$iaaddr = trim($fields[1]);
$content_to_flush[] = $line;
} elseif ($fields[0] == 'ia-na' || count($content_to_flush) > 0) {
$content_to_flush[] = $line;
} else {
// output data directly if we're not in a "ia-na" section
fputs($fout, $line);
}
if ($line == "}\n") {
if ($iaaddr != $ip_to_remove) {
// write ia-na section
foreach ($content_to_flush as $cached_line) {
fputs($fout, $cached_line);
}
} else {
// skip empty line
fgets($fin, 4096);
}
// end of segment
$content_to_flush = array();
$iaaddr = "";
}
}
fclose($fin);
fclose($fout);
@unlink($leasesfile);
@rename($leasesfile.".new", $leasesfile);
/* Restart DHCP Service */
//services_dhcpd_configure();
}
}
exit;
}
$service_hook = 'dhcpd';
include("head.inc");
/* only print pool status when we have one */
if(count($pools) > 0) {
?>
<body>
<script>
$( document ).ready(function() {
$(".act_delete").click(function(){
$.post(window.location, {deleteip: $(this).data('deleteip')}, function(data) {
location.reload();
});
});
});
</script>
<?php include("fbegin.inc"); ?>
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<?php
/* only print pool status when we have one */
if (count($pools) > 0):?>
<section class="col-xs-12">
<div class="content-box">
<div class="table-responsive">
<table class="table table-striped table-sort sortable __nomb">
<tr>
<td class="listhdrr"><?=gettext("Failover Group"); ?></a></td>
<td class="listhdrr"><?=gettext("My State"); ?></a></td>
<td class="listhdrr"><?=gettext("Since"); ?></a></td>
<td class="listhdrr"><?=gettext("Peer State"); ?></a></td>
<td class="listhdrr"><?=gettext("Since"); ?></a></td>
<td><?=gettext("Failover Group"); ?></a></td>
<td><?=gettext("My State"); ?></a></td>
<td><?=gettext("Since"); ?></a></td>
<td><?=gettext("Peer State"); ?></a></td>
<td><?=gettext("Since"); ?></a></td>
</tr>
<?php
foreach ($pools as $data):?>
<tr>
<td><?=$data['name'];?></td>
<td><?=$data['mystate'];?></td>
<td><?=adjust_gmt($data['mydate']);?></td>
<td><?=$data['peerstate'];?></td>
<td><?=adjust_gmt($data['peerdate']);?></td>
</tr>
<?php
foreach ($pools as $data) {
echo "<tr>\n";
echo "<td class=\"listlr\">{$fspans}{$data['name']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['mystate']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['mydate']) . "{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['peerstate']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['peerdate']) . "{$fspane}</td>\n";
echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
echo "</tr>\n";
}
?>
<?php
endforeach;?>
</table>
</div>
</div>
</section>
<?php
/* only print pool status when we have one */
}
?>
endif;?>
<section class="col-xs-12">
<div class="content-box">
<div class="table-responsive">
<table class="table table-striped table-sort sortable __nomb">
<table class="table table-striped">
<thead>
<tr>
<td class="listhdrr"><?=gettext("IPv6 address"); ?></td>
<td class="listhdrr"><?=gettext("IAID"); ?></td>
<td class="listhdrr"><?=gettext("DUID"); ?></td>
<td class="listhdrr"><?=gettext("Hostname/MAC"); ?></td>
<td class="listhdrr"><?=gettext("Description"); ?></td>
<td class="listhdrr"><?=gettext("Start"); ?></td>
<td class="listhdrr"><?=gettext("End"); ?></td>
<td class="listhdrr"><?=gettext("Online"); ?></td>
<td class="listhdrr"><?=gettext("Lease Type"); ?></td>
<th><?=gettext("IPv6 address"); ?></th>
<th><?=gettext("IAID"); ?></th>
<th><?=gettext("DUID"); ?></th>
<th><?=gettext("Hostname/MAC"); ?></th>
<th><?=gettext("Description"); ?></th>
<th><?=gettext("Start"); ?></th>
<th><?=gettext("End"); ?></th>
<th><?=gettext("Online"); ?></th>
<th><?=gettext("Lease Type"); ?></th>
<th></th>
</tr>
<?php
foreach ($leases as $data) {
if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
if ($data['act'] != "active" && $data['act'] != "static") {
$fspans = "<span class=\"gray\">";
$fspane = "&nbsp;</span>";
} else {
$fspans = "";
$fspane = "&nbsp;";
}
</thead>
<tbody>
<?php
$mac_man = load_mac_manufacturer_table();
foreach ($leases as $data):
if ($data['act'] == "static") {
foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
if(is_array($dhcpifconf['staticmap'])) {
if (is_array($dhcpifconf['staticmap'])) {
foreach ($dhcpifconf['staticmap'] as $staticent) {
if ($data['ip'] == $staticent['ipaddr']) {
$data['if'] = $dhcpif;
......@@ -448,138 +460,89 @@ if(count($pools) > 0) {
}
}
/* exit as soon as we have an interface */
if ($data['if'] != "")
if ($data['if'] != "") {
break;
}
} else {
$data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
}
echo "<tr>\n";
echo "<td class=\"listlr\">{$fspans}{$data['ip']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['iaid']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['duid']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}";
if (!empty($data['hostname'])) {
echo htmlentities($data['hostname']) . "<br />";
}
if (isset($data['descr'])) {
echo "<td class=\"listr\">{$fspans}" . htmlentities($data['descr']) . "{$fspane}</td>\n";
} else {
echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
}
$mac = trim($ndpdata[$data['ip']]['mac']);
if (!empty($mac)) {
$mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
print htmlentities($mac);
if(isset($mac_man[$mac_hi])){ print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>"; }
}
echo "{$fspane}&nbsp;</td>\n";
if ($data['type'] != "static") {
echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
} else {
echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
}
echo "<td class=\"listr\">{$fspans}{$data['online']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
if ($data['type'] == "dynamic") {
echo "<td valign=\"middle\" style=\"padding-left: 0px;\"><a href=\"services_dhcpv6_edit.php?if={$data['if']}&amp;duid={$data['duid']}&amp;hostname={$data['hostname']}\" class=\"btn btn-default btn-xs\">";
echo "<span class=\"glyphicon glyphicon-plus\"></span></a><br />\n";
} else {
echo "<td class=\"list\" valign=\"middle\" style=\"padding-left: 0px;\">";
echo "<span class=\"glyphicon glyphicon-plus\"></span>\n";
}
/* Only show the button for offline dynamic leases */
if (($data['type'] == "dynamic") && ($data['online'] != "online")) {
echo "<a href=\"status_dhcpv6_leases.php?deleteip={$data['ip']}&amp;all=" . htmlspecialchars($_GET['all']) . "\" class=\"btn btn-default btn-xs\">";
echo "<span class=\"glyphicon glyphicon-remove\"></span></a></td>\n";
}
echo "</tr>\n";
}
$data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
}
?>
<tr>
<td><?=$data['ip'];?></td>
<td><?=$data['iaid'];?></td>
<td><?=$data['duid'];?></td>
<td><?=!empty($data['hostname']) ? htmlentities($data['hostname']) : "";?></td>
<td><?=htmlentities($data['descr']);?> <?=!empty($ndpdata[$data['ip']]['mac']) ? $ndpdata[$data['ip']]['mac'] : "";?></td>
<td><?=$data['type'] != "static" ? adjust_gmt($data['start']) : "";?></td>
<td><?=$data['type'] != "static" ? adjust_gmt($data['end']) : "";?></td>
<td><?=$data['online'];?></td>
<td><?=$data['act'];?></td>
<td>
<?php
if ($data['type'] == "dynamic"):?>
<a class="btn btn-default btn-xs" href="services_dhcpv6_edit.php?if=<?=$data['if'];?>&amp;mac=<?=$data['mac'];?>&amp;hostname=<?=$data['hostname'];?>">
<span class="glyphicon glyphicon-plus" data-toggle="tooltip" title="<?=gettext("add a static mapping for this MAC address");?>" alt="add" ></span>
</a>
<?php
endif;?>
<?php
if (($data['type'] == "dynamic") && ($data['online'] != "online")):?>
<a class="act_delete btn btn-default btn-xs" href="#" data-deleteip="<?=$data['ip'];?>">
<span class="fa fa-trash text-muted" title="<?=gettext("delete this DHCP lease");?>" data-toggle="tooltip" alt="delete" ></span>
</a>
<?php
endif;?>
</td>
</tr>
<?php
endforeach;?>
</tbody>
</table>
</div>
</div>
</section>
<section class="col-xs-12">
<div class="content-box">
<header class="content-box-head container-fluid">
<h3>Delegated Prefixes</h3>
<h3><?=gettext("Delegated Prefixes");?></h3>
</header>
<div class="table-responsive">
<table class="table table-striped table-sort sortable __nomb">
<table class="table table-striped">
<thead>
<tr>
<td class="listhdrr"><?=gettext("IPv6 Prefix"); ?></td>
<td class="listhdrr"><?=gettext("IAID"); ?></td>
<td class="listhdrr"><?=gettext("DUID"); ?></td>
<td class="listhdrr"><?=gettext("Start"); ?></td>
<td class="listhdrr"><?=gettext("End"); ?></td>
<td class="listhdrr"><?=gettext("State"); ?></td>
<th><?=gettext("IPv6 Prefix"); ?></th>
<th><?=gettext("IAID"); ?></th>
<th><?=gettext("DUID"); ?></th>
<th><?=gettext("Start"); ?></th>
<th><?=gettext("End"); ?></th>
<th><?=gettext("State"); ?></th>
</tr>
<?php
foreach ($prefixes as $data) {
if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
if ($data['act'] != "active" && $data['act'] != "static") {
$fspans = "<span class=\"gray\">";
$fspane = "&nbsp;</span>";
} else {
$fspans = "";
$fspane = "&nbsp;";
}
if ($data['act'] == "static") {
foreach ($config['dhcpdv6'] as $dhcpif => $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']));
}
echo "<tr>\n";
if ($mappings[$data['iaid'] . $data['duid']]) {
$dip = "<br />Routed To: {$mappings[$data['iaid'] . $data['duid']]}";
}
echo "<td class=\"listlr\">{$fspans}{$data['prefix']}{$dip}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['iaid']}{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}{$data['duid']}{$fspane}</td>\n";
if ($data['type'] != "static") {
echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
} else {
echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
}
echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
echo "</tr>\n";
}
}
?>
</thead>
<tbody>
<?php
foreach ($prefixes as $data):?>
<tr>
<td>
<?=!empty($mappings[$data['iaid'] . $data['duid']]) ? $mappings[$data['iaid'] . $data['duid']] : "";?>
<?=$data['prefix'];?>
</td>
<td><?=$data['prefix'];?></td>
<td><?=$data['iaid'];?></td>
<td><?=$data['type'] != "static" ? adjust_gmt($data['start']) : "";?></td>
<td><?=$data['type'] != "static" ? adjust_gmt($data['end']) : "";?></td>
<td><?=$data['act'];?></td>
</tr>
<?php
endforeach;?>
</tbody>
</table>
</div>
</div>
</section>
<section class="col-xs-12">
<form action="status_dhcpv6_leases.php" method="get">
<input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
<?php if ($_GET['all']): ?>
......@@ -590,10 +553,9 @@ if(count($pools) > 0) {
<input type="submit" class="btn btn-default" value="<?=gettext("Show all configured leases"); ?>" />
<?php endif; ?>
</form>
<?php if($leases == 0): ?>
<?php if ($leases == 0): ?>
<p><strong><?=gettext("No leases file found. Is the DHCP server active"); ?>?</strong></p>
<?php endif; ?>
</section>
</div>
</div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment