383 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			383 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?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");
 | |
| ?>
 |