Commit version 24.12.13800

This commit is contained in:
2025-01-06 17:35:06 -05:00
parent b7f6a79c2c
commit 55d9218816
6133 changed files with 4239740 additions and 1374287 deletions

View File

@ -6,49 +6,60 @@
*
* @package observium
* @subpackage poller
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
* @copyright (C) Adam Armstrong
*
*/
/**
* @var array $device
* @var string $mib
* @var array $def
* @var array $entry
* @var string $bgpLocalAs
* @var array $bgp_oids
* @var array $device
* @var string $mib
* @var array $def
* @var array $entry
* @var string $bgpLocalAs
* @var array $bgp_oids
* @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;
}
$bgp4_peers = snmpwalk_cache_oid($device, 'bgpPeerRemoteAs', [], 'BGP4-MIB');
// #2 - Request not completed
// #1002 - Request timeout
if (in_array(snmp_error_code(), [ OBS_SNMP_ERROR_REQUEST_NOT_COMPLETED,
OBS_SNMP_ERROR_REQUEST_TIMEOUT,
OBS_SNMP_ERROR_BULK_REQUEST_TIMEOUT ], TRUE)) {
$snmp_incomplete = TRUE;
if (in_array(snmp_error_code(), [OBS_SNMP_ERROR_REQUEST_NOT_COMPLETED,
OBS_SNMP_ERROR_REQUEST_TIMEOUT,
OBS_SNMP_ERROR_BULK_REQUEST_TIMEOUT], TRUE)) {
$snmp_incomplete = TRUE;
}
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerState']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerAdminStatus']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutTotalMessages']['oid'], $bgp4_peers, $mib);
if ($device['os'] === 'fortigate') {
// Fetch remote addr on fortigate and aruba devices, because incorrect indexes
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerRemoteAddr']['oid'], $bgp4_peers, $mib);
}
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerState']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerAdminStatus']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerFsmEstablishedTime']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdateElapsedTime']['oid'], $bgp4_peers, $mib);
//$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerLocalAddr']['oid'], $bgp4_peers, $mib);
@ -56,50 +67,42 @@ $bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdateElapsedTime'
// Collect founded peers
if (!is_array($bgp_peers)) {
$bgp_peers = []; // need rewrite array for fix incorrect indexes
$bgp_peers = []; // need rewrite array for fix incorrect indexes
}
foreach ($bgp4_peers 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;
}
parse_bgp_peer_index($bgp4_entry, $index, $mib);
$peer_ip = $bgp4_entry['bgpPeerRemoteAddr'];
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
$bgp4_entry['bgpPeerRemoteAs'] = $peer_as;
}
// Process vendor specific issues
bgp_fix_peer($device, $bgp4_entry, $mib);
$peer_as = $bgp4_entry['bgpPeerRemoteAs'];
$peer = [
'index' => $index,
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
'as' => $peer_as,
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
];
if ($check_vrfs) {
$peer['virtual_name'] = $vrf_name;
}
if (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
$bgp_peers[$peer_ip] = $bgp4_entry;
// Unification peer (do not use for bgp4-mib)
/*
$peerlist[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$peerlist[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
}
$peer = [
'index' => $index,
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
'as' => $peer_as,
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
];
if ($check_vrfs) {
$peerlist[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
$peer['virtual_name'] = $vrf_name;
}
if (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
$bgp_peers[$peer_ip] = $bgp4_entry;
// Unification peer (do not use for bgp4-mib)
/*
$peerlist[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$peerlist[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
}
if ($check_vrfs) {
$peerlist[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
}
*/
}
*/
}
}
unset($bgp4_peers);

View File

@ -4,22 +4,22 @@
*
* This file is part of Observium.
*
* @package observium
* @subpackage poller
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
* @package observium
* @subpackage poller
* @copyright (C) Adam Armstrong
*
*/
/**
* @var array $device
* @var array $device
* @var string $mib
* @var array $def
* @var array $entry
* @var array $def
* @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
*/
@ -28,9 +28,9 @@ $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;
}
$v_oids = [
@ -39,74 +39,97 @@ $v_oids = [
'PeerFsmEstablishedTime', 'PeerInUpdateElapsedTime'
];
foreach ($v_oids as $oid) {
$vendor_oid = $def['oids'][$oid]['oid'];
//print_vars($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_oid = $def['oids'][$oid]['oid'];
//print_vars($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);
}
}
// Fetch vendor specific counters
$vendor_counters = [];
$v_oids = [ 'PeerAcceptedPrefixes', 'PeerDeniedPrefixes', 'PeerAdvertisedPrefixes' ];
$v_oids = ['PeerAcceptedPrefixes', 'PeerDeniedPrefixes', 'PeerAdvertisedPrefixes'];
foreach ($v_oids as $oid) {
$vendor_oid = $def['oids'][$oid]['oid'];
//print_vars($oid);
if (!safe_empty($vendor_oid)) {
$vendor_counters = snmpwalk_cache_oid($device, $vendor_oid, $vendor_counters, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
}
$vendor_oid = $def['oids'][$oid]['oid'];
//print_vars($oid);
if (!safe_empty($vendor_oid)) {
$vendor_counters = snmpwalk_cache_oid($device, $vendor_oid, $vendor_counters, $vendor_mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
}
}
unset($vendor_oid);
// Collect founded peers and rewrite to pretty array.
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']]);
//$vendor_entry[$vendor_PeerLocalAddr] = hex2ip($vendor_entry[$vendor_PeerLocalAddr]);
$vendor_entry['idx'] = $idx;
$peer_as = $vendor_entry[$def['oids']['PeerRemoteAs']['oid']];
$peer = [
'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 (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]) && !isset($p_list[$peer_ip][$peer_as])) {
unset($p_list[$peer_ip]); // Clean old peer list
$bgp4_peer_as = $bgp_peers[$peer_ip]['bgpPeerRemoteAs']; // BGP4-MIB
if ($peer_as > $bgp4_peer_as) {
$bgp_peers[$peer_ip]['bgpPeerRemoteAs'] = $peer_as;
}
if (!safe_empty($def['index'])) {
parse_bgp_peer_index($vendor_entry, $idx, $vendor_mib);
}
$peer_ip = hex2ip($vendor_entry[$def['oids']['PeerRemoteAddr']['oid']]);
$p_list[$peer_ip][$peer_as] = 1;
//$vendor_peers[$peer_ip][$peer_as] = $vendor_entry;
// Process vendor specific issues
bgp_fix_peer($device, $vendor_entry, $vendor_mib);
// Unify peer
$vendor_peers[$peer_ip][$peer_as] = [ 'idx' => $idx ];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
if (isset($def['oids'][$def_oid]['transform'])) {
$vendor_peers[$peer_ip][$peer_as][$bgp_oid] = string_transform($vendor_entry[$def['oids'][$def_oid]['oid']], $def['oids'][$def_oid]['transform']);
} else {
$vendor_peers[$peer_ip][$peer_as][$bgp_oid] = $vendor_entry[$def['oids'][$def_oid]['oid']];
}
}
//$vendor_entry[$vendor_PeerLocalAddr] = hex2ip($vendor_entry[$vendor_PeerLocalAddr]);
$vendor_entry['idx'] = $idx;
$peer_as = $vendor_entry[$def['oids']['PeerRemoteAs']['oid']];
$peer = [
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
'as' => $peer_as,
'admin_status' => $vendor_entry[$def['oids']['PeerAdminStatus']['oid']]
];
if ($check_vrfs) {
$vendor_peers[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
$peer['virtual_name'] = $vrf_name;
}
if (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]) && !isset($p_list[$peer_ip][$peer_as])) {
unset($p_list[$peer_ip]); // Clean old peer list
$bgp4_peer_as = $bgp_peers[$peer_ip]['bgpPeerRemoteAs']; // BGP4-MIB
if ($peer_as > $bgp4_peer_as) {
print_debug("Fixed incorrect BGP4-MIB::bgpPeerRemoteAs on peer $peer_ip: $bgp4_peer_as -> $peer_as");
$bgp_peers[$peer_ip]['bgpPeerRemoteAs'] = $peer_as;
}
}
if (isset($bgp_peers[$peer_ip]) && $bgp_peers[$peer_ip]['bgpPeerRemoteAs'] == $peer_as) {
// Compare and fix some timers
$bgp4_time = $bgp_peers[$peer_ip]['bgpPeerFsmEstablishedTime'];
$vendor_time = $vendor_entry[$def['oids']['PeerFsmEstablishedTime']['oid']];
if (($bgp4_time > $vendor_time) && (($bgp4_time - $vendor_time) > 100000)) {
// BGP4-MIB::bgpPeerFsmEstablishedTime.91.210.44.226 = 4207739831
// FOUNDRY-BGP4V2-MIB::bgp4V2PeerFsmEstablishedTime.1.1.4.91.210.44.225.1.4.91.210.44.226 = 20146719
print_debug("Fixed incorrect BGP4-MIB::bgpPeerFsmEstablishedTime on peer $peer_ip: $bgp4_time -> $vendor_time");
$bgp_peers[$peer_ip]['bgpPeerFsmEstablishedTime'] = $vendor_time;
}
$bgp4_time = $bgp_peers[$peer_ip]['bgpPeerInUpdateElapsedTime'];
$vendor_time = $vendor_entry[$def['oids']['PeerInUpdateElapsedTime']['oid']];
if (($bgp4_time > $vendor_time) && (($bgp4_time - $vendor_time) > 100000)) {
// BGP4-MIB::bgpPeerInUpdateElapsedTime.91.210.44.226 = 1219919
// FOUNDRY-BGP4V2-MIB::bgp4V2PeerInUpdatesElapsedTime.1.1.4.91.210.44.225.1.4.91.210.44.226 = 1219920
print_debug("Fixed incorrect BGP4-MIB::bgpPeerInUpdateElapsedTime on peer $peer_ip: $bgp4_time -> $vendor_time");
$bgp_peers[$peer_ip]['bgpPeerInUpdateElapsedTime'] = $vendor_time;
}
}
$p_list[$peer_ip][$peer_as] = 1;
//$vendor_peers[$peer_ip][$peer_as] = $vendor_entry;
// Unify peer
$vendor_peers[$peer_ip][$peer_as] = ['idx' => $idx];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
if (isset($def['oids'][$def_oid]['transform'])) {
$vendor_peers[$peer_ip][$peer_as][$bgp_oid] = string_transform($vendor_entry[$def['oids'][$def_oid]['oid']], $def['oids'][$def_oid]['transform']);
} else {
$vendor_peers[$peer_ip][$peer_as][$bgp_oid] = $vendor_entry[$def['oids'][$def_oid]['oid']];
}
}
if ($check_vrfs) {
$vendor_peers[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
}
}
}
}
// EOF

View File

@ -6,19 +6,20 @@
*
* @package observium
* @subpackage poller
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
* @copyright (C) Adam Armstrong
*
*/
/**
* @var array $device
* @var array $device
* @var string $mib
* @var array $def
* @var array $entry
* @var array $def
* @var array $entry
* @var string $bgpLocalAs
* @var array $bgp_oids
* @var array $p_list
* @var bool $check_vrfs
* @var array $bgp_oids
* @var array $cbgp_defs
* @var array $p_list
* @var bool $check_vrfs
* @var string $vrf_name
*/
@ -26,118 +27,140 @@ $cisco_version = $entry['cisco_version'];
// Prefixes (Cisco v1/2)
$c_prefixes = [];
// $cbgp_defs = [ 'PeerAcceptedPrefixes', 'PeerDeniedPrefixes', 'PeerPrefixAdminLimit', 'PeerPrefixThreshold',
// 'PeerPrefixClearThreshold', 'PeerAdvertisedPrefixes', 'PeerSuppressedPrefixes', 'PeerWithdrawnPrefixes' ];
foreach ($cbgp_defs as $def_oid) {
$c_oid = $def['oids'][$def_oid]['oid'];
if ($cisco_version < 2) {
$c_oid = str_replace('cbgpPeer2', 'cbgpPeer', $c_oid);
}
$c_prefixes = snmpwalk_cache_oid($device, $c_oid, $c_prefixes, 'CISCO-BGP4-MIB');
if ($check_vrfs) {
// Derp, VRFs need separate versions, need in BGP4-MIB
$cisco_version_vrf[$vrf_name] = $entry['cisco_version'];
// Table walk for speedup polling (many) VRFs
$c_prefixes_table = $cisco_version < 2 ? 'cbgpPeerAddrFamilyPrefixTable' : 'cbgpPeer2AddrFamilyPrefixTable';
print_debug("Polling BGP table $c_prefixes_table in VRF");
$c_prefixes = snmpwalk_cache_oid($device, $c_prefixes_table, $c_prefixes, 'CISCO-BGP4-MIB');
} else {
// Main table polling per OID for prevention timeout issues
foreach ($cbgp_defs as $def_oid) {
$c_oid = $def['oids'][$def_oid]['oid'];
if ($cisco_version < 2) {
$c_oid = str_replace('cbgpPeer2', 'cbgpPeer', $c_oid);
}
$c_prefixes = snmpwalk_cache_oid($device, $c_oid, $c_prefixes, 'CISCO-BGP4-MIB');
}
}
foreach ($c_prefixes as $c_index => $c_entry) {
$index_array = explode('.', $c_index);
if ($cisco_version < 2) {
// v1 - IPv4 only
// cbgpPeerAcceptedPrefixes.10.255.0.1.ipv4.unicast
$safi = array_pop($index_array);
$afi = array_pop($index_array);
$peer_ip = implode('.', $index_array);
} else {
// v2
$safi = array_pop($index_array);
$afi = array_pop($index_array);
$ip_version = array_shift($index_array);
if ($ip_version === 'ipv6') {
// IPv6
// cbgpPeer2DeniedPrefixes.ipv6."20:01:07:f8:00:20:02:01:00:00:00:00:01:00:01:00".ipv6.unicast
$peer_ip = array_shift($index_array);
} else {
// IPv4
// cbgpPeer2AcceptedPrefixes.ipv4."10.255.0.1".ipv4.unicast
$peer_ip = implode('.', $index_array);
}
$peer_ip = hex2ip($peer_ip);
}
if (isset($GLOBALS['config']['routing_afis'][$afi])) {
$afi = $GLOBALS['config']['routing_afis'][$afi]['name'];
}
if (isset($GLOBALS['config']['routing_safis'][$safi])) {
$safi = $GLOBALS['config']['routing_safis'][$safi]['name'];
}
foreach ($cbgp_defs as $def_oid) {
$c_oid = $def['oids'][$def_oid]['oid'];
$index_array = explode('.', $c_index);
if ($cisco_version < 2) {
$c_oid = str_replace('cbgpPeer2', 'cbgpPeer', $c_oid);
// v1 - IPv4 only
// cbgpPeerAcceptedPrefixes.10.255.0.1.ipv4.unicast
$safi = array_pop($index_array);
$afi = array_pop($index_array);
$peer_ip = implode('.', $index_array);
} else {
// v2
$safi = array_pop($index_array);
$afi = array_pop($index_array);
$ip_version = array_shift($index_array);
if ($ip_version === 'ipv6') {
// IPv6
// cbgpPeer2DeniedPrefixes.ipv6."20:01:07:f8:00:20:02:01:00:00:00:00:01:00:01:00".ipv6.unicast
$peer_ip = array_shift($index_array);
} else {
// IPv4
// cbgpPeer2AcceptedPrefixes.ipv4."10.255.0.1".ipv4.unicast
$peer_ip = implode('.', $index_array);
}
$peer_ip = hex2ip($peer_ip);
}
if (isset($GLOBALS['config']['routing_afis'][$afi])) {
$afi = $GLOBALS['config']['routing_afis'][$afi]['name'];
}
if (isset($GLOBALS['config']['routing_safis'][$safi])) {
$safi = $GLOBALS['config']['routing_safis'][$safi]['name'];
}
foreach ($cbgp_defs as $def_oid) {
$c_oid = $def['oids'][$def_oid]['oid'];
if ($cisco_version < 2) {
$c_oid = str_replace('cbgpPeer2', 'cbgpPeer', $c_oid);
}
$af_list[$peer_ip][$afi][$safi][$def_oid] = $c_entry[$c_oid];
}
$af_list[$peer_ip][$afi][$safi][$def_oid] = $c_entry[$c_oid];
}
}
unset($c_prefixes);
// Clean
unset($c_prefixes, $c_prefixes_table);
if ($cisco_version > 1) {
// Check Cisco cbgpPeer2Table
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteAs', [], 'CISCO-BGP4-MIB');
// Check Cisco cbgpPeer2Table
if (safe_empty($cisco_peers)) {
return;
}
// #2 - Request not completed
// #1002 - Request timeout
if (in_array(snmp_error_code(), [ OBS_SNMP_ERROR_REQUEST_NOT_COMPLETED,
OBS_SNMP_ERROR_REQUEST_TIMEOUT,
OBS_SNMP_ERROR_BULK_REQUEST_TIMEOUT ], TRUE)) {
$snmp_incomplete = TRUE;
}
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerState']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerAdminStatus']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdates']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutUpdates']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInTotalMessages']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutTotalMessages']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerFsmEstablishedTime']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdateElapsedTime']['oid'], $cisco_peers, $mib);
//$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerLocalAddr']['oid'], $cisco_peers, $mib);
//$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerIdentifier']['oid'], $cisco_peers, $mib);
// Collect founded peers
foreach ($cisco_peers as $index => $cisco_entry) {
list(, $peer_ip) = explode('.', $index, 2);
$peer_ip = hex2ip($peer_ip);
$peer_as = $cisco_entry['cbgpPeer2RemoteAs'];
$peer = [
'index' => $index,
'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 (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
// Unify peer
$cbgp2_peers[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$cbgp2_peers[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
}
if ($check_vrfs) {
$cbgp2_peers[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
}
// Table walk for speedup polling (many) VRFs
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2Table', [], 'CISCO-BGP4-MIB');
} else {
unset($cisco_peers[$index]); // Remove invalid entry for suppress force rediscover
// Main table polling per OID for prevention timeout issues
$cisco_peers = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteAs', [], 'CISCO-BGP4-MIB');
}
}
// And anyway get bgpPeerLocalAddr for fix Cisco issue with incorrect random data in cbgpPeer2LocalAddr
//$cisco_fix = snmpwalk_cache_oid($device, 'bgpPeerLocalAddr', array(), 'BGP4-MIB');
if (safe_empty($cisco_peers)) {
return;
}
// #2 - Request not completed
// #1002 - Request timeout
// #1004 - Bulk Request timeout
if (in_array(snmp_error_code(), [ OBS_SNMP_ERROR_REQUEST_NOT_COMPLETED,
OBS_SNMP_ERROR_REQUEST_TIMEOUT,
OBS_SNMP_ERROR_BULK_REQUEST_TIMEOUT ], TRUE)) {
$snmp_incomplete = TRUE;
}
if (!$check_vrfs) {
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerState']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerAdminStatus']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdates']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutUpdates']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInTotalMessages']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutTotalMessages']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerFsmEstablishedTime']['oid'], $cisco_peers, $mib);
$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdateElapsedTime']['oid'], $cisco_peers, $mib);
//$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerLocalAddr']['oid'], $cisco_peers, $mib);
//$cisco_peers = snmpwalk_cache_oid($device, $def['oids']['PeerIdentifier']['oid'], $cisco_peers, $mib);
}
// Collect founded peers
foreach ($cisco_peers as $index => $cisco_entry) {
[, $peer_ip] = explode('.', $index, 2);
$peer_ip = hex2ip($peer_ip);
$peer_as = $cisco_entry['cbgpPeer2RemoteAs'];
$peer = [
'index' => $index,
'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 (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
// Unify peer
$cbgp2_peers[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$cbgp2_peers[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
}
if ($check_vrfs) {
$cbgp2_peers[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
}
} else {
unset($cisco_peers[$index]); // Remove invalid entry for suppress force rediscover
}
}
// And anyway get bgpPeerLocalAddr for fix Cisco issue with incorrect random data in cbgpPeer2LocalAddr
//$cisco_fix = snmpwalk_cache_oid($device, 'bgpPeerLocalAddr', array(), 'BGP4-MIB');
}
// EOF

View File

@ -4,25 +4,27 @@
*
* This file is part of Observium.
*
* @package observium
* @subpackage poller
* @copyright (C) 2006-2013 Adam Armstrong, (C) 2013-2022 Observium Limited
* @package observium
* @subpackage poller
* @copyright (C) Adam Armstrong
*
*/
/**
* @var array $device
* @var array $device
* @var string $mib
* @var array $def
* @var array $entry
* @var array $def
* @var array $entry
* @var string $bgpLocalAs
* @var array $bgp_oids
* @var array $p_list
* @var array $peerlist
* @var bool $check_vrfs
* @var array $bgp_oids
* @var array $p_list
* @var array $peerlist
* @var bool $check_vrfs
* @var string $vrf_name
*/
// NOTE. This mib deprecated since Cumulus 5.1
$bgp4_peers = snmpwalk_cache_oid($device, 'bgpPeerRemoteAs', [], 'CUMULUS-BGPUN-MIB');
// #2 - Request not completed
@ -30,15 +32,15 @@ $bgp4_peers = snmpwalk_cache_oid($device, 'bgpPeerRemoteAs', [], 'CUMULUS-BGPUN-
if (in_array(snmp_error_code(), [ OBS_SNMP_ERROR_REQUEST_NOT_COMPLETED,
OBS_SNMP_ERROR_REQUEST_TIMEOUT,
OBS_SNMP_ERROR_BULK_REQUEST_TIMEOUT ], TRUE)) {
$snmp_incomplete = TRUE;
$snmp_incomplete = TRUE;
}
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerState']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerAdminStatus']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerState']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerAdminStatus']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutUpdates']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerOutTotalMessages']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerFsmEstablishedTime']['oid'], $bgp4_peers, $mib);
$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdateElapsedTime']['oid'], $bgp4_peers, $mib);
//$bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerLocalAddr']['oid'], $bgp4_peers, $mib);
@ -46,41 +48,41 @@ $bgp4_peers = snmpwalk_cache_oid($device, $def['oids']['PeerInUpdateElapsedTime'
// Collect founded peers
if (!is_array($bgp_peers)) {
$bgp_peers = []; // need rewrite array for fix incorrect indexes
$bgp_peers = []; // need rewrite array for fix incorrect indexes
}
foreach ($bgp4_peers as $index => $bgp4_entry) {
$peer_ip = $index;
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
$bgp4_entry['bgpPeerRemoteAs'] = $peer_as;
}
$peer = [
'index' => $index,
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
'as' => $peer_as,
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
];
if ($check_vrfs) {
$peer['virtual_name'] = $vrf_name;
}
if (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
$bgp_peers[$peer_ip] = $bgp4_entry;
// Unification peer (do not use for bgp4-mib)
/*
$peerlist[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$peerlist[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
$peer_ip = $index;
$peer_as = snmp_dewrap32bit($bgp4_entry['bgpPeerRemoteAs']); // Dewrap for 32bit ASN
if ($peer_as > $bgp4_entry['bgpPeerRemoteAs']) {
$bgp4_entry['bgpPeerRemoteAs'] = $peer_as;
}
$peer = [
'index' => $index,
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
'as' => $peer_as,
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
];
if ($check_vrfs) {
$peerlist[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
$peer['virtual_name'] = $vrf_name;
}
if (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
$bgp_peers[$peer_ip] = $bgp4_entry;
// Unification peer (do not use for bgp4-mib)
/*
$peerlist[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$peerlist[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
}
if ($check_vrfs) {
$peerlist[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
}
*/
}
*/
}
}
unset($bgp4_peers);

View File

@ -0,0 +1,85 @@
<?php
/**
* Observium
*
* This file is part of Observium.
*
* @package observium
* @subpackage poller
* @copyright (C) Adam Armstrong
*
*/
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerRemoteAs']['oid'], [], $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
print_vars(snmp_error_code());
// #2 - Request not completed
// #1002 - Request timeout
if (in_array(snmp_error_code(), [ OBS_SNMP_ERROR_REQUEST_NOT_COMPLETED,
OBS_SNMP_ERROR_REQUEST_TIMEOUT,
OBS_SNMP_ERROR_BULK_REQUEST_TIMEOUT ], TRUE)) {
$snmp_incomplete = TRUE;
}
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerRemoteAddr']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerState']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerAdminStatus']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerInUpdates']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerOutUpdates']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerInTotalMessages']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerOutTotalMessages']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerFsmEstablishedTime']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerInUpdateElapsedTime']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
//$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerLocalAddr']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
//$bgp4_peers = snmp_cache_table($device, $def['oids']['PeerIdentifier']['oid'], $bgp4_peers, $mib, NULL, OBS_SNMP_ALL_NUMERIC_INDEX);
$vrf_index = $entry['vrf_index']; // from $local_as_array
$local_as = $entry['LocalAs'];
// Collect founded peers
if (!is_array($bgp_peers)) {
$bgp_peers = []; // need rewrite array for fix incorrect indexes
}
foreach ($bgp4_peers 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']) {
$bgp4_entry['bgpPeerRemoteAs'] = $peer_as;
}
$peer = [
'index' => $index,
'ip' => $peer_ip === '0.0.0.0' ? '' : $peer_ip,
'as' => $peer_as,
'admin_status' => $bgp4_entry['bgpPeerAdminStatus']
];
$vrf_index = explode('.', $index)[0];
if ($vrf_name && $vrf_name !== 'default') {
$peer['virtual_name'] = $peers_vrf[$vrf_index]['bgpVrfName'];
}
if (is_bgp_peer_valid($peer, $device)) {
$p_list[$peer_ip][$peer_as] = 1;
$bgp_peers[$peer_ip] = $bgp4_entry;
// Unification peer (do not use for bgp4-mib)
/*
$peerlist[$peer_ip][$peer_as] = [];
foreach ($bgp_oids as $bgp_oid) {
$def_oid = str_replace('bgp', '', $bgp_oid); // bgpPeerState -> PeerState
$peerlist[$peer_ip][$peer_as][$bgp_oid] = $cisco_entry[$def['oids'][$def_oid]['oid']];
}
if ($check_vrfs) {
$peerlist[$peer_ip][$peer_as]['virtual_name'] = $vrf_name;
}
*/
}
}
unset($bgp4_peers);
// EOF