<?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
$query = "SELECT
        s.subnet_address,
        s.subnet_mask,
        s.subnet_dhcp_start,
        s.subnet_dhcp_end,
        s.subnet_info,
        s.protocol_version,
        s.ntp_server,
        COUNT(node.subnet_id) AS node_counter
    FROM
        subnet AS s LEFT JOIN node USING (subnet_id)
    WHERE
        s.subnet_id=" . $subnet_id . "
    GROUP BY
        s.subnet_id";

$subnet = $db->db_select($query);

// set needed variables
$subnet_address = $subnet[0]['subnet_address'];
$subnet_mask = $subnet[0]['subnet_mask'];
$subnet_dhcpstart = $subnet[0]['subnet_dhcp_start'];
$subnet_dhcpend = $subnet[0]['subnet_dhcp_end'];
$subnet_proto_vers = $subnet[0]['protocol_version'];
$subnet_ntp_server = $subnet[0]['ntp_server'];

// set counters
$host_counter = pow(2,(32-$subnet_mask));
$node_counter = $subnet[0]['node_counter'];
$subnet_usedpercentage = round((($node_counter/($host_counter-2))*100), 1);

$smarty->assign("subnet_id", $subnet_id);
$smarty->assign("subnet_address", $subnet_address);
$smarty->assign("subnet_mask", $subnet_mask);
$smarty->assign("subnet_dhcpstart", $subnet_dhcpstart);
$smarty->assign("subnet_dhcpend", $subnet_dhcpend);
$smarty->assign("subnet_info", nl2br($subnet[0]['subnet_info']));
$smarty->assign("subnet_proto_vers", $subnet_proto_vers);
$smarty->assign("subnet_ntp_server", $subnet_ntp_server);
$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
$subnet = 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
        $subnet[$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
        $subnet[$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
        $subnet[$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
$query = "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($subnet))."')
        AND node.subnet_id='$subnet_id'
        AND asset.asset_id=node.asset_id
        AND assetclass.assetclass_id=asset.assetclass_id
        AND assetclassgroup.assetclassgroup_id=assetclass.assetclassgroup_id";

$nodes = $db->db_select($query);

$node_counter = count($nodes);
if ($node_counter>0) {
    // get objects
    foreach($nodes AS $node) {
        // add node-values to ip in subnet-array
        $subnet[$node['node_ip']] = $node;
    }
}

// replace ip's in subnet-array (if necessary)
// check for subnet address
if(array_key_exists($subnet_address, $subnet)) {
    // replace
    $subnet[$subnet_address] = array("subnet_address");
}

// check for broadcast address
if(array_key_exists($broadcast_address, $subnet)) {
    // replace
    $subnet[$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 ($subnet 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
    $subnet[$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
        $subnet[$node_ip]["url"] = 'assigniptonode.php?subnet_id=' . $subnet_id . '&amp;node_ip='. $node_ip;
        $subnet[$node_ip]["remotetext"] = $node_ip;
        if ($subnet[$node_ip]["dynamic"]) {
            $subnet[$node_ip]["assetclassgroup_color"] = $config_color_dynamic;
        } else {
            $subnet[$node_ip]["assetclassgroup_color"] = $config_color_unused;
        }
    } else if (array_key_exists(0, $node) && $node[0]=="subnet_address") {
       // subnet address to tpl
        $subnet[$node_ip]["url"] = "";
        $subnet[$node_ip]["remotetext"] = $node_ip . '&nbsp;' . $lang['lang_subnet_subnetaddress'];
        $subnet[$node_ip]["assetclassgroup_color"] = $config_color_blocked;
    } else if (array_key_exists(0, $node) && $node[0]=="broadcast_address") {
        // broadcast address to tpl
        $subnet[$node_ip]["url"] = "";
        $subnet[$node_ip]["remotetext"] = $node_ip . '&nbsp;' . $lang['lang_subnet_broadcastaddress'];
        $subnet[$node_ip]["assetclassgroup_color"] = $config_color_blocked;
    } else {
        // node to tpl
        $subnet[$node_ip]["url"] = 'nodeview.php?node_id=' . $node['node_id'];
        $subnet[$node_ip]["remotetext"] = $node_ip . '&nbsp;' . $node['asset_name'];
        $subnet[$node_ip]["assetclassgroup_color"] = $node['assetclassgroup_color'];
    }

    // update counter
    //   $i++;

} // foreach

$smarty->assign("subnet", $subnet);
$smarty->assign("imagewrap", $_SESSION['suser_imagecount']);

// vlan
$query = "SELECT
        vlan.vlan_id AS vlan_id,
        vlan.vlan_name AS vlan_name,
        vlan.vlan_number AS vlan_number
    FROM
        subnetvlan,
        vlan
    WHERE
        subnetvlan.subnet_id=" . $subnet_id . "
        AND vlan.vlan_id=subnetvlan.vlan_id
    ORDER BY
        vlan.vlan_name";

// run query
$vlans = $db->db_select($query);
$smarty->assign("vlans", $vlans);

// location
$query = "SELECT
        l.location_id,
        l.location_name
    FROM
        location AS l LEFT JOIN subnetlocation AS s USING (location_id)
    WHERE
        s.subnet_id=". $subnet_id . "
    ORDER BY
        l.location_name";

$locations = $db->db_select($query);
$smarty->assign("locations", $locations);

// assetclassgroup
$query = "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=" . $subnet_id . "
    GROUP BY assetclass_id
    ORDER BY counter DESC";

// run query
$assetclassgroups = $db->db_select($query);
$smarty->assign("assetclassgroups", $assetclassgroups);

$smarty->display("subnetview.tpl");

include("footer.php");
?>