Files
librenms-librenms/includes/discovery/cisco-pw.inc.php
PipoCanaja d1ee543b6b bug - Fixing 'cisco-pw' cpwVcMplsPeerLdpID (#16268)
* fix for cpwVcMplsPeerLdpID in IP form

* tests
2024-08-03 12:57:33 -05:00

74 lines
3.1 KiB
PHP

<?php
use LibreNMS\Config;
if (Config::get('enable_pseudowires') && $device['os_group'] == 'cisco') {
$pws_db = [];
// Pre-cache the existing state of pseudowires for this device from the database
$pws_db_raw = dbFetchRows('SELECT * FROM `pseudowires` WHERE `device_id` = ?', [$device['device_id']]);
foreach ($pws_db_raw as $pw_db) {
$pws_db[$pw_db['cpwVcID']] = $pw_db['pseudowire_id'];
}
$pws = snmpwalk_cache_oid($device, 'cpwVcID', [], 'CISCO-IETF-PW-MPLS-MIB');
$pws = snmpwalk_cache_oid($device, 'cpwVcName', $pws, 'CISCO-IETF-PW-MPLS-MIB');
$pws = snmpwalk_cache_oid($device, 'cpwVcType', $pws, 'CISCO-IETF-PW-MPLS-MIB');
$pws = snmpwalk_cache_oid($device, 'cpwVcPsnType', $pws, 'CISCO-IETF-PW-MPLS-MIB');
$pws = snmpwalk_cache_oid($device, 'cpwVcDescr', $pws, 'CISCO-IETF-PW-MPLS-MIB');
// For MPLS pseudowires
$pws = snmpwalk_cache_oid($device, 'cpwVcMplsPeerLdpID', $pws, 'CISCO-IETF-PW-MPLS-MIB');
foreach ($pws as $pw_id => $pw) {
// Added By Oirbsiu
// To correct Interface names that use escaped '/' e.g. GigabitEthernet0_4_0_12
// and translate the underscore back to a slash - e.g. GigabitEthernet0/4/0/12
// Thank you @murrant
$pw['cpwVcName'] = preg_replace('/(?<=\d)_(?=\d)/', '/', $pw['cpwVcName']);
// END
[$cpw_remote_id] = explode(':', $pw['cpwVcMplsPeerLdpID']);
if (\LibreNMS\Util\IPv4::isValid($cpw_remote_id)) {
//If cpwVcMplsPeerLdpID is in the IP form, then convert it to number to store it in DB to avoid failing
$cpw_remote_id = ip2long($cpw_remote_id);
}
$cpw_remote_device = dbFetchCell('SELECT device_id from ipv4_addresses AS A, ports AS I WHERE A.ipv4_address=? AND A.port_id=I.port_id', [$cpw_remote_id]);
$if_id = dbFetchCell('SELECT port_id from ports WHERE `ifDescr`=? AND `device_id`=?', [$pw['cpwVcName'], $device['device_id']]);
if (! empty($pws_db[$pw['cpwVcID']])) {
$pseudowire_id = $pws_db[$pw['cpwVcID']];
echo '.';
} else {
$pseudowire_id = dbInsert(
[
'device_id' => $device['device_id'],
'port_id' => $if_id,
'peer_device_id' => $cpw_remote_device,
'peer_ldp_id' => $cpw_remote_id,
'cpwVcID' => $pw['cpwVcID'],
'cpwOid' => $pw_id,
'pw_type' => $pw['cpwVcType'],
'pw_descr' => $pw['cpwVcDescr'],
'pw_psntype' => $pw['cpwVcPsnType'],
],
'pseudowires'
);
echo '+';
}
$device['pws'][$pw['cpwVcID']] = $pseudowire_id;
}//end foreach
// Cycle the list of pseudowires we cached earlier and make sure we saw them again.
foreach ($pws_db as $pw_id => $pseudowire_id) {
if (empty($device['pws'][$pw_id])) {
dbDelete('pseudowires', '`pseudowire_id` = ?', [$pseudowire_id]);
}
}
echo "\n";
} //end if
unset($pws_db, $pws_db_raw, $pw_db);