0 || $port['ifOutErrors_delta'] > 0) {
$error_img = generate_port_link($port, "", 'port_errors');
} else {
$error_img = '';
}
if (dbFetchCell('SELECT COUNT(*) FROM `mac_accounting` WHERE `port_id` = ?', [$port['port_id']])) {
$mac = " 'macaccounting']) . "'>";
} else {
$mac = '';
}
echo "
";
if (Auth::user()->hasGlobalRead()) {
$port_data = array_to_htmljson($port);
echo '';
}
echo '
' . generate_port_link($port, $port['label']) . " $error_img $mac
" . $port['ifAlias'] . '';
if ($port['ifAlias']) {
echo ' ';
}
unset($break);
if ($port_details) {
foreach (dbFetchRows('SELECT * FROM `ipv4_addresses` WHERE `port_id` = ?', [$port['port_id']]) as $ip) {
echo "$break " . $ip['ipv4_address'] . '/' . $ip['ipv4_prefixlen'] . '';
$break = ' ';
}
foreach (dbFetchRows('SELECT * FROM `ipv6_addresses` WHERE `port_id` = ?', [$port['port_id']]) as $ip6) {
echo "$break " . IP::parse($ip6['ipv6_address'], true) . '/' . $ip6['ipv6_prefixlen'] . '';
$break = ' ';
}
}
echo '';
$port_group_name_list = Port::find($port['port_id'])->groups->pluck('name')->toArray() ?: ['Default'];
echo ' | ';
echo implode(' ', $port_group_name_list);
echo " | ";
if ($port_details) {
$port['graph_type'] = 'port_bits';
echo generate_port_link($port, " ");
$port['graph_type'] = 'port_upkts';
echo generate_port_link($port, " ");
$port['graph_type'] = 'port_errors';
echo generate_port_link($port, " ");
}
echo " | ";
if ($port['ifOperStatus'] == 'up') {
$port['in_rate'] = ($port['ifInOctets_rate'] * 8);
$port['out_rate'] = ($port['ifOutOctets_rate'] * 8);
$in_perc = empty($port['ifSpeed']) ? 0 : round(($port['in_rate'] / $port['ifSpeed'] * 100));
$out_perc = empty($port['ifSpeed']) ? 0 : round(($port['in_rate'] / $port['ifSpeed'] * 100));
echo " " . Number::formatSi($port['in_rate'], 2, 3, 'bps') . "
" . Number::formatSi($port['out_rate'], 2, 3, 'bps') . "
" . Number::formatBi($port['ifInUcastPkts_rate'], 2, 3, 'pps') . "
" . Number::formatBi($port['ifOutUcastPkts_rate'], 2, 3, 'pps') . '';
}
echo " | ";
if ($port['ifSpeed']) {
echo '' . \LibreNMS\Util\Number::formatSi($port['ifSpeed'], 2, 3, 'bps') . '';
}
echo ' ';
if ($port['ifDuplex'] != 'unknown') {
echo '' . $port['ifDuplex'] . '';
} else {
echo '-';
}
$vlans = dbFetchColumn(
'SELECT vlan FROM `ports_vlans` AS PV, vlans AS V ' .
'WHERE PV.`port_id`=? AND PV.`device_id`=? AND V.`vlan_vlan`=PV.vlan AND V.device_id = PV.device_id',
[$port['port_id'], $device['device_id']]
);
$vlan_count = count($vlans);
if ($vlan_count > 1) {
echo 'VLANs: ';
echo $vlan_count;
echo ' ';
} elseif ($vlan_count == 1 || $port['ifVlan']) {
echo 'VLAN: ';
echo $vlans[0] ?: $port['ifVlan'];
echo ' ';
} elseif ($port['ifVrf']) {
$vrf = dbFetchRow('SELECT * FROM vrfs WHERE vrf_id = ?', [$port['ifVrf']]);
echo "" . $vrf['vrf_name'] . ' ';
}//end if
if ($port_adsl['adslLineCoding']) {
echo " | ";
echo $port_adsl['adslLineCoding'] . '/' . rewrite_adslLineType($port_adsl['adslLineType']);
echo ' ';
// ATU-C is CO -> ATU-C TX is the download speed for the CPE
// ATU-R is the CPE -> ATU-R TX is the upload speed of the CPE
echo 'Sync:' . Number::formatSi($port_adsl['adslAtucChanCurrTxRate'], 2, 3, 'bps') . '/' . Number::formatSi($port_adsl['adslAturChanCurrTxRate'], 2, 3, 'bps');
echo ' ';
// This is the Receive Max AttainableRate, so :
// adslAturCurrAttainableRate is DownloadMaxRate
// adslAtucCurrAttainableRate is UploadMaxRate
echo 'Max:' . Number::formatSi($port_adsl['adslAturCurrAttainableRate'], 2, 3, 'bps') . '/' . Number::formatSi($port_adsl['adslAtucCurrAttainableRate'], 2, 3, 'bps');
echo " | ";
echo 'Atten:' . $port_adsl['adslAturCurrAtn'] . 'dB/' . $port_adsl['adslAtucCurrAtn'] . 'dB';
echo ' ';
echo 'SNR:' . $port_adsl['adslAturCurrSnrMgn'] . 'dB/' . $port_adsl['adslAtucCurrSnrMgn'] . 'dB';
} else {
echo " | ";
if ($port['ifType'] && $port['ifType'] != '') {
echo '' . \LibreNMS\Util\Rewrite::normalizeIfType($port['ifType']) . '';
} else {
echo '-';
}
echo ' ';
if ($ifHardType && $ifHardType != '') {
echo '' . $ifHardType . '';
} else {
echo '-';
}
echo " | ";
if ($port['ifPhysAddress'] && $port['ifPhysAddress'] != '') {
echo '' . \LibreNMS\Util\Rewrite::readableMac($port['ifPhysAddress']) . '';
} else {
echo '-';
}
echo ' ';
if ($port['ifMtu'] && $port['ifMtu'] != '') {
echo 'MTU ' . $port['ifMtu'] . '';
} else {
echo '-';
}
}//end if
echo ' | ';
echo '';
$neighborsCount = 0;
$nbLinks = 0;
$int_links = [];
if (strpos($port['label'], 'oopback') === false && ! $graph_type) {
foreach (dbFetchRows('SELECT * FROM `links` AS L, `ports` AS I, `devices` AS D WHERE L.local_port_id = ? AND L.remote_port_id = I.port_id AND I.device_id = D.device_id', [$if_id]) as $link) {
$int_links[$link['port_id']] = $link['port_id'];
$int_links_phys[$link['port_id']] = 1;
$nbLinks++;
}
unset($br);
if ($port_details && Config::get('enable_port_relationship') === true) {
// Show which other devices are on the same subnet as this interface
foreach (dbFetchRows("SELECT `ipv4_network_id` FROM `ipv4_addresses` WHERE `port_id` = ? AND `ipv4_address` NOT LIKE '127.%'", [$port['port_id']]) as $net) {
$ipv4_network_id = $net['ipv4_network_id'];
$sql = 'SELECT I.port_id FROM ipv4_addresses AS A, ports AS I, devices AS D
WHERE A.port_id = I.port_id
AND A.ipv4_network_id = ? AND D.device_id = I.device_id
AND D.device_id != ?';
$array = [
$net['ipv4_network_id'],
$device['device_id'],
];
foreach (dbFetchRows($sql, $array) as $new) {
echo $new['ipv4_network_id'];
$this_ifid = $new['port_id'];
$this_hostid = $new['device_id'];
$this_hostname = $new['hostname'];
$this_ifname = \LibreNMS\Util\Rewrite::normalizeIfName($new['label']);
$int_links[$this_ifid] = $this_ifid;
$int_links_v4[$this_ifid] = 1;
}
}//end foreach
foreach (dbFetchRows('SELECT ipv6_network_id FROM ipv6_addresses WHERE port_id = ?', [$port['port_id']]) as $net) {
$ipv6_network_id = $net['ipv6_network_id'];
$sql = "SELECT I.port_id FROM ipv6_addresses AS A, ports AS I, devices AS D
WHERE A.port_id = I.port_id
AND A.ipv6_network_id = ? AND D.device_id = I.device_id
AND D.device_id != ? AND A.ipv6_origin != 'linklayer' AND A.ipv6_origin != 'wellknown'";
$array = [
$net['ipv6_network_id'],
$device['device_id'],
];
foreach (dbFetchRows($sql, $array) as $new) {
echo $new['ipv6_network_id'];
$this_ifid = $new['port_id'];
$this_hostid = $new['device_id'];
$this_hostname = $new['hostname'];
$this_ifname = \LibreNMS\Util\Rewrite::normalizeIfName($new['label']);
$int_links[$this_ifid] = $this_ifid;
$int_links_v6[$this_ifid] = 1;
}
}//end foreach
}//end if
if (count($int_links) > 3) {
echo '
';
}
if ($port_details && Config::get('enable_port_relationship') === true && port_permitted($int_link, $device['device_id'])) {
foreach ($int_links as $int_link) {
$neighborsCount++;
if ($neighborsCount == 4) {
echo '[...]';
echo '';
echo '';
}
$link_if = dbFetchRow('SELECT * from ports AS I, devices AS D WHERE I.device_id = D.device_id and I.port_id = ?', [$int_link]);
$link_if = cleanPort($link_if);
echo "$br";
if ($int_links_phys[$int_link]) {
echo " ";
} else {
echo " ";
}
echo '' . generate_port_link($link_if, makeshortif($link_if['label'])) . ' on ' . generate_device_link($link_if);
if ($int_links_v6[$int_link]) {
echo " v6";
}
if ($int_links_v4[$int_link]) {
echo " v4";
}
$br = ' ';
}//end foreach
}//end if
// unset($int_links, $int_links_v6, $int_links_v4, $int_links_phys, $br);
}//end if
if ($port_details && Config::get('enable_port_relationship') === true && port_permitted($port['port_id'], $device['device_id'])) {
foreach (dbFetchRows('SELECT * FROM `pseudowires` WHERE `port_id` = ?', [$port['port_id']]) as $pseudowire) {
// `port_id`,`peer_device_id`,`peer_ldp_id`,`cpwVcID`,`cpwOid`
$pw_peer_dev = dbFetchRow('SELECT * FROM `devices` WHERE `device_id` = ?', [$pseudowire['peer_device_id']]);
$pw_peer_int = dbFetchRow('SELECT * FROM `ports` AS I, pseudowires AS P WHERE I.device_id = ? AND P.cpwVcID = ? AND P.port_id = I.port_id', [$pseudowire['peer_device_id'], $pseudowire['cpwVcID']]);
$pw_peer_int = cleanPort($pw_peer_int);
echo "$br " . generate_port_link($pw_peer_int, makeshortif($pw_peer_int['label'])) . ' on ' . generate_device_link($pw_peer_dev) . '';
$br = ' ';
}
foreach (dbFetchRows('SELECT * FROM `ports` WHERE `pagpGroupIfIndex` = ? and `device_id` = ?', [$port['ifIndex'], $device['device_id']]) as $member) {
$member = cleanPort($member);
echo "$br " . generate_port_link($member) . ' (PAgP)';
$br = ' ';
}
if ($port['pagpGroupIfIndex'] && $port['pagpGroupIfIndex'] != $port['ifIndex']) {
$parent = dbFetchRow('SELECT * FROM `ports` WHERE `ifIndex` = ? and `device_id` = ?', [$port['pagpGroupIfIndex'], $device['device_id']]);
$parent = cleanPort($parent);
echo "$br " . generate_port_link($parent) . ' (PAgP)';
$br = ' ';
}
foreach (dbFetchRows('SELECT * FROM `ports_stack` WHERE `port_id_low` = ? and `device_id` = ?', [$port['ifIndex'], $device['device_id']]) as $higher_if) {
if ($higher_if['port_id_high']) {
$this_port = get_port_by_index_cache($device['device_id'], $higher_if['port_id_high']);
$this_port = cleanPort($this_port);
echo "$br " . generate_port_link($this_port) . '';
$br = ' ';
}
}
foreach (dbFetchRows('SELECT * FROM `ports_stack` WHERE `port_id_high` = ? and `device_id` = ?', [$port['ifIndex'], $device['device_id']]) as $lower_if) {
if ($lower_if['port_id_low']) {
$this_port = get_port_by_index_cache($device['device_id'], $lower_if['port_id_low']);
$this_port = cleanPort($this_port);
echo "$br " . generate_port_link($this_port) . '';
$br = ' ';
}
}
}//end if
unset($int_links, $int_links_v6, $int_links_v4, $int_links_phys, $br);
if ($nbLinks > 3) {
echo ' ';
}
echo ' |
';
// If we're showing graphs, generate the graph and print the img tags
if ($graph_type == 'etherlike') {
$graph_file = get_port_rrdfile_path($device['hostname'], $if_id, 'dot3');
} else {
$graph_file = get_port_rrdfile_path($device['hostname'], $if_id);
}
if ($graph_type && is_file($graph_file)) {
$type = $graph_type;
echo "