mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
Port pages fixes and cleanups (#14310)
* Port pages fixes and cleanups Fix mac display on device port page Move ports query building into the graph page where it is used Add the filter ui to the all ports graphs pages * whitespace
This commit is contained in:
@@ -144,25 +144,20 @@ if ($vars['view'] == 'minigraphs') {
|
||||
|
||||
$i = '1';
|
||||
|
||||
global $port_cache, $port_index_cache;
|
||||
global $port_index_cache;
|
||||
|
||||
/** @var \Illuminate\Support\Collection<\App\Models\Port> $ports */
|
||||
$ports = DeviceCache::getPrimary()->ports()->orderBy('ifIndex')->isValid()->get();
|
||||
|
||||
$ports = dbFetchRows("SELECT * FROM `ports` WHERE `device_id` = ? AND `deleted` = '0' AND `disabled` = 0 ORDER BY `ifIndex` ASC", [$device['device_id']]);
|
||||
// As we've dragged the whole database, lets pre-populate our caches :)
|
||||
// FIXME - we should probably split the fetching of link/stack/etc into functions and cache them here too to cut down on single row queries.
|
||||
|
||||
foreach ($ports as $key => $port) {
|
||||
$port_cache[$port['port_id']] = $port;
|
||||
$port_index_cache[$port['device_id']][$port['ifIndex']] = $port;
|
||||
$ports[$key]['ifOctets_rate'] = $port['ifInOctets_rate'] + $port['ifOutOctets_rate'];
|
||||
}
|
||||
|
||||
switch ($vars['sort'] ?? '') {
|
||||
case 'traffic':
|
||||
$ports = array_sort_by_column($ports, 'ifOctets_rate', SORT_DESC);
|
||||
break;
|
||||
default:
|
||||
$ports = array_sort_by_column($ports, 'ifIndex', SORT_ASC);
|
||||
break;
|
||||
if (isset($vars['sort']) && $vars['sort'] == 'traffic') {
|
||||
$ports = $ports->sortByDesc(function (Port $port) {
|
||||
return $port->ifInOctets_rate + $port->ifOutOctets_rate;
|
||||
});
|
||||
}
|
||||
|
||||
foreach ($ports as $port) {
|
||||
|
||||
@@ -24,8 +24,7 @@ if (! isset($vars['format'])) {
|
||||
$vars['format'] = 'list_basic';
|
||||
}
|
||||
|
||||
$displayLists = '';
|
||||
$displayLists .= '<span style="font-weight: bold;">Ports lists</span> » ';
|
||||
$displayLists = '<span style="font-weight: bold;">Ports lists</span> » ';
|
||||
|
||||
$menu_options = ['basic' => 'Basic', 'detail' => 'Detail'];
|
||||
|
||||
@@ -86,8 +85,7 @@ $displayLists .= '<a href="ports/deleted=1/purge=all" title="Delete ports"> Purg
|
||||
$displayLists .= '</div>';
|
||||
|
||||
if ((isset($vars['searchbar']) && $vars['searchbar'] != 'hide') || ! isset($vars['searchbar'])) {
|
||||
$output = "<div class='pull-left'>";
|
||||
$output .= "<form method='post' action='' class='form-inline' role='form'>";
|
||||
$output = "<form method='post' action='' class='form-inline' role='form'>";
|
||||
$output .= addslashes(csrf_field());
|
||||
$output .= "<div style='margin-bottom:4px;text-align:left;'>";
|
||||
$output .= "<div class='form-group'>";
|
||||
@@ -268,11 +266,8 @@ if ((isset($vars['searchbar']) && $vars['searchbar'] != 'hide') || ! isset($vars
|
||||
$output .= '</div>';
|
||||
|
||||
$output .= '</form>';
|
||||
$output .= '</div>';
|
||||
}
|
||||
|
||||
$param = [];
|
||||
|
||||
if (! isset($vars['ignore'])) {
|
||||
$vars['ignore'] = '0';
|
||||
}
|
||||
@@ -283,158 +278,26 @@ if (! isset($vars['deleted'])) {
|
||||
$vars['deleted'] = '0';
|
||||
}
|
||||
|
||||
$where = '';
|
||||
$ignore_filter = 0;
|
||||
$disabled_filter = 0;
|
||||
|
||||
foreach ($vars as $var => $value) {
|
||||
if ($value != '') {
|
||||
switch ($var) {
|
||||
case 'hostname':
|
||||
$where .= ' AND D.hostname LIKE ?';
|
||||
$param[] = '%' . $value . '%';
|
||||
break;
|
||||
case 'location':
|
||||
if (is_int($value)) {
|
||||
$where .= ' AND L.id = ?';
|
||||
$param[] = $value;
|
||||
} else {
|
||||
$where .= ' AND L.location LIKE ?';
|
||||
$param[] = '%' . $value . '%';
|
||||
}
|
||||
break;
|
||||
case 'device_id':
|
||||
$where .= ' AND D.device_id = ?';
|
||||
$param[] = $value;
|
||||
break;
|
||||
case 'deleted':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= ' AND `I`.`deleted` = 1';
|
||||
$ignore_filter = 1;
|
||||
}
|
||||
break;
|
||||
case 'ignore':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= ' AND (I.ignore = 1 OR D.ignore = 1) AND I.deleted = 0';
|
||||
$ignore_filter = 1;
|
||||
}
|
||||
break;
|
||||
case 'disabled':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= ' AND `I`.`disabled` = 1 AND `I`.`deleted` = 0';
|
||||
$disabled_filter = 1;
|
||||
}
|
||||
break;
|
||||
case 'ifSpeed':
|
||||
if (is_numeric($value)) {
|
||||
$where .= " AND I.$var = ?";
|
||||
$param[] = $value;
|
||||
}
|
||||
break;
|
||||
case 'ifType':
|
||||
$where .= " AND I.$var = ?";
|
||||
$param[] = $value;
|
||||
break;
|
||||
case 'ifAlias':
|
||||
case 'port_descr_type':
|
||||
$where .= " AND I.$var LIKE ?";
|
||||
$param[] = '%' . $value . '%';
|
||||
break;
|
||||
case 'errors':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= " AND (I.`ifInErrors_delta` > '0' OR I.`ifOutErrors_delta` > '0')";
|
||||
}
|
||||
break;
|
||||
case 'state':
|
||||
if ($value == 'down') {
|
||||
$where .= ' AND I.ifAdminStatus = ? AND I.ifOperStatus = ?';
|
||||
$param[] = 'up';
|
||||
$param[] = 'down';
|
||||
} elseif ($value == 'up') {
|
||||
$where .= ' AND I.ifAdminStatus = ? AND I.ifOperStatus = ?';
|
||||
$param[] = 'up';
|
||||
$param[] = 'up';
|
||||
} elseif ($value == 'admindown') {
|
||||
$where .= ' AND I.ifAdminStatus = ? AND D.ignore = 0';
|
||||
$param[] = 'down';
|
||||
}
|
||||
break;
|
||||
case 'purge':
|
||||
if ($vars['purge'] === 'all') {
|
||||
Port::hasAccess(Auth::user())->with(['device' => function ($query) {
|
||||
$query->select('device_id', 'hostname');
|
||||
}])->isDeleted()->chunk(100, function ($ports) {
|
||||
foreach ($ports as $port) {
|
||||
$port->delete();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
try {
|
||||
Port::hasAccess(Auth::user())->where('port_id', $vars['purge'])->firstOrFail()->delete();
|
||||
} catch (ModelNotFoundException $e) {
|
||||
echo "<div class='alert alert-danger'>Port ID {$vars['purge']} not found! Could not purge port.</div>";
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'group':
|
||||
$where .= ' AND port_id IN (SELECT `port_id` FROM `port_group_port` WHERE `port_group_id` = ?)';
|
||||
$param[] = $vars['group'];
|
||||
break;
|
||||
if (isset($vars['purge'])) {
|
||||
if ($vars['purge'] === 'all') {
|
||||
Port::hasAccess(Auth::user())->with(['device' => function ($query) {
|
||||
$query->select('device_id', 'hostname');
|
||||
}])->isDeleted()->chunk(100, function ($ports) {
|
||||
foreach ($ports as $port) {
|
||||
$port->delete();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
try {
|
||||
Port::hasAccess(Auth::user())->where('port_id', $vars['purge'])->firstOrFail()->delete();
|
||||
} catch (ModelNotFoundException $e) {
|
||||
echo "<div class='alert alert-danger'>Port ID {$vars['purge']} not found! Could not purge port.</div>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($ignore_filter == 0 && $disabled_filter == 0) {
|
||||
$where .= ' AND `I`.`ignore` = 0 AND `I`.`disabled` = 0 AND `I`.`deleted` = 0';
|
||||
}
|
||||
|
||||
$query = 'SELECT * FROM `ports` AS I, `devices` AS D LEFT JOIN `locations` AS L ON D.location_id = L.id WHERE I.device_id = D.device_id' . $where;
|
||||
$row = 1;
|
||||
|
||||
[$format, $subformat] = explode('_', basename($vars['format']));
|
||||
|
||||
// only grab list of ports for graph pages, table uses ajax
|
||||
$ports = $format == 'graph' ? dbFetchRows($query, $param) : [];
|
||||
|
||||
switch ($vars['sort'] ?? '') {
|
||||
case 'traffic':
|
||||
$ports = array_sort_by_column($ports, 'ifOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'traffic_in':
|
||||
$ports = array_sort_by_column($ports, 'ifInOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'traffic_out':
|
||||
$ports = array_sort_by_column($ports, 'ifOutOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'packets':
|
||||
$ports = array_sort_by_column($ports, 'ifUcastPkts_rate', SORT_DESC);
|
||||
break;
|
||||
case 'packets_in':
|
||||
$ports = array_sort_by_column($ports, 'ifInUcastOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'packets_out':
|
||||
$ports = array_sort_by_column($ports, 'ifOutUcastOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'errors':
|
||||
$ports = array_sort_by_column($ports, 'ifErrors_rate', SORT_DESC);
|
||||
break;
|
||||
case 'speed':
|
||||
$ports = array_sort_by_column($ports, 'ifSpeed', SORT_DESC);
|
||||
break;
|
||||
case 'port':
|
||||
$ports = array_sort_by_column($ports, 'ifDescr', SORT_ASC);
|
||||
break;
|
||||
case 'media':
|
||||
$ports = array_sort_by_column($ports, 'ifType', SORT_ASC);
|
||||
break;
|
||||
case 'descr':
|
||||
$ports = array_sort_by_column($ports, 'ifAlias', SORT_ASC);
|
||||
break;
|
||||
case 'device':
|
||||
default:
|
||||
$ports = array_sort_by_column($ports, 'hostname', SORT_ASC);
|
||||
}
|
||||
|
||||
if (file_exists('includes/html/pages/ports/' . $format . '.inc.php')) {
|
||||
require 'includes/html/pages/ports/' . $format . '.inc.php';
|
||||
}
|
||||
|
||||
@@ -5,6 +5,144 @@ echo '<div class="panel-heading">';
|
||||
echo $displayLists;
|
||||
echo '</div>';
|
||||
echo '<div class="panel-body">';
|
||||
echo '<div style="padding-bottom: 10px;">';
|
||||
echo stripcslashes($output);
|
||||
echo '</div>';
|
||||
|
||||
$param = [];
|
||||
$where = '';
|
||||
$ignore_filter = 0;
|
||||
$disabled_filter = 0;
|
||||
|
||||
foreach ($vars as $var => $value) {
|
||||
if ($value != '') {
|
||||
switch ($var) {
|
||||
case 'hostname':
|
||||
$where .= ' AND D.hostname LIKE ?';
|
||||
$param[] = '%' . $value . '%';
|
||||
break;
|
||||
case 'location':
|
||||
if (is_int($value)) {
|
||||
$where .= ' AND L.id = ?';
|
||||
$param[] = $value;
|
||||
} else {
|
||||
$where .= ' AND L.location LIKE ?';
|
||||
$param[] = '%' . $value . '%';
|
||||
}
|
||||
break;
|
||||
case 'device_id':
|
||||
$where .= ' AND D.device_id = ?';
|
||||
$param[] = $value;
|
||||
break;
|
||||
case 'deleted':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= ' AND `I`.`deleted` = 1';
|
||||
$ignore_filter = 1;
|
||||
}
|
||||
break;
|
||||
case 'ignore':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= ' AND (I.ignore = 1 OR D.ignore = 1) AND I.deleted = 0';
|
||||
$ignore_filter = 1;
|
||||
}
|
||||
break;
|
||||
case 'disabled':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= ' AND `I`.`disabled` = 1 AND `I`.`deleted` = 0';
|
||||
$disabled_filter = 1;
|
||||
}
|
||||
break;
|
||||
case 'ifSpeed':
|
||||
if (is_numeric($value)) {
|
||||
$where .= " AND I.$var = ?";
|
||||
$param[] = $value;
|
||||
}
|
||||
break;
|
||||
case 'ifType':
|
||||
$where .= " AND I.$var = ?";
|
||||
$param[] = $value;
|
||||
break;
|
||||
case 'ifAlias':
|
||||
case 'port_descr_type':
|
||||
$where .= " AND I.$var LIKE ?";
|
||||
$param[] = '%' . $value . '%';
|
||||
break;
|
||||
case 'errors':
|
||||
if ($value == 1 || $value == 'yes') {
|
||||
$where .= " AND (I.`ifInErrors_delta` > '0' OR I.`ifOutErrors_delta` > '0')";
|
||||
}
|
||||
break;
|
||||
case 'state':
|
||||
if ($value == 'down') {
|
||||
$where .= ' AND I.ifAdminStatus = ? AND I.ifOperStatus = ?';
|
||||
$param[] = 'up';
|
||||
$param[] = 'down';
|
||||
} elseif ($value == 'up') {
|
||||
$where .= ' AND I.ifAdminStatus = ? AND I.ifOperStatus = ?';
|
||||
$param[] = 'up';
|
||||
$param[] = 'up';
|
||||
} elseif ($value == 'admindown') {
|
||||
$where .= ' AND I.ifAdminStatus = ? AND D.ignore = 0';
|
||||
$param[] = 'down';
|
||||
}
|
||||
break;
|
||||
case 'group':
|
||||
$where .= ' AND port_id IN (SELECT `port_id` FROM `port_group_port` WHERE `port_group_id` = ?)';
|
||||
$param[] = $vars['group'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($ignore_filter == 0 && $disabled_filter == 0) {
|
||||
$where .= ' AND `I`.`ignore` = 0 AND `I`.`disabled` = 0 AND `I`.`deleted` = 0';
|
||||
}
|
||||
|
||||
$query = 'SELECT * FROM `ports` AS I, `devices` AS D LEFT JOIN `locations` AS L ON D.location_id = L.id WHERE I.device_id = D.device_id' . $where;
|
||||
|
||||
// only grab list of ports for graph pages, table uses ajax
|
||||
$ports = array_map(function ($value) {
|
||||
return (array) $value;
|
||||
}, DB::select($query, $param));
|
||||
|
||||
switch ($vars['sort'] ?? '') {
|
||||
case 'traffic':
|
||||
$ports = array_sort_by_column($ports, 'ifOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'traffic_in':
|
||||
$ports = array_sort_by_column($ports, 'ifInOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'traffic_out':
|
||||
$ports = array_sort_by_column($ports, 'ifOutOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'packets':
|
||||
$ports = array_sort_by_column($ports, 'ifUcastPkts_rate', SORT_DESC);
|
||||
break;
|
||||
case 'packets_in':
|
||||
$ports = array_sort_by_column($ports, 'ifInUcastOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'packets_out':
|
||||
$ports = array_sort_by_column($ports, 'ifOutUcastOctets_rate', SORT_DESC);
|
||||
break;
|
||||
case 'errors':
|
||||
$ports = array_sort_by_column($ports, 'ifErrors_rate', SORT_DESC);
|
||||
break;
|
||||
case 'speed':
|
||||
$ports = array_sort_by_column($ports, 'ifSpeed', SORT_DESC);
|
||||
break;
|
||||
case 'port':
|
||||
$ports = array_sort_by_column($ports, 'ifDescr', SORT_ASC);
|
||||
break;
|
||||
case 'media':
|
||||
$ports = array_sort_by_column($ports, 'ifType', SORT_ASC);
|
||||
break;
|
||||
case 'descr':
|
||||
$ports = array_sort_by_column($ports, 'ifAlias', SORT_ASC);
|
||||
break;
|
||||
case 'device':
|
||||
default:
|
||||
$ports = array_sort_by_column($ports, 'hostname', SORT_ASC);
|
||||
}
|
||||
|
||||
foreach ($ports as $port) {
|
||||
$speed = \LibreNMS\Util\Number::formatSi($port['ifSpeed'], 2, 3, 'bps');
|
||||
|
||||
@@ -128,6 +128,6 @@ var grid = $("#ports").bootgrid({
|
||||
url: '<?php echo route('table.ports') ?>'
|
||||
});
|
||||
|
||||
$(".actionBar").append("<?php echo $output; ?>");
|
||||
$(".actionBar").append("<div class=\"pull-left\"><?php echo $output; ?></div>");
|
||||
|
||||
</script>
|
||||
|
||||
@@ -174,7 +174,7 @@ if (! empty($port_adsl['adslLineCoding'])) {
|
||||
|
||||
echo "</td><td width=150 onclick=\"location.href='" . generate_port_url($port) . "'\" >";
|
||||
if ($port['ifPhysAddress'] && $port['ifPhysAddress'] != '') {
|
||||
echo '<span class=box-desc>' . \LibreNMS\Util\Rewrite::readableMac($port['ifPhysAddress']) . '</span>';
|
||||
echo '<span class=box-desc>' . $port->ifPhysAddress . '</span>';
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user