From ae15c8eb2ae62d935ff167978a18593023d6b414 Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Wed, 7 Sep 2022 15:33:29 -0500 Subject: [PATCH] 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 --- includes/html/pages/device/ports.inc.php | 21 ++- includes/html/pages/ports.inc.php | 169 +++-------------------- includes/html/pages/ports/graph.inc.php | 138 ++++++++++++++++++ includes/html/pages/ports/list.inc.php | 2 +- includes/html/print-interface.inc.php | 2 +- 5 files changed, 164 insertions(+), 168 deletions(-) diff --git a/includes/html/pages/device/ports.inc.php b/includes/html/pages/device/ports.inc.php index 8c7d0ff3a1..e12ae623b1 100644 --- a/includes/html/pages/device/ports.inc.php +++ b/includes/html/pages/device/ports.inc.php @@ -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) { diff --git a/includes/html/pages/ports.inc.php b/includes/html/pages/ports.inc.php index 32e4282118..13993e3fab 100644 --- a/includes/html/pages/ports.inc.php +++ b/includes/html/pages/ports.inc.php @@ -24,8 +24,7 @@ if (! isset($vars['format'])) { $vars['format'] = 'list_basic'; } -$displayLists = ''; -$displayLists .= 'Ports lists » '; +$displayLists = 'Ports lists » '; $menu_options = ['basic' => 'Basic', 'detail' => 'Detail']; @@ -86,8 +85,7 @@ $displayLists .= ' Purg $displayLists .= ''; if ((isset($vars['searchbar']) && $vars['searchbar'] != 'hide') || ! isset($vars['searchbar'])) { - $output = "
"; - $output .= "
"; + $output = ""; $output .= addslashes(csrf_field()); $output .= "
"; $output .= "
"; @@ -268,11 +266,8 @@ if ((isset($vars['searchbar']) && $vars['searchbar'] != 'hide') || ! isset($vars $output .= '
'; $output .= ''; - $output .= '
'; } -$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 "
Port ID {$vars['purge']} not found! Could not purge port.
"; - } - } - 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 "
Port ID {$vars['purge']} not found! Could not purge port.
"; } } } -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'; } diff --git a/includes/html/pages/ports/graph.inc.php b/includes/html/pages/ports/graph.inc.php index 605cc299ee..66ad536346 100644 --- a/includes/html/pages/ports/graph.inc.php +++ b/includes/html/pages/ports/graph.inc.php @@ -5,6 +5,144 @@ echo '
'; echo $displayLists; echo '
'; echo '
'; +echo '
'; +echo stripcslashes($output); +echo '
'; + +$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'); diff --git a/includes/html/pages/ports/list.inc.php b/includes/html/pages/ports/list.inc.php index ffccc24015..cb44d932ed 100644 --- a/includes/html/pages/ports/list.inc.php +++ b/includes/html/pages/ports/list.inc.php @@ -128,6 +128,6 @@ var grid = $("#ports").bootgrid({ url: '' }); -$(".actionBar").append(""); +$(".actionBar").append("
"); diff --git a/includes/html/print-interface.inc.php b/includes/html/print-interface.inc.php index b19f1b5b43..bc4eb8a06e 100644 --- a/includes/html/print-interface.inc.php +++ b/includes/html/print-interface.inc.php @@ -174,7 +174,7 @@ if (! empty($port_adsl['adslLineCoding'])) { echo ""; if ($port['ifPhysAddress'] && $port['ifPhysAddress'] != '') { - echo '' . \LibreNMS\Util\Rewrite::readableMac($port['ifPhysAddress']) . ''; + echo '' . $port->ifPhysAddress . ''; } else { echo '-'; }