You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
382 lines
12 KiB
382 lines
12 KiB
<?php
|
|
/*****************************************************************************
|
|
IP Reg, a PHP/MySQL IPAM tool
|
|
Copyright (C) 2007-2009 Wietse Warendorff (up to v0.5)
|
|
Copyright (C) 2011-2023 Thomas Hooge
|
|
|
|
SPDX-License-Identifier: GPL-3.0-or-later
|
|
*****************************************************************************/
|
|
|
|
include("includes.php");
|
|
|
|
$subnet_id = sanitize($_GET['subnet_id']);
|
|
|
|
if(isset($_GET['page'])) {
|
|
$page = sanitize($_GET['page']);
|
|
}
|
|
|
|
$smarty->assign("scripts",'changetext.js');
|
|
include("header.php");
|
|
|
|
// subnet
|
|
$sql = "SELECT
|
|
s.subnet_id AS id,
|
|
s.subnet_address AS address,
|
|
s.subnet_mask AS mask,
|
|
s.subnet_dhcp_start AS dhcp_start,
|
|
s.subnet_dhcp_end AS dhcp_end,
|
|
s.subnet_info AS info,
|
|
s.protocol_version AS proto_vers,
|
|
s.ntp_server,
|
|
COUNT(node.subnet_id) AS node_counter
|
|
FROM
|
|
subnet AS s LEFT JOIN node USING (subnet_id)
|
|
WHERE
|
|
s.subnet_id=?
|
|
GROUP BY
|
|
s.subnet_id";
|
|
$sth = $dbh->prepare($sql);
|
|
$sth->execute([$subnet_id]);
|
|
|
|
$subnet = $sth->fetch(PDO::FETCH_OBJ);
|
|
|
|
$smarty->assign("subnet", $subnet);
|
|
|
|
// set needed variables
|
|
$subnet_address = $subnet->address;
|
|
$subnet_mask = $subnet->mask;
|
|
$subnet_dhcpstart = $subnet->dhcp_start;
|
|
$subnet_dhcpend = $subnet->dhcp_end;
|
|
$subnet_proto_vers = $subnet->protocol_version;
|
|
$subnet_ntp_server = $subnet->ntp_server;
|
|
|
|
// set counters
|
|
$host_counter = pow(2,(32-$subnet_mask));
|
|
$node_counter = $subnet->node_counter;
|
|
$subnet_usedpercentage = round((($node_counter/($host_counter-2))*100), 1);
|
|
|
|
$smarty->assign("node_counter", $node_counter);
|
|
$smarty->assign("subnet_usedpercentage", $subnet_usedpercentage);
|
|
$smarty->assign("config_color_unused", $config_color_unused);
|
|
$smarty->assign("host_counter", $host_counter-2);
|
|
$smarty->assign("free_counter", (($host_counter-2)-$node_counter));
|
|
|
|
// subnet
|
|
|
|
// split up the range
|
|
$iprange = explode('.', $subnet->address);
|
|
$iprange1 = $iprange[0];
|
|
$iprange2 = $iprange[1];
|
|
$iprange3 = $iprange[2];
|
|
$iprange4 = $iprange[3];
|
|
|
|
// create empty subnet-array
|
|
$subnetdata = array();
|
|
|
|
// determine range (Class A/B/C)
|
|
if ($subnet_mask >= 24) {
|
|
// Class C
|
|
// fill subnet-array with addresses we want to see
|
|
for($i=0; $i<$host_counter; $i++) {
|
|
// build ip
|
|
$ip = $iprange1 . '.' . $iprange2 . '.' . $iprange3 . '.' . ($iprange4+$i);
|
|
|
|
// fill subnet-array
|
|
$subnetdata[$ip] = array();
|
|
}
|
|
|
|
// calculate broadcast address
|
|
$broadcast_address = $iprange1 . '.' . $iprange2 . '.' . $iprange3 . '.' . ($iprange4+$i-1);
|
|
|
|
// to tpl
|
|
$smarty->assign("iprange1", $iprange1);
|
|
$smarty->assign("iprange2", $iprange2);
|
|
$smarty->assign("iprange3", $iprange3);
|
|
$smarty->assign("iprange4", $iprange4);
|
|
$smarty->assign("subnetmask1", 255);
|
|
$smarty->assign("subnetmask2", 255);
|
|
$smarty->assign("subnetmask3", 255);
|
|
$smarty->assign("subnetmask4", 256-$host_counter);
|
|
|
|
// no pagination needed
|
|
$smarty->assign("noselect", TRUE);
|
|
$smarty->assign("one_select", FALSE);
|
|
$smarty->assign("two_select", FALSE);
|
|
|
|
// set displayed nodes
|
|
$nodes_displayed = $host_counter;
|
|
} else if ($subnet_mask>=16) {
|
|
// Class B
|
|
// which part do we want to see?
|
|
if((empty($page)) ? $page=$subnet_address : $page=$page);
|
|
$page = explode('.', $page);
|
|
$page2 = $page[2];
|
|
|
|
// fill subnet-array with addresses we want to see
|
|
for($i=0;$i<256;$i++) {
|
|
// build ip
|
|
$ip = $iprange1 . '.' . $iprange2 . '.' . $page2 . '.' . $i;
|
|
|
|
// fill subnet-array
|
|
$subnetdata[$ip] = array();
|
|
}
|
|
|
|
// calculate broadcast address
|
|
$broadcast_address = $iprange1 . '.' . $iprange2 . '.' . ($iprange3+$i-1) . '.255';
|
|
|
|
// to tpl
|
|
$smarty->assign("iprange1", $iprange1);
|
|
$smarty->assign("iprange2", $iprange2);
|
|
|
|
// loop addresses in range3
|
|
for($i=$iprange3;$i<(pow(2,(32-$subnet_mask))/256);$i++) {
|
|
// send to tpl
|
|
$smarty->assign("iprange3", $i);
|
|
$smarty->assign("iprange4", 0);
|
|
|
|
// set select box
|
|
if($i==$page2) {
|
|
$smarty->assign("row_selected", "selected");
|
|
|
|
} else {
|
|
$smarty->assign("row_selected", "");
|
|
}
|
|
|
|
}
|
|
|
|
$smarty->assign("subnetmask1", 255);
|
|
$smarty->assign("subnetmask2", 255);
|
|
$smarty->assign("subnetmask3", 256-($host_counter/256));
|
|
$smarty->assign("subnetmask4", 0);
|
|
|
|
// one select box
|
|
$smarty->assign("noselect", FALSE);
|
|
$smarty->assign("one_select", TRUE);
|
|
$smarty->assign("two_select", FALSE);
|
|
|
|
// set displayed nodes
|
|
$nodes_displayed = 256;
|
|
} else {
|
|
// Class A
|
|
// which part do we want to see?
|
|
if ((empty($page)) ? $page = $subnet_address : $page = $page);
|
|
$page = explode('.', $page);
|
|
$page2 = $page[1];
|
|
$page3 = $page[2];
|
|
|
|
// fill subnet-array with addresses we want to see
|
|
for($i=0; $i<256; $i++) {
|
|
// build ip
|
|
$ip = $iprange1 . '.' . $page2 . '.' . $page3 . '.' . $i;
|
|
|
|
// fill subnet-array
|
|
$subnetdata[$ip] = array();
|
|
}
|
|
|
|
// calculate broadcast address
|
|
$broadcast_address = $iprange1 . '.' . ($iprange2+$i-1) . '.255.255';
|
|
|
|
// to tpl
|
|
$smarty->assign("iprange1", $iprange1);
|
|
$smarty->assign("iprange2", $iprange2);
|
|
|
|
// loop addresses in range 2
|
|
for ($i=$iprange2; $i<(pow(2,(24-$subnet_mask))/256); $i++) {
|
|
// send to tpl
|
|
$smarty->assign("iprange1", $iprange1);
|
|
$smarty->assign("iprange2", $i);
|
|
$smarty->assign("iprange3", $page3);
|
|
$smarty->assign("iprange4", $iprange4);
|
|
|
|
// set select box
|
|
if($i == $page2) {
|
|
$smarty->assign("row1_selected", "selected");
|
|
|
|
} else {
|
|
$smarty->assign("row1_selected", "");
|
|
}
|
|
|
|
// parse block
|
|
$tp->parse("two_select_row1");
|
|
}
|
|
|
|
// loop addresses in range 3
|
|
for($i=0; $i<256; $i++) {
|
|
// send to tpl
|
|
$smarty->assign("iprange1", $iprange1);
|
|
$smarty->assign("iprange2", $page2);
|
|
$smarty->assign("iprange3", $i);
|
|
$smarty->assign("iprange4", $iprange4);
|
|
|
|
// set select box
|
|
if($i==$page3) {
|
|
$smarty->assign("row2_selected", "selected");
|
|
|
|
} else {
|
|
$smarty->assign("row2_selected", "");
|
|
}
|
|
|
|
// parse block
|
|
$tp->parse("two_select_row2");
|
|
}
|
|
|
|
$smarty->assign("subnetmask1", 255);
|
|
$smarty->assign("subnetmask2", 256-($host_counter/65536));
|
|
$smarty->assign("subnetmask3", 0);
|
|
$smarty->assign("subnetmask4", 0);
|
|
|
|
// one select box
|
|
$smarty->assign("noselect", FALSE);
|
|
$smarty->assign("one_select", FALSE);
|
|
$smarty->assign("two_select", TRUE);
|
|
|
|
// set displayed nodes
|
|
$nodes_displayed = 256;
|
|
}
|
|
|
|
// get nodes for this subnetview and implement the values into the array
|
|
$sql = "SELECT
|
|
asset.asset_name,
|
|
assetclassgroup.assetclassgroup_color,
|
|
node.node_id,
|
|
node.node_ip
|
|
FROM
|
|
asset,
|
|
assetclass,
|
|
assetclassgroup,
|
|
node
|
|
WHERE
|
|
node.node_ip IN ('".implode("','",array_keys($subnetdata))."')
|
|
AND node.subnet_id=?
|
|
AND asset.asset_id=node.asset_id
|
|
AND assetclass.assetclass_id=asset.assetclass_id
|
|
AND assetclassgroup.assetclassgroup_id=assetclass.assetclassgroup_id";
|
|
|
|
$sth = $dbh->prepare($sql);
|
|
$sth->execute([$subnet_id]);
|
|
$smarty->assign("locations", $sth->fetchAll());
|
|
|
|
$nodes = $sth->fetchAll();
|
|
|
|
$node_counter = count($nodes);
|
|
if ($node_counter > 0) {
|
|
// get objects
|
|
foreach ($nodes AS $node) {
|
|
// add node-values to ip in subnet-array
|
|
$subnetdata[$node['node_ip']] = $node;
|
|
}
|
|
}
|
|
|
|
// replace ip's in subnet-array (if necessary)
|
|
// check for subnet address
|
|
if (array_key_exists($subnet_address, $subnet)) {
|
|
// replace
|
|
$subnetdata[$subnet_address] = array("subnet_address");
|
|
}
|
|
|
|
// check for broadcast address
|
|
if (array_key_exists($broadcast_address, $subnet)) {
|
|
// replace
|
|
$subnetdata[$broadcast_address] = array("broadcast_address");
|
|
}
|
|
|
|
$dhcpstart = 0;
|
|
if ($subnet_dhcpstart && $subnet_dhcpend) {
|
|
$dhcpstart = ip2long($subnet_dhcpstart);
|
|
$dhcpend = ip2long($subnet_dhcpend);
|
|
}
|
|
|
|
// loop subnet-array and send to template
|
|
// start counter
|
|
// $i=1;
|
|
// loop subnet-array
|
|
foreach ($subnetdata AS $node_ip => $node) {
|
|
|
|
// make new line?
|
|
// if(($i%$_SESSION['suser_imagecount']==0 && $i!=$nodes_displayed) ? $tr="</tr><tr>" : $tr="");
|
|
|
|
// check if node-ip in DHCP-area
|
|
$subnetdata[$node_ip]["dynamic"] = false;
|
|
if ($dhcpstart > 0) {
|
|
$ipval = ip2long($node_ip);
|
|
if (($ipval >= $dhcpstart) and ($ipval <= $dhcpend)) {
|
|
$subnet[$node_ip]["dynamic"] = true;
|
|
}
|
|
}
|
|
|
|
// check node
|
|
if (empty($node)) {
|
|
// empty node to tpl
|
|
$subnetdata[$node_ip]["url"] = 'assigniptonode.php?subnet_id=' . $subnet_id . '&node_ip='. $node_ip;
|
|
$subnetdata[$node_ip]["remotetext"] = $node_ip;
|
|
if ($subnetdata[$node_ip]["dynamic"]) {
|
|
$subnetdata[$node_ip]["assetclassgroup_color"] = $config_color_dynamic;
|
|
} else {
|
|
$subnetdata[$node_ip]["assetclassgroup_color"] = $config_color_unused;
|
|
}
|
|
} else if (array_key_exists(0, $node) && $node[0]=="subnet_address") {
|
|
// subnet address to tpl
|
|
$subnetdata[$node_ip]["url"] = "";
|
|
$subnetdata[$node_ip]["remotetext"] = $node_ip . ' ' . $lang['lang_subnet_subnetaddress'];
|
|
$subnetdata[$node_ip]["assetclassgroup_color"] = $config_color_blocked;
|
|
} else if (array_key_exists(0, $node) && $node[0]=="broadcast_address") {
|
|
// broadcast address to tpl
|
|
$subnetdata[$node_ip]["url"] = "";
|
|
$subnetdata[$node_ip]["remotetext"] = $node_ip . ' ' . $lang['lang_subnet_broadcastaddress'];
|
|
$subnetdata[$node_ip]["assetclassgroup_color"] = $config_color_blocked;
|
|
} else {
|
|
// node to tpl
|
|
$subnetdata[$node_ip]["url"] = 'nodeview.php?node_id=' . $node['node_id'];
|
|
$subnetdata[$node_ip]["remotetext"] = $node_ip . ' ' . $node['asset_name'];
|
|
$subnetdata[$node_ip]["assetclassgroup_color"] = $node['assetclassgroup_color'];
|
|
}
|
|
|
|
// update counter
|
|
// $i++;
|
|
|
|
} // foreach
|
|
|
|
$smarty->assign("subnetdata", $subnetdata);
|
|
$smarty->assign("imagewrap", $_SESSION['suser_imagecount']);
|
|
|
|
// vlans
|
|
$sql = "SELECT v.vlan_id AS id, v.vlan_name AS name,
|
|
v.vlan_number AS number
|
|
FROM subnetvlan AS s JOIN vlan AS v USING (vlan_id)
|
|
WHERE s.subnet_id=?
|
|
ORDER BY v.vlan_name";
|
|
$sth = $dbh->prepare($sql);
|
|
$sth->execute([$subnet_id]);
|
|
$smarty->assign("vlans", $sth->fetchAll());
|
|
|
|
// locations
|
|
$sql = "SELECT l.location_id, l.location_name
|
|
FROM location AS l LEFT JOIN subnetlocation AS s USING (location_id)
|
|
WHERE s.subnet_id=?
|
|
ORDER BY l.location_name";
|
|
$sth = $dbh->prepare($sql);
|
|
$sth->execute([$subnet_id]);
|
|
$smarty->assign("locations", $sth->fetchAll());
|
|
|
|
// assetclassgroups
|
|
$sql = "SELECT
|
|
assetclassgroup_id AS id,
|
|
assetclassgroup_name AS name,
|
|
assetclassgroup_color AS color,
|
|
COUNT(assetclass_id) AS counter
|
|
FROM subnet
|
|
LEFT JOIN node USING (subnet_id)
|
|
LEFT JOIN asset USING (asset_id)
|
|
LEFT JOIN assetclass USING (assetclass_id)
|
|
LEFT JOIN assetclassgroup USING (assetclassgroup_id)
|
|
WHERE subnet_id=?
|
|
GROUP BY assetclass_id
|
|
ORDER BY counter DESC";
|
|
$sth = $dbh->prepare($sql);
|
|
$sth->execute([$subnet_id]);
|
|
$smarty->assign("assetclassgroups", $sth->fetchAll());
|
|
|
|
$smarty->display("subnetview.tpl");
|
|
|
|
include("footer.php");
|
|
?>
|
|
|