Observium_CE/html/pages/vlan.inc.php

224 lines
7.7 KiB
PHP

<?php
/**
* Observium
*
* This file is part of Observium.
*
* @package observium
* @subpackage web
* @copyright (C) Adam Armstrong
*
*/
// Global read-only because no permissions checking right now
if ($_SESSION['userlevel'] < 5) {
print_error_permission();
return;
}
if (safe_empty($vars['vlan_id']) || !is_numeric($vars['vlan_id'])) {
echo generate_box_open();
echo '<table class="table table-striped table-hover">';
echo '<tr>';
echo '<th>VLAN ID</th><th>VLAN Name</th>';
echo '<th>Devices</th>';
echo '<th>Tagged / Untagged</th>';
echo '<th>Unique MACs</th>';
echo '</tr>';
foreach (get_vlans($vars) as $vlan_id => $vlan) {
if ($vlan_id === '') {
continue;
}
if (is_array($vlan['names'])) {
ksort($vlan['names']);
$first_vlan = array_keys($vlan['names'])[0];
} else {
$first_vlan = "VLAN $vlan_id";
}
// Fixme - improve method of choosing which name to use.
//r($vlan['names']);
echo '<tr>';
echo '<td>' . $vlan_id . '</td>';
echo '<td>' . generate_link($first_vlan, ['page' => 'vlan', 'vlan_id' => $vlan_id]) . '</td>';
echo '<td><span class="label label-primary">' . $vlan['counts']['devices'] . '</span></td>';
echo '<td><span class="label label-suppressed">' . $vlan['counts']['ports_tagged'] . '</span>
<span class="label label-success">' . $vlan['counts']['ports_untagged'] . '</span></td>';
echo '<td><span class="label label-warning">' . $vlan['counts']['macs'] . '</span></td>';
echo '</tr>';
}
echo '</table>';
echo generate_box_close();
//r($vlans);
} else {
// Per-VLAN page
/* FIXME. unsed here?
foreach (dbFetchRows("SELECT `vlan_vlan`, `vlan_name` FROM `vlans`") as $vlan) {
$vlans[$vlan['vlan_vlan']]['names'][$vlan['vlan_name']]++;
}
*/
$count_untagged = dbFetchCell("SELECT COUNT(*) FROM `ports` WHERE `ifVlan` = ?", [$vars['vlan_id']]);
$count_device = dbFetchCell("SELECT COUNT(DISTINCT(`device_id`)) FROM `vlans` WHERE `vlan_vlan` = ?", [$vars['vlan_id']]);
$count_tagged = dbFetchCell("SELECT COUNT(*) FROM `ports_vlans` WHERE `vlan` = ?", [$vars['vlan_id']]);
$count_mac = dbFetchCell("SELECT COUNT(DISTINCT(`mac_address`)) AS `count` FROM `vlans_fdb` WHERE `vlan_id` = ?", [$vars['vlan_id']]);
echo generate_box_open();
echo '
<table class="table table-hover table-striped vertical-align">
<tbody>
<tr class="up">
<td class="state-marker"></td>
<td style="padding: 10px 14px;"><span style="font-size: 20px; color: #193d7f;">VLAN ' . escape_html($vars['vlan_id']) . '</span>
</td>
<td>
</td>
<td style="text-align: right;">
<div class="btn-group" style="margin: 5px;">
<div class="btn btn-sm btn-default"><strong>Devices</strong></div>
<div class="btn btn-sm btn-default">' . $count_device . '</div>
</div>
<div class="btn-group" style="margin: 5px;">
<div class="btn btn-sm btn-default"><strong>Tagged Ports</strong></div>
<div class="btn btn-sm btn-danger">' . $count_tagged . '</div>
</div>
<div class="btn-group" style="margin: 5px;">
<div class="btn btn-sm btn-default"><strong>Untagged Ports</strong></div>
<div class="btn btn-sm btn-info">' . $count_untagged . '</div>
</div>
<div class="btn-group" style="margin: 5px;">
<div class="btn btn-sm btn-default"><strong>MACs</strong></div>
<div class="btn btn-sm btn-primary">' . $count_mac . '</div>
</div>
</td>
</tr>
</tbody>
</table>';
echo generate_box_close();
$navbar = ['brand' => "VLAN " . $vars['vlan_id'], 'class' => "navbar-narrow"];
$navbar['options']['devices']['text'] = 'Devices';
//$navbar['options']['untagged']['text'] = 'Untagged Ports';
//$navbar['options']['tagged']['text'] = 'Tagged Ports';
$navbar['options']['macs']['text'] = 'MAC Addresses';
foreach ($navbar['options'] as $option => $array) {
if (!isset($vars['view'])) {
$vars['view'] = "devices";
}
if ($vars['view'] == $option) {
$navbar['options'][$option]['class'] .= " active";
}
$navbar['options'][$option]['url'] = generate_url($vars, ['view' => $option]);
}
$navbar['options']['vlans']['text'] = "Back to VLANs";
$navbar['options']['vlans']['icon'] = "icon-angle-left";
$navbar['options']['vlans']['url'] = generate_url(['page' => 'vlan']);
$navbar['options']['vlans']['right'] = TRUE;
print_navbar($navbar);
unset($navbar);
switch ($vars['view']) {
case "tagged":
break;
case "untagged":
break;
case "macs":
echo generate_box_open();
echo '<table class="table table-striped table-hover">';
echo '<tr>';
echo '<th width="200">MAC Address</th>';
echo '<th width="80">Devices</th>';
echo '<th width="80">Entries</th>';
echo '<th>Device</th>';
echo '<th>Port</th>';
echo '</tr>';
$macs = dbFetchRows("SELECT *, COUNT(DISTINCT(`mac_address`)) AS `count`, COUNT(DISTINCT(`device_id`)) AS `device_count` FROM `vlans_fdb` WHERE `vlan_id` = ? GROUP BY `mac_address`", [$vars['vlan_id']]);
$mac_list = array_column($macs, 'mac_address');
$sql = "SELECT * FROM ports, devices WHERE 1 ";
$sql .= generate_query_values_and($mac_list, 'ifPhysAddress');
$sql .= " AND ports.device_id = devices.device_id";
$ports = [];
foreach (dbFetchRows($sql) as $p) {
$ports[$p['ifPhysAddress']] = $p;
}
foreach ($macs as $mac) {
echo '<tr>';
echo '<td>' . format_mac($mac['mac_address']) . '</td>';
echo '<td><span class="label label-warning">' . $mac['device_count'] . '</span></td>';
echo '<td><span class="label label-success">' . $mac['count'] . '</span></td>';
echo '<td>' . (isset($ports[$mac['mac_address']]) ? generate_device_link($ports[$mac['mac_address']]) : '') . '</td>';
echo '<td>' . (isset($ports[$mac['mac_address']]) ? generate_port_link($ports[$mac['mac_address']]) : '') . '</td>';
echo '<td>' . ((isset($ports[$mac['mac_address']]) && strlen($ports[$mac['mac_address']]['ifAlias'])) ? '<small>' . $ports[$mac['mac_address']]['ifAlias'] . '</small>' : '') . '</td>';
echo '</tr>';
}
echo '</table>';
break;
case "devices":
default:
$devices = dbFetchRows("SELECT * FROM `vlans` LEFT JOIN `devices` USING (`device_id`) WHERE `vlan_vlan` = ? ORDER BY `hostname`", [ $vars['vlan_id'] ]);
echo generate_box_open();
echo '<table class="table table-striped table-hover">';
echo '<tr>';
echo '<th class="state-marker"></th>';
echo '<th></th>';
echo '<th width="80">Device</th>';
echo '<th width="80">Hardware</th>';
echo '<th>OS</th>';
echo '<th>Uptime</th>';
echo '</tr>';
foreach ($devices as $device) {
//$device = device_by_id_cache($device_id);
print_device_row($device, [], [ 'tab' => 'vlans' ]);
}
echo '</table>';
}
}
// EOF