Commit version 24.12.13800
This commit is contained in:
@ -6,71 +6,75 @@
|
||||
*
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
|
||||
* @copyright (C) Adam Armstrong
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @var array $device
|
||||
* @var string $mib
|
||||
* @var array $entry
|
||||
* @var string $bgpLocalAs
|
||||
* @var array $device
|
||||
* @var string $mib
|
||||
* @var array $entry
|
||||
* @var string $bgpLocalAs
|
||||
* @var integer $cisco_version Come from cisco-bgp4-mib.inc.php
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var string $vrf_name
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var string $vrf_name
|
||||
*/
|
||||
|
||||
// All MIBs except CISCO-BGP4-MIB (table version 2)
|
||||
if (isset($cisco_version) && $cisco_version > 1) {
|
||||
return;
|
||||
if ($check_vrfs) {
|
||||
if (isset($cisco_version_vrf[$vrf_name]) && $cisco_version_vrf[$vrf_name] > 1) {
|
||||
print_debug("BGP4-MIB skipped because use CISCO-BGP4-MIB table version 2 (VRF: $vrf_name).");
|
||||
|
||||
return;
|
||||
}
|
||||
} elseif (isset($cisco_version) && $cisco_version > 1) {
|
||||
print_debug("BGP4-MIB skipped because use CISCO-BGP4-MIB table version 2.");
|
||||
return;
|
||||
}
|
||||
if (is_device_mib($device, 'CUMULUS-BGPUN-MIB')) {
|
||||
// CUMULUS-BGPUN-MIB is copy-paste of BGP4-MIB
|
||||
return;
|
||||
if (is_device_mib($device, [ 'CUMULUS-BGPUN-MIB', 'CUMULUS-BGPVRF-MIB' ])) {
|
||||
// CUMULUS-BGPUN-MIB is copy-paste of BGP4-MIB
|
||||
return;
|
||||
}
|
||||
|
||||
$peers_data = snmpwalk_cache_oid($device, 'bgpPeerRemoteAs', [], 'BGP4-MIB');
|
||||
//$peers_data = snmpwalk_cache_oid($device, 'bgpPeerRemoteAddr', $peers_data, 'BGP4-MIB');
|
||||
if ($device['os'] === 'fortigate') {
|
||||
// Fetch remote addr on fortigate and aruba devices, because incorrect indexes
|
||||
$peers_data = snmpwalk_cache_oid($device, 'bgpPeerRemoteAddr', $peers_data, 'BGP4-MIB');
|
||||
}
|
||||
$peers_data = snmpwalk_cache_oid($device, 'bgpPeerLocalAddr', $peers_data, 'BGP4-MIB');
|
||||
$peers_data = snmpwalk_cache_oid($device, 'bgpPeerIdentifier', $peers_data, 'BGP4-MIB');
|
||||
$peers_data = snmpwalk_cache_oid($device, 'bgpPeerAdminStatus', $peers_data, 'BGP4-MIB');
|
||||
|
||||
foreach ($peers_data as $index => $bgp4_entry) {
|
||||
$index_parts = explode('.', $index);
|
||||
if (safe_count($index_parts) > 4) {
|
||||
// Aruba case:
|
||||
// BGP4-MIB::bgpPeerRemoteAddr.4.18.1.23.109 = IpAddress: 18.1.23.109
|
||||
$ip_len = array_shift($index_parts);
|
||||
$peer_ip = implode('.', $index_parts);
|
||||
} else {
|
||||
$peer_ip = $index;
|
||||
}
|
||||
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
|
||||
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
|
||||
$peers_data[$index]['bgpPeerRemoteAs'] = $peer_as;
|
||||
}
|
||||
$local_ip = $bgp4_entry['bgpPeerLocalAddr'];
|
||||
parse_bgp_peer_index($bgp4_entry, $index, $mib);
|
||||
$peer_ip = $bgp4_entry['bgpPeerRemoteAddr'];
|
||||
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $bgp4_entry['bgpPeerIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'local_as' => $bgpLocalAs,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
$peerlist[] = $peer;
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
}
|
||||
// Process vendor specific issues
|
||||
bgp_fix_peer($device, $bgp4_entry, $mib);
|
||||
$peer_as = $bgp4_entry['bgpPeerRemoteAs'];
|
||||
$peers_data[$index]['bgpPeerRemoteAs'] = $peer_as;
|
||||
$local_ip = $bgp4_entry['bgpPeerLocalAddr'];
|
||||
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $bgp4_entry['bgpPeerIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'local_as' => $bgpLocalAs,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
$peerlist[] = $peer;
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
@ -4,88 +4,88 @@
|
||||
*
|
||||
* This file is part of Observium.
|
||||
*
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) Adam Armstrong
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @var array $config
|
||||
* @var array $device
|
||||
* @var array $config
|
||||
* @var array $device
|
||||
* @var string $mib
|
||||
* @var array $entry
|
||||
* @var array $entry
|
||||
* @var string $bgpLocalAs
|
||||
* @var array $peers_data from BGP4-MIB
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var array $peers_data from BGP4-MIB
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var string $vrf_name
|
||||
*/
|
||||
|
||||
// Common vendor specific
|
||||
$def = $config['mibs'][$mib]['bgp'];
|
||||
$def = $config['mibs'][$mib]['bgp'];
|
||||
$vendor_mib = $mib;
|
||||
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $def['oids']['PeerRemoteAs']['oid'], [], $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
if (safe_empty($vendor_bgp)) {
|
||||
$vendor_mib = FALSE; // Unset vendor_mib since not found on device
|
||||
$vendor_mib = FALSE; // Unset vendor_mib since not found on device
|
||||
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
// PeerRemoteAddr
|
||||
$vendor_oid = $def['oids']['PeerRemoteAddr']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid])) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
}
|
||||
// PeerLocalAddr
|
||||
$local_ips = [];
|
||||
$local_ips = [];
|
||||
$vendor_oid = $def['oids']['PeerLocalAddr']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid]) && strlen($vendor_oid)) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
} else {
|
||||
// LocalAddr trick, when not available in vendor table, by known device ip/network
|
||||
foreach (dbFetchRows('SELECT * FROM `ipv4_addresses` LEFT JOIN `ipv4_networks` USING(`ipv4_network_id`) WHERE `device_id` = ?', [ $device['device_id'] ]) as $ipv4) {
|
||||
$local_ips['ipv4'][$ipv4['ipv4_address']] = $ipv4['ipv4_network'];
|
||||
}
|
||||
foreach (dbFetchRows('SELECT * FROM `ipv6_addresses` LEFT JOIN `ipv6_networks` USING(`ipv6_network_id`) WHERE `device_id` = ?', [ $device['device_id'] ]) as $ipv6) {
|
||||
$local_ips['ipv6'][$ipv6['ipv6_address']] = $ipv6['ipv6_network'];
|
||||
}
|
||||
print_debug_vars($local_ips);
|
||||
// LocalAddr trick, when not available in vendor table, by known device ip/network
|
||||
foreach (dbFetchRows('SELECT * FROM `ipv4_addresses` LEFT JOIN `ipv4_networks` USING(`ipv4_network_id`) WHERE `device_id` = ?', [$device['device_id']]) as $ipv4) {
|
||||
$local_ips['ipv4'][$ipv4['ipv4_address']] = $ipv4['ipv4_network'];
|
||||
}
|
||||
foreach (dbFetchRows('SELECT * FROM `ipv6_addresses` LEFT JOIN `ipv6_networks` USING(`ipv6_network_id`) WHERE `device_id` = ?', [$device['device_id']]) as $ipv6) {
|
||||
$local_ips['ipv6'][$ipv6['ipv6_address']] = $ipv6['ipv6_network'];
|
||||
}
|
||||
print_debug_vars($local_ips);
|
||||
}
|
||||
// PeerIdentifier
|
||||
$vendor_oid = $def['oids']['PeerIdentifier']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid]) && !safe_empty($vendor_oid)) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
}
|
||||
// PeerLocalAs
|
||||
$vendor_oid = $def['oids']['PeerLocalAs']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid]) && !safe_empty($vendor_oid)) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
}
|
||||
// PeerAdminStatus
|
||||
$vendor_oid = $def['oids']['PeerAdminStatus']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid]) && !safe_empty($vendor_oid)) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
}
|
||||
// PeerRemoteAddrType
|
||||
$vendor_oid = $def['oids']['PeerRemoteAddrType']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid])) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
}
|
||||
// PeerIndex
|
||||
$vendor_oid = $def['oids']['PeerIndex']['oid'];
|
||||
if (!isset($def['index'][$vendor_oid]) && !safe_empty($vendor_oid)) {
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_bgp = snmpwalk_cache_oid($device, $vendor_oid, $vendor_bgp, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
}
|
||||
|
||||
// PrefixCountersSafi
|
||||
$vendor_oid = $def['oids']['PrefixCountersSafi']['oid'];
|
||||
if (!safe_empty($vendor_oid)) {
|
||||
$vendor_counters = snmpwalk_cache_oid($device, $vendor_oid, [], $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$vendor_counters = snmpwalk_cache_oid($device, $vendor_oid, [], $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
} else {
|
||||
$vendor_counters = NULL;
|
||||
$vendor_counters = NULL;
|
||||
}
|
||||
//print_vars($vendor_counters);
|
||||
|
||||
@ -98,127 +98,131 @@ $afis['ipv6'] = '2';
|
||||
//print_vars($vendor_bgp);
|
||||
print_debug("$vendor_mib Peers: ");
|
||||
foreach ($vendor_bgp as $idx => $vendor_entry) {
|
||||
if (!safe_empty($def['index'])) {
|
||||
parse_bgp_peer_index($vendor_entry, $idx, $vendor_mib);
|
||||
}
|
||||
$peer_ip = hex2ip($vendor_entry[$def['oids']['PeerRemoteAddr']['oid']]);
|
||||
$peer_addr_type = 'ipv' . get_ip_version($peer_ip);
|
||||
$local_ip = '';
|
||||
if (strlen($def['oids']['PeerLocalAddr']['oid'])) {
|
||||
$local_ip = hex2ip($vendor_entry[$def['oids']['PeerLocalAddr']['oid']]);
|
||||
} elseif (isset($local_ips[$peer_addr_type])) {
|
||||
// Trick for detect local ip by matching between device IPs network and peer ip
|
||||
// Actually for Huawei BGP peers
|
||||
foreach ($local_ips[$peer_addr_type] as $ip => $network) {
|
||||
if (match_network($peer_ip, $network)) {
|
||||
$local_ip = $ip;
|
||||
print_debug("Local IP: $ip. Matched Peer IP [$peer_ip] with device network [$network].");
|
||||
break;
|
||||
}
|
||||
if (!safe_empty($def['index'])) {
|
||||
parse_bgp_peer_index($vendor_entry, $idx, $vendor_mib);
|
||||
}
|
||||
}
|
||||
$local_as = isset($vendor_entry[$def['oids']['PeerLocalAs']['oid']]) ? snmp_dewrap32bit($vendor_entry[$def['oids']['PeerLocalAs']['oid']]) : $bgpLocalAs;
|
||||
$peer_as = $vendor_entry[$def['oids']['PeerRemoteAs']['oid']];
|
||||
|
||||
// index
|
||||
$vendor_oid = $def['oids']['PeerIndex']['oid'];
|
||||
if (empty($vendor_oid)) {
|
||||
$index = $idx;
|
||||
} else {
|
||||
$index = $vendor_entry[$vendor_oid];
|
||||
}
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $vendor_entry[$def['oids']['PeerIdentifier']['oid']],
|
||||
'local_ip' => $local_ip,
|
||||
'local_as' => $local_as,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $vendor_entry[$def['oids']['PeerAdminStatus']['oid']]
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
// Fix possible 32bit ASN for peers from BGP4-MIB
|
||||
// Brocade example:
|
||||
// BGP4-MIB::bgpPeerRemoteAs.27.122.122.4 = 23456
|
||||
// FOUNDRY-BGPV2-MIB::bgp4V2PeerRemoteAs.1.1.4.27.122.122.5.1.4.27.122.122.4 = 133189
|
||||
if (isset($p_list[$peer_ip])) {
|
||||
unset($p_list[$peer_ip]); // Clean old peer list
|
||||
$bgp4_peer_as = $peers_data[$peer_ip]['bgpPeerRemoteAs']; // BGP4-MIB
|
||||
if ($peer_as > $bgp4_peer_as) {
|
||||
//$peers_data[$peer_ip]['bgpPeerRemoteAs'] = $peer_as;
|
||||
// Yah, need to found and remove duplicate peer from $peerlist
|
||||
foreach ($peerlist as $key => $tmp) {
|
||||
if ($tmp['ip'] == $peer_ip && $tmp['as'] == $bgp4_peer_as) {
|
||||
unset($peerlist[$key]);
|
||||
break;
|
||||
}
|
||||
$peer_ip = hex2ip($vendor_entry[$def['oids']['PeerRemoteAddr']['oid']]);
|
||||
$peer_addr_type = 'ipv' . get_ip_version($peer_ip);
|
||||
$local_ip = '';
|
||||
if (strlen($def['oids']['PeerLocalAddr']['oid'])) {
|
||||
$local_ip = hex2ip($vendor_entry[$def['oids']['PeerLocalAddr']['oid']]);
|
||||
} elseif (isset($local_ips[$peer_addr_type])) {
|
||||
// Trick for detect local ip by matching between device IPs network and peer ip
|
||||
// Actually for Huawei BGP peers
|
||||
foreach ($local_ips[$peer_addr_type] as $ip => $network) {
|
||||
if (match_network($peer_ip, $network)) {
|
||||
$local_ip = $ip;
|
||||
print_debug("Local IP: $ip. Matched Peer IP [$peer_ip] with device network [$network].");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
$peerlist[] = $peer;
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
} elseif (isset($p_list[$peer_ip][$peer_as]) && $local_as != $bgpLocalAs) {
|
||||
// Find and replace local_as key in peer list if different local as
|
||||
// FIXME, Yah, $peerlist stored as simple array without indexed key, that why used derp per-peer loop
|
||||
foreach ($peerlist as $key => $tmp) {
|
||||
if ($tmp['ip'] == $peer_ip && $tmp['as'] == $peer_as) {
|
||||
$peerlist[$key]['local_as'] = $local_as;
|
||||
print_debug("Replaced Local AS for peer: $peer_ip (AS$peer_as, LocalIP: $local_ip) - AS$bgpLocalAs -> AS$local_as");
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print_debug("Vendor peer already found: $peer_ip");
|
||||
print_debug_vars($peer);
|
||||
}
|
||||
// Process vendor specific issues
|
||||
bgp_fix_peer($device, $vendor_entry, $vendor_mib);
|
||||
|
||||
// AFI/SAFI
|
||||
$vendor_oid = isset($def['index']['afi']) ? $def['index']['afi'] : $def['oids']['PeerRemoteAddrType']['oid'];
|
||||
$afi = $vendor_entry[$vendor_oid];
|
||||
$local_as = isset($vendor_entry[$def['oids']['PeerLocalAs']['oid']]) ? snmp_dewrap32bit($vendor_entry[$def['oids']['PeerLocalAs']['oid']]) : $bgpLocalAs;
|
||||
$peer_as = $vendor_entry[$def['oids']['PeerRemoteAs']['oid']];
|
||||
|
||||
if (isset($def['index']['safi'])) {
|
||||
$safi = $vendor_entry[$def['index']['safi']];
|
||||
// Here each table entry is uniq afi/safi, see HUAWEI-BGP-VPN-MIB
|
||||
if (isset($vendor_counters[$index])) {
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = 1;
|
||||
$peer_afis[$peer_ip][] = [ 'afi' => $afi, 'safi' => $safi, 'index' => $index ];
|
||||
//discovery_bgp_afisafi($device, $entry, $afi, $safi, $af_list);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($vendor_mib === 'VIPTELA-OPER-BGP') {
|
||||
// This mib has only one possible AFI/SAFI
|
||||
if (isset($vendor_counters[$index.'.0'])) {
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = 1;
|
||||
$peer_afis[$peer_ip][] = [ 'afi' => 'ipv4', 'safi' => 'unicast' ];
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Here can be multiple table entries for different afi/safi
|
||||
foreach ($config['routing_safis'] as $i => $safi_def) {
|
||||
$safi = $safi_def['name'];
|
||||
if (is_numeric($afi)) {
|
||||
$afi_num = $afi;
|
||||
$afi = $config['routing_afis'][$afi]['name'];
|
||||
// index
|
||||
$vendor_oid = $def['oids']['PeerIndex']['oid'];
|
||||
if (empty($vendor_oid)) {
|
||||
$index = $idx;
|
||||
} else {
|
||||
$afi_num = $config['routing_afis_name'][$afi];
|
||||
$index = $vendor_entry[$vendor_oid];
|
||||
}
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $vendor_entry[$def['oids']['PeerIdentifier']['oid']],
|
||||
'local_ip' => $local_ip,
|
||||
'local_as' => $local_as,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $vendor_entry[$def['oids']['PeerAdminStatus']['oid']]
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
// Fix possible 32bit ASN for peers from BGP4-MIB
|
||||
// Brocade example:
|
||||
// BGP4-MIB::bgpPeerRemoteAs.27.122.122.4 = 23456
|
||||
// FOUNDRY-BGPV2-MIB::bgp4V2PeerRemoteAs.1.1.4.27.122.122.5.1.4.27.122.122.4 = 133189
|
||||
if (isset($p_list[$peer_ip])) {
|
||||
unset($p_list[$peer_ip]); // Clean old peer list
|
||||
$bgp4_peer_as = $peers_data[$peer_ip]['bgpPeerRemoteAs']; // BGP4-MIB
|
||||
if ($peer_as > $bgp4_peer_as) {
|
||||
//$peers_data[$peer_ip]['bgpPeerRemoteAs'] = $peer_as;
|
||||
// Yah, need to found and remove duplicate peer from $peerlist
|
||||
foreach ($peerlist as $key => $tmp) {
|
||||
if ($tmp['ip'] == $peer_ip && $tmp['as'] == $bgp4_peer_as) {
|
||||
unset($peerlist[$key]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
$peerlist[] = $peer;
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
} elseif (isset($p_list[$peer_ip][$peer_as]) && $local_as != $bgpLocalAs) {
|
||||
// Find and replace local_as key in peer list if different local as
|
||||
// FIXME, Yah, $peerlist stored as simple array without indexed key, that why used derp per-peer loop
|
||||
foreach ($peerlist as $key => $tmp) {
|
||||
if ($tmp['ip'] == $peer_ip && $tmp['as'] == $peer_as) {
|
||||
$peerlist[$key]['local_as'] = $local_as;
|
||||
print_debug("Replaced Local AS for peer: $peer_ip (AS$peer_as, LocalIP: $local_ip) - AS$bgpLocalAs -> AS$local_as");
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print_debug("Vendor peer already found: $peer_ip");
|
||||
print_debug_vars($peer);
|
||||
}
|
||||
|
||||
if (isset($vendor_counters["$index.$afi_num.$i"])) {
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = 1;
|
||||
$peer_afis[$peer_ip][] = [ 'afi' => $afi, 'safi' => $safi, 'index' => $index ];
|
||||
//discovery_bgp_afisafi($device, $entry, $afi, $safi, $af_list);
|
||||
} else {
|
||||
print_debug("Did not find AFI/SAFI with index $index.$afi_num.$i");
|
||||
// AFI/SAFI
|
||||
$vendor_oid = isset($def['index']['afi']) ? $def['index']['afi'] : $def['oids']['PeerRemoteAddrType']['oid'];
|
||||
$afi = $vendor_entry[$vendor_oid];
|
||||
|
||||
if (isset($def['index']['safi'])) {
|
||||
$safi = $vendor_entry[$def['index']['safi']];
|
||||
// Here each table entry is uniq afi/safi, see HUAWEI-BGP-VPN-MIB
|
||||
if (isset($vendor_counters[$index])) {
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = 1;
|
||||
$peer_afis[$peer_ip][] = ['afi' => $afi, 'safi' => $safi, 'index' => $index];
|
||||
//discovery_bgp_afisafi($device, $entry, $afi, $safi, $af_list);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($vendor_mib === 'VIPTELA-OPER-BGP') {
|
||||
// This mib has only one possible AFI/SAFI
|
||||
if (isset($vendor_counters[$index . '.0'])) {
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = 1;
|
||||
$peer_afis[$peer_ip][] = ['afi' => 'ipv4', 'safi' => 'unicast'];
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Here can be multiple table entries for different afi/safi
|
||||
foreach ($config['routing_safis'] as $i => $safi_def) {
|
||||
$safi = $safi_def['name'];
|
||||
if (is_numeric($afi)) {
|
||||
$afi_num = $afi;
|
||||
$afi = $config['routing_afis'][$afi]['name'];
|
||||
} else {
|
||||
$afi_num = $config['routing_afis_name'][$afi];
|
||||
}
|
||||
|
||||
if (isset($vendor_counters["$index.$afi_num.$i"])) {
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = 1;
|
||||
$peer_afis[$peer_ip][] = ['afi' => $afi, 'safi' => $safi, 'index' => $index];
|
||||
//discovery_bgp_afisafi($device, $entry, $afi, $safi, $af_list);
|
||||
} else {
|
||||
print_debug("Did not find AFI/SAFI with index $index.$afi_num.$i");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
@ -4,133 +4,138 @@
|
||||
*
|
||||
* This file is part of Observium.
|
||||
*
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) Adam Armstrong
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @var array $device
|
||||
* @var array $device
|
||||
* @var string $mib
|
||||
* @var array $entry
|
||||
* @var array $entry
|
||||
* @var string $bgpLocalAs
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var string $vrf_name
|
||||
*/
|
||||
|
||||
$cisco_version = $entry['cisco_version'];
|
||||
|
||||
if ($check_vrfs) {
|
||||
// Derp, VRFs need separate versions, need in BGP4-MIB
|
||||
$cisco_version_vrf[$vrf_name] = $entry['cisco_version'];
|
||||
}
|
||||
|
||||
if ($cisco_version < 2) {
|
||||
// Get afi/safi and populate cbgp on cisco ios (xe/xr)
|
||||
$af_data = snmpwalk_cache_oid($device, 'cbgpPeerAddrFamilyName', [], 'CISCO-BGP4-MIB');
|
||||
// Get afi/safi and populate cbgp on cisco ios (xe/xr)
|
||||
$af_data = snmpwalk_cache_oid($device, 'cbgpPeerAddrFamilyName', [], 'CISCO-BGP4-MIB');
|
||||
} else {
|
||||
|
||||
// Check Cisco cbgpPeer2Table
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteAs', [], 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2LocalAddr', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
// Check Cisco cbgpPeer2Table
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteAs', [], 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2LocalAddr', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
|
||||
// Cisco vendor mib LocalAddr issue:
|
||||
// cbgpPeer2LocalAddr.ipv4."10.0.1.1" = "0B 8E 95 38 " --> 11.142.149.56
|
||||
// but should:
|
||||
// bgpPeerLocalAddr.10.0.1.1 = 10.0.1.3
|
||||
// Yah, Cisco you again added extra work for me? What mean this random numbers?
|
||||
$cisco_fix = snmpwalk_cache_oid($device, 'bgpPeerLocalAddr', [], 'BGP4-MIB');
|
||||
// Cisco vendor mib LocalAddr issue:
|
||||
// cbgpPeer2LocalAddr.ipv4."10.0.1.1" = "0B 8E 95 38 " --> 11.142.149.56
|
||||
// but should:
|
||||
// bgpPeerLocalAddr.10.0.1.1 = 10.0.1.3
|
||||
// Yah, Cisco you again added extra work for me? What mean this random numbers?
|
||||
$cisco_fix = snmpwalk_cache_oid($device, 'bgpPeerLocalAddr', [], 'BGP4-MIB');
|
||||
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteIdentifier', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2AdminStatus', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2LocalAs', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteIdentifier', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2AdminStatus', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2LocalAs', $cisco_peers, 'CISCO-BGP4-MIB');
|
||||
|
||||
print_debug("CISCO-BGP4-MIB Peers: ");
|
||||
foreach ($cisco_peers as $index => $cisco_entry) {
|
||||
list(, $peer_ip) = explode('.', $index, 2);
|
||||
$peer_ip = hex2ip($peer_ip);
|
||||
if (isset($cisco_fix[$peer_ip]) && strlen($cisco_fix[$peer_ip]['bgpPeerLocalAddr'])) {
|
||||
// Fix incorrect IPv4 local IPs
|
||||
$local_ip = $cisco_fix[$peer_ip]['bgpPeerLocalAddr'];
|
||||
} else {
|
||||
$local_ip = hex2ip($cisco_entry['cbgpPeer2LocalAddr']);
|
||||
}
|
||||
|
||||
$peer_as = $cisco_entry['cbgpPeer2RemoteAs'];
|
||||
$local_as = snmp_dewrap32bit($cisco_entry['cbgpPeer2LocalAs']);
|
||||
if ($local_as == 0) {
|
||||
// Per session local ASN can be zero if session down
|
||||
$local_as = $bgpLocalAs;
|
||||
}
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $cisco_entry['cbgpPeer2RemoteIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'local_as' => $local_as,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $cisco_entry['cbgpPeer2AdminStatus']
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
$peerlist[] = $peer;
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
} elseif (isset($p_list[$peer_ip][$peer_as]) && $local_as != $bgpLocalAs) {
|
||||
// Find and replace local_as key in peer list if different local as
|
||||
// FIXME, Yah, $peerlist stored as simple array without indexed key, that why used derp per-peer loop
|
||||
foreach ($peerlist as $key => $tmp) {
|
||||
if ($tmp['ip'] == $peer_ip && $tmp['as'] == $peer_as) {
|
||||
$peerlist[$key]['local_as'] = $local_as;
|
||||
print_debug("Replaced Local AS for peer: $peer_ip (AS$peer_as, LocalIP: $local_ip) - AS$bgpLocalAs -> AS$local_as");
|
||||
break;
|
||||
print_debug("CISCO-BGP4-MIB Peers: ");
|
||||
foreach ($cisco_peers as $index => $cisco_entry) {
|
||||
[, $peer_ip] = explode('.', $index, 2);
|
||||
$peer_ip = hex2ip($peer_ip);
|
||||
if (isset($cisco_fix[$peer_ip]) && strlen($cisco_fix[$peer_ip]['bgpPeerLocalAddr'])) {
|
||||
// Fix incorrect IPv4 local IPs
|
||||
$local_ip = $cisco_fix[$peer_ip]['bgpPeerLocalAddr'];
|
||||
} else {
|
||||
$local_ip = hex2ip($cisco_entry['cbgpPeer2LocalAddr']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get afi/safi and populate cbgp on cisco ios (xe/xr)
|
||||
$af_data = snmpwalk_cache_oid($device, 'cbgpPeer2AddrFamilyName', [], 'CISCO-BGP4-MIB');
|
||||
$peer_as = $cisco_entry['cbgpPeer2RemoteAs'];
|
||||
$local_as = snmp_dewrap32bit($cisco_entry['cbgpPeer2LocalAs']);
|
||||
if ($local_as == 0) {
|
||||
// Per session local ASN can be zero if session down
|
||||
$local_as = $bgpLocalAs;
|
||||
}
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $cisco_entry['cbgpPeer2RemoteIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'local_as' => $local_as,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $cisco_entry['cbgpPeer2AdminStatus']
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
$peerlist[] = $peer;
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
} elseif (isset($p_list[$peer_ip][$peer_as]) && $local_as != $bgpLocalAs) {
|
||||
// Find and replace local_as key in peer list if different local as
|
||||
// FIXME, Yah, $peerlist stored as simple array without indexed key, that why used derp per-peer loop
|
||||
foreach ($peerlist as $key => $tmp) {
|
||||
if ($tmp['ip'] == $peer_ip && $tmp['as'] == $peer_as) {
|
||||
$peerlist[$key]['local_as'] = $local_as;
|
||||
print_debug("Replaced Local AS for peer: $peer_ip (AS$peer_as, LocalIP: $local_ip) - AS$bgpLocalAs -> AS$local_as");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get afi/safi and populate cbgp on cisco ios (xe/xr)
|
||||
$af_data = snmpwalk_cache_oid($device, 'cbgpPeer2AddrFamilyName', [], 'CISCO-BGP4-MIB');
|
||||
}
|
||||
|
||||
// Process AFI/SAFI
|
||||
foreach ($af_data as $af => $af_entry) {
|
||||
if ($cisco_version === 2) {
|
||||
list(, $af) = explode('.', $af, 2);
|
||||
$text = $af_entry['cbgpPeer2AddrFamilyName'];
|
||||
} else {
|
||||
$text = $af_entry['cbgpPeerAddrFamilyName'];
|
||||
}
|
||||
$afisafi = explode('.', $af);
|
||||
$c = count($afisafi);
|
||||
$afi = $afisafi[$c - 2];
|
||||
$safi = $afisafi[$c - 1];
|
||||
$peer_ip = hex2ip(str_replace(".$afi.$safi", '', $af));
|
||||
print_debug("Peer IP: $peer_ip, AFI: $afi, SAFI: $safi");
|
||||
if ($afi && $safi) {
|
||||
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = $text;
|
||||
$peer_afis[$peer_ip][] = [ 'afi' => $afi, 'safi' => $safi ];
|
||||
/*
|
||||
if (strlen($table_rows[$peer_ip][4]))
|
||||
{
|
||||
$table_rows[$peer_ip][4] .= ', ';
|
||||
if ($cisco_version === 2) {
|
||||
[, $af] = explode('.', $af, 2);
|
||||
$text = $af_entry['cbgpPeer2AddrFamilyName'];
|
||||
} else {
|
||||
$text = $af_entry['cbgpPeerAddrFamilyName'];
|
||||
}
|
||||
$table_rows[$peer_ip][4] .= $afi . '.' . $safi;
|
||||
$afisafi = explode('.', $af);
|
||||
$c = count($afisafi);
|
||||
$afi = $afisafi[$c - 2];
|
||||
$safi = $afisafi[$c - 1];
|
||||
$peer_ip = hex2ip(str_replace(".$afi.$safi", '', $af));
|
||||
print_debug("Peer IP: $peer_ip, AFI: $afi, SAFI: $safi");
|
||||
if ($afi && $safi) {
|
||||
|
||||
$peer_id = $peer_ids[$peer_ip];
|
||||
$af_list[$peer_id][$afi][$safi] = 1;
|
||||
//$peer_afis[$peer_ip][$afi][$safi] = $text;
|
||||
$peer_afis[$peer_ip][] = ['afi' => $afi, 'safi' => $safi];
|
||||
/*
|
||||
if (strlen($table_rows[$peer_ip][4]))
|
||||
{
|
||||
$table_rows[$peer_ip][4] .= ', ';
|
||||
}
|
||||
$table_rows[$peer_ip][4] .= $afi . '.' . $safi;
|
||||
|
||||
//if (dbFetchCell('SELECT COUNT(*) FROM `bgpPeers_cbgp` WHERE `device_id` = ? AND `bgpPeer_id` = ? AND `afi` = ? AND `safi` = ?', array($device['device_id'], $peer_id, $afi, $safi)) == 0)
|
||||
if (!dbExist('bgpPeers_cbgp', '`device_id` = ? AND `bgpPeer_id` = ? AND `afi` = ? AND `safi` = ?', array($device['device_id'], $peer_id, $afi, $safi)))
|
||||
{
|
||||
$params = [ 'device_id' => $device['device_id'], 'bgpPeer_id' => $peer_id, 'afi' => $afi, 'safi' => $safi ];
|
||||
dbInsert($params, 'bgpPeers_cbgp');
|
||||
$peer_id = $peer_ids[$peer_ip];
|
||||
$af_list[$peer_id][$afi][$safi] = 1;
|
||||
|
||||
//if (dbFetchCell('SELECT COUNT(*) FROM `bgpPeers_cbgp` WHERE `device_id` = ? AND `bgpPeer_id` = ? AND `afi` = ? AND `safi` = ?', array($device['device_id'], $peer_id, $afi, $safi)) == 0)
|
||||
if (!dbExist('bgpPeers_cbgp', '`device_id` = ? AND `bgpPeer_id` = ? AND `afi` = ? AND `safi` = ?', array($device['device_id'], $peer_id, $afi, $safi)))
|
||||
{
|
||||
$params = [ 'device_id' => $device['device_id'], 'bgpPeer_id' => $peer_id, 'afi' => $afi, 'safi' => $safi ];
|
||||
dbInsert($params, 'bgpPeers_cbgp');
|
||||
}
|
||||
*/
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
@ -4,23 +4,25 @@
|
||||
*
|
||||
* This file is part of Observium.
|
||||
*
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) Adam Armstrong
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @var array $device
|
||||
* @var array $device
|
||||
* @var string $mib
|
||||
* @var array $entry
|
||||
* @var array $entry
|
||||
* @var string $bgpLocalAs
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var array $p_list
|
||||
* @var array $peerlist
|
||||
* @var bool $check_vrfs
|
||||
* @var string $vrf_name
|
||||
*/
|
||||
|
||||
// NOTE. This mib deprecated since Cumulus 5.1
|
||||
|
||||
// CUMULUS-BGPUN-MIB::bgpPeerState.192.168.0.1 = INTEGER: established(6)
|
||||
// CUMULUS-BGPUN-MIB::bgpPeerState.192.168.0.5 = INTEGER: established(6)
|
||||
// CUMULUS-BGPUN-MIB::bgpPeerAdminStatus.192.168.0.1 = INTEGER: start(2)
|
||||
@ -53,36 +55,36 @@ $peers_data = snmpwalk_cache_oid($device, 'bgpPeerIface', $peers_data, 'CUMULUS-
|
||||
$peers_data = snmpwalk_cache_oid($device, 'bgpPeerAdminStatus', $peers_data, 'CUMULUS-BGPUN-MIB');
|
||||
|
||||
foreach ($peers_data as $index => $bgp4_entry) {
|
||||
$peer_ip = $index;
|
||||
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
|
||||
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
|
||||
$peers_data[$index]['bgpPeerRemoteAs'] = $peer_as;
|
||||
}
|
||||
$local_ip = $bgp4_entry['bgpPeerLocalAddr'];
|
||||
$peer_ip = $index;
|
||||
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
|
||||
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
|
||||
$peers_data[$index]['bgpPeerRemoteAs'] = $peer_as;
|
||||
}
|
||||
$local_ip = $bgp4_entry['bgpPeerLocalAddr'];
|
||||
|
||||
// Add bgpPeerIdentifier
|
||||
//$bgp4_entry['bgpPeerIdentifier'] = get_ip_version($bgp4_entry['bgpPeerIface']) ? $bgp4_entry['bgpPeerIface'] : $index;
|
||||
$bgp4_entry['bgpPeerIdentifier'] = $index;
|
||||
$peers_data[$index]['bgpPeerIdentifier'] = $bgp4_entry['bgpPeerIdentifier'];
|
||||
// Add bgpPeerIdentifier
|
||||
//$bgp4_entry['bgpPeerIdentifier'] = get_ip_version($bgp4_entry['bgpPeerIface']) ? $bgp4_entry['bgpPeerIface'] : $index;
|
||||
$bgp4_entry['bgpPeerIdentifier'] = $index;
|
||||
$peers_data[$index]['bgpPeerIdentifier'] = $bgp4_entry['bgpPeerIdentifier'];
|
||||
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $bgp4_entry['bgpPeerIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'local_as' => $bgpLocalAs,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
$peerlist[] = $peer;
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
}
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $bgp4_entry['bgpPeerIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'local_as' => $bgpLocalAs,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
|
||||
];
|
||||
if ($check_vrfs) {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
$peerlist[] = $peer;
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
107
includes/discovery/bgp/cumulus-bgpvrf-mib.inc.php
Normal file
107
includes/discovery/bgp/cumulus-bgpvrf-mib.inc.php
Normal file
@ -0,0 +1,107 @@
|
||||
<?php
|
||||
/**
|
||||
* Observium
|
||||
*
|
||||
* This file is part of Observium.
|
||||
*
|
||||
* @package observium
|
||||
* @subpackage discovery
|
||||
* @copyright (C) Adam Armstrong
|
||||
*
|
||||
*/
|
||||
|
||||
// CUMULUS-BGPVRF-MIB::bgpVrfTable.254 = INTEGER: 254
|
||||
// CUMULUS-BGPVRF-MIB::bgpVrfTable.1001 = INTEGER: 1001
|
||||
// CUMULUS-BGPVRF-MIB::bgpVrfId.254 = INTEGER: 0
|
||||
// CUMULUS-BGPVRF-MIB::bgpVrfId.1001 = INTEGER: 37
|
||||
// CUMULUS-BGPVRF-MIB::bgpVrfName.254 = STRING: default
|
||||
// CUMULUS-BGPVRF-MIB::bgpVrfName.1001 = STRING: mgmt
|
||||
|
||||
//$peers_vrf = snmpwalk_cache_oid($device, 'bgpVrfName', [], 'CUMULUS-BGPVRF-MIB');
|
||||
|
||||
// CUMULUS-BGPVRF-MIB::bgpLocalAs.254 = INTEGER: 64715
|
||||
// CUMULUS-BGPVRF-MIB::bgpIdentifier.254 = IpAddress: 10.72.0.107
|
||||
|
||||
$vrf_index = $entry['vrf_index']; // from $local_as_array
|
||||
$local_as = $entry['LocalAs'];
|
||||
//$peers_localas = snmp_get_oid($device, 'bgpLocalAs.' . $vrf_index, 'CUMULUS-BGPVRF-MIB');
|
||||
//$peers_localas = snmpwalk_cache_oid($device, 'bgpIdentifier', $peers_localas, 'CUMULUS-BGPVRF-MIB');
|
||||
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerIdentifier.254.ipv6.65024.4096.0.1.0.6146 = IpAddress: 10.72.0.56
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerState.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: established(6)
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerAdminStatus.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: start(2)
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerNegotiatedVersion.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 4
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerLocalAddr.254.ipv6.65024.4096.0.1.0.6146 = STRING: "fe00::1000:0:1:0:1803"
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerLocalPort.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 33594
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerRemoteAddr.254.ipv6.65024.4096.0.1.0.6146 = STRING: "fe00::1000:0:1:0:1802"
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerRemotePort.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 179
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerRemoteAs.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 64712
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerInUpdates.254.ipv6.65024.4096.0.1.0.6146 = Counter32: 587
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerOutUpdates.254.ipv6.65024.4096.0.1.0.6146 = Counter32: 925
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerInTotalMessages.254.ipv6.65024.4096.0.1.0.6146 = Counter32: 1562209
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerOutTotalMessages.254.ipv6.65024.4096.0.1.0.6146 = Counter32: 1562519
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerLastError.254.ipv6.65024.4096.0.1.0.6146 = Hex-STRING: 00 00
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerFsmEstablishedTransitions.254.ipv6.65024.4096.0.1.0.6146 = Counter32: 0
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerFsmEstablishedTime.254.ipv6.65024.4096.0.1.0.6146 = Gauge32: 4083158
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerConnectRetryInterval.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 10
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerHoldTime.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 9
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerKeepAlive.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 3
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerHoldTimeConfigured.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 9
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerKeepAliveConfigured.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 3
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerEntry.22.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 0
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerMinRouteAdvertisementInterval.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 0
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerInUpdateElapsedTime.254.ipv6.65024.4096.0.1.0.6146 = Gauge32: 74904
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerIface.254.ipv6.65024.4096.0.1.0.6146 = STRING: iface
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerDesc.254.ipv6.65024.4096.0.1.0.6146 = STRING: NA
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerIfindex.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: 0
|
||||
// CUMULUS-BGPVRF-MIB::bgpPeerIdType.254.ipv6.65024.4096.0.1.0.6146 = INTEGER: ipv6(2)
|
||||
|
||||
$def = $config['mibs'][$mib]['bgp'];
|
||||
|
||||
$peers_data = snmp_cache_table($device, $def['oids']['PeerRemoteAs']['oid'], [], $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
|
||||
$peers_data = snmp_cache_table($device, $def['oids']['PeerRemoteAddr']['oid'], $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$peers_data = snmp_cache_table($device, $def['oids']['PeerLocalAddr']['oid'], $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$peers_data = snmp_cache_table($device, $def['oids']['PeerIdentifier']['oid'], $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
$peers_data = snmp_cache_table($device, $def['oids']['PeerAdminStatus']['oid'], $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
|
||||
//$peers_data = snmp_cache_table($device, $def['oids']['PeerDescription']['oid'], $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
//$peers_data = snmp_cache_table($device, 'bgpPeerIface', $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
//$peers_data = snmp_cache_table($device, 'bgpPeerIfindex', $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
//$peers_data = snmp_cache_table($device, $def['oids']['PeerRemoteAddrType']['oid'], $peers_data, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
|
||||
|
||||
foreach ($peers_data as $index => $bgp4_entry) {
|
||||
$peer_vrf_index = explode('.', $index)[0];
|
||||
if ($vrf_index != $peer_vrf_index) {
|
||||
continue; // Skip different vrf index
|
||||
}
|
||||
|
||||
$peer_ip = ip_uncompress($bgp4_entry['bgpPeerRemoteAddr']);
|
||||
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
|
||||
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
|
||||
$peers_data[$index]['bgpPeerRemoteAs'] = $peer_as;
|
||||
}
|
||||
$local_ip = ip_uncompress($bgp4_entry['bgpPeerLocalAddr']);
|
||||
|
||||
$peer = [
|
||||
'mib' => $mib,
|
||||
'index' => $index,
|
||||
'identifier' => $bgp4_entry['bgpPeerIdentifier'],
|
||||
'local_ip' => $local_ip,
|
||||
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
|
||||
'local_as' => $local_as,
|
||||
'as' => $peer_as,
|
||||
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
|
||||
];
|
||||
if ($vrf_name && $vrf_name !== 'default') {
|
||||
$peer['virtual_name'] = $vrf_name;
|
||||
}
|
||||
|
||||
if (!isset($p_list[$peer_ip][$peer_as]) && is_bgp_peer_valid($peer, $device)) {
|
||||
print_debug("Found peer IP: $peer_ip (AS$peer_as, LocalIP: $local_ip)");
|
||||
$peerlist[] = $peer;
|
||||
$p_list[$peer_ip][$peer_as] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// EOF
|
Reference in New Issue
Block a user