2009-09-07 11:07:59 +00:00
<? php
2008-03-17 00:23:52 +00:00
2020-04-17 17:37:56 -05:00
use Illuminate\Support\Str ;
2018-01-18 14:54:38 -06:00
use LibreNMS\Exceptions\InvalidIpException ;
2017-02-23 22:45:50 +00:00
use LibreNMS\RRD\RrdDefinition ;
2017-08-08 14:14:58 -05:00
use LibreNMS\Util\IP ;
2017-02-23 22:45:50 +00:00
2019-06-23 00:29:12 -05:00
if ( \LibreNMS\Config :: get ( 'enable_bgp' )) {
2020-09-21 15:43:38 +02:00
$peers = dbFetchRows ( 'SELECT * FROM `bgpPeers` AS B LEFT JOIN `vrfs` AS V ON `B`.`vrf_id` = `V`.`vrf_id` WHERE `B`.`device_id` = ?' , [ $device [ 'device_id' ]]);
2015-07-13 20:10:26 +02:00
2020-09-21 15:43:38 +02:00
if ( ! empty ( $peers )) {
2020-11-07 16:12:09 +01:00
$generic = false ;
2016-08-02 22:28:57 +01:00
if ( $device [ 'os' ] == 'junos' ) {
2022-08-24 14:45:59 -05:00
$peer_data_check = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerIndex' , '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14' , [], 'BGP4-V2-MIB-JUNIPER' , 'junos' );
2017-03-11 23:16:49 +00:00
} elseif ( $device [ 'os_group' ] === 'arista' ) {
2020-09-21 15:43:38 +02:00
$peer_data_check = snmpwalk_cache_oid ( $device , 'aristaBgp4V2PeerRemoteAs' , [], 'ARISTA-BGP4V2-MIB' );
2021-02-27 01:57:16 +10:00
} elseif ( $device [ 'os' ] === 'dell-os10' ) {
$peer_data_check = snmpwalk_cache_oid ( $device , 'os10bgp4V2PeerRemoteAs' , [], 'DELLEMC-OS10-BGP4V2-MIB' , 'dell' ); // practically identical MIB as arista
2019-01-19 18:44:32 +01:00
} elseif ( $device [ 'os' ] === 'timos' ) {
$peer_data_check = snmpwalk_cache_multi_oid ( $device , 'tBgpInstanceRowStatus' , [], 'TIMETRA-BGP-MIB' , 'nokia' );
2021-04-04 15:17:49 +01:00
} elseif ( $device [ 'os' ] === 'firebrick' ) {
$peer_data_check = snmpwalk_cache_multi_oid ( $device , 'fbBgpPeerTable' , [], 'FIREBRICK-BGP-MIB' , 'firebrick' );
2021-01-26 06:56:59 +02:00
} elseif ( $device [ 'os' ] === 'aos7' ) {
$peer_data_check = snmpwalk_cache_multi_oid ( $device , 'alaBgpPeerAS' , [], 'ALCATEL-IND1-BGP-MIB' , 'aos7' );
2020-04-10 13:22:26 +02:00
} elseif ( $device [ 'os' ] === 'vrp' ) {
$peer_data_check = snmpwalk_cache_multi_oid ( $device , 'hwBgpPeerEntry' , [], 'HUAWEI-BGP-VPN-MIB' , 'huawei' );
2020-11-07 16:12:09 +01:00
} elseif ( $device [ 'os_group' ] == 'cisco' ) {
2020-09-21 15:43:38 +02:00
$peer_data_check = snmpwalk_cache_oid ( $device , 'cbgpPeer2RemoteAs' , [], 'CISCO-BGP4-MIB' );
2022-05-22 14:27:28 +02:00
} elseif ( $device [ 'os' ] == 'cumulus' ) {
$peer_data_check = snmpwalk_cache_oid ( $device , 'bgpPeerRemoteAs' , [], 'CUMULUS-BGPUN-MIB' );
2020-11-07 16:12:09 +01:00
} else {
$peer_data_check = snmpwalk_cache_oid ( $device , 'bgpPeerRemoteAs' , [], 'BGP4-MIB' );
}
if ( empty ( $peer_data_check )) {
$peer_data_check = snmpwalk_cache_oid ( $device , 'bgpPeerRemoteAs' , [], 'BGP4-MIB' );
$generic = true ;
2016-02-09 18:23:31 +00:00
}
foreach ( $peers as $peer ) {
2016-02-13 21:48:26 +01:00
//add context if exist
2017-03-11 23:16:49 +00:00
$device [ 'context_name' ] = $peer [ 'context_name' ];
2019-01-19 18:44:32 +01:00
$vrfOid = $peer [ 'vrf_oid' ];
$vrfId = $peer [ 'vrf_id' ];
2016-02-16 09:17:59 +00:00
2018-01-18 14:54:38 -06:00
try {
$peer_ip = IP :: parse ( $peer [ 'bgpPeerIdentifier' ]);
2016-02-09 18:23:31 +00:00
2018-01-18 14:54:38 -06:00
echo "Checking BGP peer $peer_ip " ;
// --- Collect BGP data ---
2022-08-07 16:22:39 +02:00
// If a Cisco device has BGP peers in VRF(s),
// but no BGP peers in the default VRF,
// a SNMP (v3) walk without context will not find any
// cbgpPeer2RemoteAs, resulting in empty $peer_data_check.
// Without the or clause, we won't see the VRF BGP peers.
// ($peer_data_check isn't used in the Cisco code path,)
if ( count ( $peer_data_check ) > 0 || ( $device [ 'os_group' ] == 'cisco' && count ( DeviceCache :: getPrimary () -> getVrfContexts ()) > 1 )) {
2020-11-07 16:12:09 +01:00
if ( $generic ) {
echo " \n fallback to default mib" ;
$peer_identifier = $peer [ 'bgpPeerIdentifier' ];
$mib = 'BGP4-MIB' ;
$oid_map = [
'bgpPeerState' => 'bgpPeerState' ,
'bgpPeerAdminStatus' => 'bgpPeerAdminStatus' ,
'bgpPeerInUpdates' => 'bgpPeerInUpdates' ,
'bgpPeerOutUpdates' => 'bgpPeerOutUpdates' ,
'bgpPeerInTotalMessages' => 'bgpPeerInTotalMessages' ,
'bgpPeerOutTotalMessages' => 'bgpPeerOutTotalMessages' ,
'bgpPeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime' ,
'bgpPeerInUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime' ,
'bgpPeerLocalAddr' => 'bgpLocalAddr' , // silly db field name
'bgpPeerLastError' => 'bgpPeerLastErrorCode' ,
];
} elseif ( $device [ 'os' ] == 'junos' ) {
2020-09-21 15:43:38 +02:00
if ( ! isset ( $junos )) {
2018-01-18 14:54:38 -06:00
echo " \n Caching Oids..." ;
foreach ( $peer_data_check as $hash => $index ) {
2021-04-08 14:57:17 +02:00
$peer_ip_snmp = ltrim ( $index [ 'orig' ], '.' );
$exploded_ip = explode ( '.' , $peer_ip_snmp );
if ( count ( $exploded_ip ) > 11 ) {
// ipv6
$tmp_peer_ip = ( string ) IP :: parse ( snmp2ipv6 ( $peer_ip_snmp ), true );
} else {
// ipv4
$tmp_peer_ip = implode ( '.' , array_slice ( $exploded_ip , - 4 ));
}
2018-01-18 14:54:38 -06:00
$junos [ $tmp_peer_ip ][ 'hash' ] = $hash ;
$junos [ $tmp_peer_ip ][ 'index' ] = $index [ 'jnxBgpM2PeerIndex' ];
}
}
2020-09-21 15:43:38 +02:00
if ( ! isset ( $peer_data_tmp )) {
2021-04-08 14:57:17 +02:00
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerState' , '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
2018-01-18 14:54:38 -06:00
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerStatus' , '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerInUpdates' , '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerOutUpdates' , '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerInTotalMessages' , '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.3' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerOutTotalMessages' , '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.4' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerFsmEstablishedTime' , '.1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerInUpdatesElapsedTime' , '.1.3.6.1.4.1.2636.5.1.1.2.4.1.1.2' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerLocalAddr' , '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.7' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerRemoteAddrType' , '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.10' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
2020-04-25 05:47:20 +02:00
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerLastErrorReceived' , '.1.3.6.1.4.1.2636.5.1.1.2.2.1.1.1' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
$peer_data_tmp = snmpwalk_cache_long_oid ( $device , 'jnxBgpM2PeerLastErrorReceivedText' , '.1.3.6.1.4.1.2636.5.1.1.2.2.1.1.5' , $peer_data_tmp , 'BGP4-V2-MIB-JUNIPER' , 'junos' );
2018-01-18 14:54:38 -06:00
d_echo ( $peer_data_tmp );
2015-07-13 20:10:26 +02:00
}
2020-09-21 15:43:38 +02:00
$peer_hash = $junos [( string ) $peer_ip ][ 'hash' ];
2020-04-10 13:22:26 +02:00
$peer_data = [];
2018-01-18 14:54:38 -06:00
$peer_data [ 'bgpPeerState' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerState' ];
$peer_data [ 'bgpPeerAdminStatus' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerStatus' ];
$peer_data [ 'bgpPeerInUpdates' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerInUpdates' ];
$peer_data [ 'bgpPeerOutUpdates' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerOutUpdates' ];
$peer_data [ 'bgpPeerInTotalMessages' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerInTotalMessages' ];
$peer_data [ 'bgpPeerOutTotalMessages' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerOutTotalMessages' ];
$peer_data [ 'bgpPeerFsmEstablishedTime' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerFsmEstablishedTime' ];
2020-04-25 05:47:20 +02:00
$peer_data [ 'bgpPeerLastErrorText' ] = $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerLastErrorReceivedText' ];
$error_data = explode ( ' ' , $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerLastErrorReceived' ]);
$peer_data [ 'bgpPeerLastErrorCode' ] = intval ( $error_data [ 0 ]);
$peer_data [ 'bgpPeerLastErrorSubCode' ] = intval ( $error_data [ 1 ]);
2018-01-18 14:54:38 -06:00
try {
$peer_data [ 'bgpLocalAddr' ] = IP :: fromHexString ( $peer_data_tmp [ $peer_hash ][ 'jnxBgpM2PeerLocalAddr' ]) -> uncompressed ();
} catch ( InvalidIpException $e ) {
$peer_data [ 'bgpLocalAddr' ] = '' ;
}
d_echo ( "State = { $peer_data [ 'bgpPeerState' ] } - AdminStatus: { $peer_data [ 'bgpPeerAdminStatus' ] } \n " );
2020-04-10 13:22:26 +02:00
} elseif ( $device [ 'os' ] == 'vrp' ) {
echo " \n Caching Oids VRP..." ;
2020-09-21 15:43:38 +02:00
if ( ! isset ( $bgpPeers )) {
2020-05-24 04:11:55 +02:00
//if not available, we timeout each time, to be fixed when split
2020-04-10 13:22:26 +02:00
$bgpPeersCache = snmpwalk_cache_oid ( $device , 'hwBgpPeerEntry' , [], 'HUAWEI-BGP-VPN-MIB' , 'huawei' );
$bgpPeersStats = snmpwalk_cache_oid ( $device , 'hwBgpPeerStatisticTable' , [], 'HUAWEI-BGP-VPN-MIB' , 'huawei' , '-OQUbs' );
2020-05-24 04:11:55 +02:00
$bgp4updates = snmpwalk_cache_oid ( $device , 'bgpPeerEntry' , [], 'BGP4-MIB' , 'huawei' , '-OQUbs' );
2020-04-10 13:22:26 +02:00
foreach ( $bgpPeersCache as $key => $value ) {
$oid = explode ( '.' , $key , 5 );
$vrfInstance = $oid [ 0 ];
$afi = $oid [ 1 ];
$safi = $oid [ 2 ];
$transp = $oid [ 3 ];
$address = $oid [ 4 ];
if ( strlen ( $address ) > 15 ) {
$address = IP :: fromHexString ( $address ) -> compressed ();
}
2020-09-21 15:43:38 +02:00
if ( ! isset ( $bgpPeers [ $address ][ $vrfInstance ])) {
2020-04-10 13:22:26 +02:00
$bgpPeers [ $address ][ $vrfInstance ] = [];
}
$bgpPeers [ $address ][ $vrfInstance ] = array_merge ( $bgpPeers [ $address ][ $vrfInstance ], $value );
//d_echo("$vrfInstance -- $address \t-- $value");
}
foreach ( $bgpPeersStats as $key => $value ) {
$oid = explode ( '.' , $key , 4 );
$vrfInstance = $oid [ 1 ];
$address = $oid [ 3 ];
if ( $oid [ 2 ] > 4 ) { //ipv6 so we have to translate
$address = IP :: fromSnmpString ( $oid [ 3 ]) -> compressed ();
}
$bgpPeers [ $address ][ $vrfInstance ] = array_merge ( $bgpPeers [ $address ][ $vrfInstance ], $value );
//d_echo("$vrfInstance -- $address \t-- $value");
//d_echo($value);
}
//d_echo($bgpPeersCache);
//d_echo($bgpPeersStats);
}
//d_echo($bgpPeers);
2020-09-21 15:43:38 +02:00
$address = ( string ) $peer_ip ;
2020-04-10 13:22:26 +02:00
$bgpPeer = $bgpPeers [ $address ];
$peer_data = [];
2020-09-21 15:43:38 +02:00
if ( count ( array_keys ( $bgpPeer )) == 1 ) { // We have only one vrf with a peer with this IP
2020-04-10 13:22:26 +02:00
$vrfInstance = array_keys ( $bgpPeer )[ 0 ];
$peer_data [ 'bgpPeerState' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerState' ];
2021-03-31 02:02:00 +02:00
$peer_data [ 'bgpPeerAdminStatus' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerAdminStatus' ];
2020-04-10 13:22:26 +02:00
$peer_data [ 'bgpPeerInUpdates' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerInUpdateMsgs' ];
$peer_data [ 'bgpPeerOutUpdates' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerOutUpdateMsgs' ];
$peer_data [ 'bgpPeerInTotalMessages' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerInTotalMsgs' ];
$peer_data [ 'bgpPeerOutTotalMessages' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerOutTotalMsgs' ];
$peer_data [ 'bgpPeerFsmEstablishedTime' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerFsmEstablishedTime' ];
2020-05-24 04:11:55 +02:00
$peer_data [ 'bgpPeerLastError' ] = $bgpPeers [ $address ][ $vrfInstance ][ 'hwBgpPeerLastError' ];
2020-04-10 13:22:26 +02:00
}
2020-05-24 04:11:55 +02:00
d_echo ( "VPN : $vrfInstance for $address : \n " );
2020-04-10 13:22:26 +02:00
d_echo ( $peer_data );
2020-05-24 04:11:55 +02:00
if ( empty ( $peer_data [ 'bgpPeerInUpdates' ]) || empty ( $peer_data [ 'bgpPeerOutUpdates' ])) {
$peer_data [ 'bgpPeerInUpdates' ] = $bgp4updates [ $address ][ 'bgpPeerInUpdates' ];
$peer_data [ 'bgpPeerOutUpdates' ] = $bgp4updates [ $address ][ 'bgpPeerOutUpdates' ];
}
if ( empty ( $peer_data [ 'bgpPeerInTotalMessages' ]) || empty ( $peer_data [ 'bgpPeerOutTotalMessages' ])) {
$peer_data [ 'bgpPeerInTotalMessages' ] = $bgp4updates [ $address ][ 'bgpPeerInTotalMessages' ];
$peer_data [ 'bgpPeerOutTotalMessages' ] = $bgp4updates [ $address ][ 'bgpPeerOutTotalMessages' ];
}
if ( empty ( $peer_data [ 'bgpPeerState' ])) {
$peer_data [ 'bgpPeerState' ] = $bgp4updates [ $address ][ 'bgpPeerState' ];
}
if ( empty ( $peer_data [ 'bgpPeerAdminStatus' ])) {
$peer_data [ 'bgpPeerAdminStatus' ] = $bgp4updates [ $address ][ 'bgpPeerAdminStatus' ];
}
if ( empty ( $peer_data [ 'bgpPeerLastError' ])) {
$peer_data [ 'bgpPeerLastError' ] = $bgp4updates [ $address ][ 'bgpPeerLastError' ];
}
$error_data = explode ( ' ' , $peer_data [ 'bgpPeerLastError' ]);
$peer_data [ 'bgpPeerLastErrorCode' ] = intval ( $error_data [ 0 ]);
$peer_data [ 'bgpPeerLastErrorSubCode' ] = intval ( $error_data [ 1 ]);
unset ( $peer_data [ 'bgpPeerLastError' ]);
2019-01-19 18:44:32 +01:00
} elseif ( $device [ 'os' ] == 'timos' ) {
2020-09-21 15:43:38 +02:00
if ( ! isset ( $bgpPeers )) {
2019-01-19 18:44:32 +01:00
echo " \n Caching Oids..." ;
$bgpPeersCache = snmpwalk_cache_multi_oid ( $device , 'tBgpPeerNgTable' , [], 'TIMETRA-BGP-MIB' , 'nokia' );
$bgpPeersCache = snmpwalk_cache_multi_oid ( $device , 'tBgpPeerNgOperEntry' , $bgpPeersCache , 'TIMETRA-BGP-MIB' , 'nokia' );
foreach ( $bgpPeersCache as $key => $value ) {
$oid = explode ( '.' , $key );
$vrfInstance = $oid [ 0 ];
2020-09-21 15:43:38 +02:00
$address = str_replace ( $oid [ 0 ] . '.' . $oid [ 1 ] . '.' , '' , $key );
2019-01-19 18:44:32 +01:00
if ( strlen ( $address ) > 15 ) {
$address = IP :: fromHexString ( $address ) -> compressed ();
}
$bgpPeers [ $vrfInstance ][ $address ] = $value ;
}
}
2020-09-21 15:43:38 +02:00
$address = ( string ) $peer_ip ;
2019-01-19 18:44:32 +01:00
$tmpTime = $bgpPeers [ $vrfOid ][ $address ][ 'tBgpPeerNgLastChanged' ];
$tmpTime = explode ( '.' , $tmpTime );
$tmpTime = explode ( ':' , $tmpTime [ 0 ]);
$establishedTime = ( $tmpTime [ 0 ] * 86400 ) + ( $tmpTime [ 1 ] * 3600 ) + ( $tmpTime [ 2 ] * 60 ) + $tmpTime [ 3 ];
$peer_data = [];
$peer_data [ 'bgpPeerState' ] = $bgpPeers [ $vrfOid ][ $address ][ 'tBgpPeerNgConnState' ];
2019-06-27 07:16:25 +02:00
if ( $bgpPeers [ $vrfOid ][ $address ][ 'tBgpPeerNgShutdown' ] == '1' ) {
$peer_data [ 'bgpPeerAdminStatus' ] = 'adminShutdown' ;
} else {
$peer_data [ 'bgpPeerAdminStatus' ] = $bgpPeers [ $vrfOid ][ $address ][ 'tBgpPeerNgOperLastEvent' ];
}
2019-01-19 18:44:32 +01:00
$peer_data [ 'bgpPeerInTotalMessages' ] = $bgpPeers [ $vrfOid ][ $address ][ 'tBgpPeerNgOperMsgOctetsRcvd' ]; // That are actually only octets available,
$peer_data [ 'bgpPeerOutTotalMessages' ] = $bgpPeers [ $vrfOid ][ $address ][ 'tBgpPeerNgOperMsgOctetsSent' ]; // not messages
$peer_data [ 'bgpPeerFsmEstablishedTime' ] = $establishedTime ;
2021-04-04 15:17:49 +01:00
} elseif ( $device [ 'os' ] == 'firebrick' ) {
// ToDo, It seems that bgpPeer(In|Out)Updates and bgpPeerInUpdateElapsedTime are actually not available over SNMP
$bgpPeer = null ;
foreach ( $peer_data_check as $key => $value ) {
$oid = explode ( '.' , $key );
$protocol = $oid [ 0 ];
$address = str_replace ( $oid [ 0 ] . '.' , '' , $key );
if ( strlen ( $address ) > 15 ) {
$address = IP :: fromHexString ( $address ) -> compressed ();
}
// Some older Firebrick software versions don't have this field
if ( isset ( $value [ 'fbBgpPeerLocalAddress' ])) {
$peer_data [ 'bgpLocalAddr' ] = IP :: fromHexString ( $value [ 'fbBgpPeerLocalAddress' ]) -> uncompressed ();
}
if ( $address == $peer_ip ) {
switch ( $value [ 'fbBgpPeerState' ]) {
case 0 :
$peer_data [ 'bgpPeerState' ] = 'idle' ;
break ;
case 1 :
case 2 :
$peer_data [ 'bgpPeerState' ] = 'active' ;
break ;
case 3 :
$peer_data [ 'bgpPeerState' ] = 'opensent' ;
break ;
case 4 :
$peer_data [ 'bgpPeerState' ] = 'openconfig' ;
break ;
case 5 :
$peer_data [ 'bgpPeerState' ] = 'established' ;
break ;
case 6 :
$peer_data [ 'bgpPeerState' ] = 'closed' ;
break ;
case 7 :
$peer_data [ 'bgpPeerState' ] = 'free' ;
break ;
}
$peer_data [ 'bgpPeerRemoteAddr' ] = $address ;
$peer_data [ 'bgpPeerRemoteAs' ] = $value [ 'fbBgpPeerRemoteAS' ];
$peer_data [ 'bgpPeerAdminStatus' ] = 'start' ;
$peer_data [ 'bgpPeerInUpdates' ] = 0 ;
$peer_data [ 'bgpPeerOutUpdates' ] = 0 ;
$peer_data [ 'bgpPeerInTotalMessages' ] = 0 ;
$peer_data [ 'bgpPeerOutTotalMessages' ] = 0 ;
$peer_data [ 'bgpPeerFsmEstablishedTime' ] = 0 ;
break ;
}
}
2018-01-18 14:54:38 -06:00
} else {
$bgp_peer_ident = $peer_ip -> toSnmpIndex ();
$ip_ver = $peer_ip -> getFamily ();
if ( $ip_ver == 'ipv6' ) {
2016-02-09 18:23:31 +00:00
$ip_type = 2 ;
2018-01-18 14:54:38 -06:00
$ip_len = 16 ;
2016-08-28 12:32:58 -05:00
} else {
2016-02-09 18:23:31 +00:00
$ip_type = 1 ;
2018-01-18 14:54:38 -06:00
$ip_len = 4 ;
2016-02-09 18:23:31 +00:00
}
2015-07-13 20:10:26 +02:00
2017-03-11 23:16:49 +00:00
if ( $device [ 'os_group' ] === 'arista' ) {
2018-01-18 14:54:38 -06:00
$peer_identifier = '1.' . $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident ;
$mib = 'ARISTA-BGP4V2-MIB' ;
2020-04-10 13:22:26 +02:00
$oid_map = [
2018-01-18 14:54:38 -06:00
'aristaBgp4V2PeerState' => 'bgpPeerState' ,
'aristaBgp4V2PeerAdminStatus' => 'bgpPeerAdminStatus' ,
'aristaBgp4V2PeerInUpdates' => 'bgpPeerInUpdates' ,
'aristaBgp4V2PeerOutUpdates' => 'bgpPeerOutUpdates' ,
'aristaBgp4V2PeerInTotalMessages' => 'bgpPeerInTotalMessages' ,
'aristaBgp4V2PeerOutTotalMessages' => 'bgpPeerOutTotalMessages' ,
'aristaBgp4V2PeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime' ,
'aristaBgp4V2PeerInUpdatesElapsedTime' => 'bgpPeerInUpdateElapsedTime' ,
'aristaBgp4V2PeerLocalAddr' => 'bgpLocalAddr' ,
2020-05-05 15:51:39 -07:00
'aristaBgp4V2PeerDescription' => 'bgpPeerDescr' ,
2020-04-25 05:47:20 +02:00
'aristaBgp4V2PeerLastErrorCodeReceived' => 'bgpPeerLastErrorCode' ,
'aristaBgp4V2PeerLastErrorSubCodeReceived' => 'bgpPeerLastErrorSubCode' ,
'aristaBgp4V2PeerLastErrorReceivedText' => 'bgpPeerLastErrorText' ,
2020-09-21 15:43:38 +02:00
];
2021-02-27 01:57:16 +10:00
} elseif ( $device [ 'os' ] == 'dell-os10' ) {
$peer_identifier = '1.' . $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident ;
$mib = 'DELLEMC-OS10-BGP4V2-MIB' ;
$oid_map = [
'os10bgp4V2PeerState' => 'bgpPeerState' ,
'os10bgp4V2PeerAdminStatus' => 'bgpPeerAdminStatus' ,
'os10bgp4V2PeerInUpdates' => 'bgpPeerInUpdates' ,
'os10bgp4V2PeerOutUpdates' => 'bgpPeerOutUpdates' ,
'os10bgp4V2PeerInTotalMessages' => 'bgpPeerInTotalMessages' ,
'os10bgp4V2PeerOutTotalMessages' => 'bgpPeerOutTotalMessages' ,
'os10bgp4V2PeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime' ,
'os10bgp4V2PeerInUpdatesElapsedTime' => 'bgpPeerInUpdateElapsedTime' ,
'os10bgp4V2PeerLocalAddr' => 'bgpLocalAddr' ,
'os10bgp4V2PeerDescription' => 'bgpPeerDescr' ,
'os10bgp4V2PeerLastErrorCodeReceived' => 'bgpPeerLastErrorCode' ,
'os10bgp4V2PeerLastErrorSubCodeReceived' => 'bgpPeerLastErrorSubCode' ,
'os10bgp4V2PeerLastErrorReceivedText' => 'bgpPeerLastErrorText' ,
];
2021-07-18 14:32:59 +03:00
} elseif ( $device [ 'os' ] == 'aos7' ) {
2021-01-26 06:56:59 +02:00
$peer_identifier = $peer [ 'bgpPeerIdentifier' ];
$peer_data = [];
$al_descr = snmpwalk_cache_multi_oid ( $device , 'alaBgpPeerName' , $al_descr , 'ALCATEL-IND1-BGP-MIB' , 'aos7' , '-OQUs' );
2021-07-21 16:03:21 +03:00
$al_peer = snmpwalk_cache_multi_oid ( $device , 'BgpPeerEntry' , [], 'BGP4-MIB' , 'aos7' , '-OQUs' );
2021-01-26 06:56:59 +02:00
$peer_data [ 'bgpPeerDescr' ] = $al_descr [ $peer_identifier ][ 'alaBgpPeerName' ];
2021-07-18 14:32:59 +03:00
$peer_data [ 'bgpPeerState' ] = $al_peer [ $peer_identifier ][ 'bgpPeerState' ];
$peer_data [ 'bgpPeerAdminStatus' ] = $al_peer [ $peer_identifier ][ 'bgpPeerAdminStatus' ];
$peer_data [ 'bgpPeerInUpdates' ] = $al_peer [ $peer_identifier ][ 'bgpPeerInUpdates' ];
$peer_data [ 'bgpPeerOutUpdates' ] = $al_peer [ $peer_identifier ][ 'bgpPeerOutUpdates' ];
$peer_data [ 'bgpPeerInTotalMessages' ] = $al_peer [ $peer_identifier ][ 'bgpPeerInTotalMessages' ];
$peer_data [ 'bgpPeerOutTotalMessages' ] = $al_peer [ $peer_identifier ][ 'bgpPeerOutTotalMessages' ];
$peer_data [ 'bgpPeerFsmEstablishedTime' ] = $al_peer [ $peer_identifier ][ 'bgpPeerFsmEstablishedTime' ];
$peer_data [ 'bgpPeerInUpdateElapsedTime' ] = $al_peer [ $peer_identifier ][ 'bgpPeerInUpdateElapsedTime' ];
2021-07-21 16:03:21 +03:00
$error_data = explode ( ' ' , $al_peer [ $peer_identifier ][ 'bgpPeerLastError' ]);
$peer_data [ 'bgpPeerLastErrorCode' ] = intval ( $error_data [ 0 ]);
$peer_data [ 'bgpPeerLastErrorSubCode' ] = intval ( $error_data [ 1 ]);
2020-11-07 16:12:09 +01:00
} elseif ( $device [ 'os_group' ] == 'cisco' ) {
2018-01-18 14:54:38 -06:00
$peer_identifier = $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident ;
$mib = 'CISCO-BGP4-MIB' ;
2020-04-10 13:22:26 +02:00
$oid_map = [
2018-01-18 14:54:38 -06:00
'cbgpPeer2State' => 'bgpPeerState' ,
'cbgpPeer2AdminStatus' => 'bgpPeerAdminStatus' ,
'cbgpPeer2InUpdates' => 'bgpPeerInUpdates' ,
'cbgpPeer2OutUpdates' => 'bgpPeerOutUpdates' ,
'cbgpPeer2InTotalMessages' => 'bgpPeerInTotalMessages' ,
'cbgpPeer2OutTotalMessages' => 'bgpPeerOutTotalMessages' ,
'cbgpPeer2FsmEstablishedTime' => 'bgpPeerFsmEstablishedTime' ,
'cbgpPeer2InUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime' ,
'cbgpPeer2LocalAddr' => 'bgpLocalAddr' ,
2020-04-25 05:47:20 +02:00
'cbgpPeer2LastError' => 'bgpPeerLastErrorCode' ,
'cbgpPeer2LastErrorTxt' => 'bgpPeerLastErrorText' ,
2020-04-10 13:22:26 +02:00
];
2022-05-22 14:27:28 +02:00
} elseif ( $device [ 'os' ] == 'cumulus' ) {
$peer_identifier = $peer [ 'bgpPeerIdentifier' ];
$mib = 'CUMULUS-BGPUN-MIB' ;
$oid_map = [
'bgpPeerState' => 'bgpPeerState' ,
'bgpPeerAdminStatus' => 'bgpPeerAdminStatus' ,
'bgpPeerInUpdates' => 'bgpPeerInUpdates' ,
'bgpPeerOutUpdates' => 'bgpPeerOutUpdates' ,
'bgpPeerInTotalMessages' => 'bgpPeerInTotalMessages' ,
'bgpPeerOutTotalMessages' => 'bgpPeerOutTotalMessages' ,
'bgpPeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime' ,
'bgpPeerInUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime' ,
'bgpPeerLocalAddr' => 'bgpLocalAddr' ,
'bgpPeerLastError' => 'bgpPeerLastErrorCode' ,
'bgpPeerIface' => 'bgpPeerIface' ,
];
2020-11-07 16:12:09 +01:00
} else {
$peer_identifier = $peer [ 'bgpPeerIdentifier' ];
$mib = 'BGP4-MIB' ;
$oid_map = [
'bgpPeerState' => 'bgpPeerState' ,
'bgpPeerAdminStatus' => 'bgpPeerAdminStatus' ,
'bgpPeerInUpdates' => 'bgpPeerInUpdates' ,
'bgpPeerOutUpdates' => 'bgpPeerOutUpdates' ,
'bgpPeerInTotalMessages' => 'bgpPeerInTotalMessages' ,
'bgpPeerOutTotalMessages' => 'bgpPeerOutTotalMessages' ,
'bgpPeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime' ,
'bgpPeerInUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime' ,
'bgpPeerLocalAddr' => 'bgpLocalAddr' , // silly db field name
'bgpPeerLastError' => 'bgpPeerLastErrorCode' ,
];
2017-03-11 23:16:49 +00:00
}
2018-01-18 14:54:38 -06:00
}
}
2015-07-13 20:10:26 +02:00
2018-01-18 14:54:38 -06:00
// --- Build peer data if it is not already filled in ---
if ( empty ( $peer_data ) && isset ( $peer_identifier , $oid_map , $mib )) {
echo "Fetching $mib data... \n " ;
$get_oids = array_map ( function ( $oid ) use ( $peer_identifier ) {
return " $oid . $peer_identifier " ;
}, array_keys ( $oid_map ));
$peer_data_raw = snmp_get_multi ( $device , $get_oids , '-OQUs' , $mib );
$peer_data_raw = reset ( $peer_data_raw ); // get the first element of the array
2020-09-21 15:43:38 +02:00
$peer_data = [];
2018-01-18 14:54:38 -06:00
foreach ( $oid_map as $source => $target ) {
$v = isset ( $peer_data_raw [ $source ]) ? $peer_data_raw [ $source ] : '' ;
2020-04-17 17:37:56 -05:00
if ( Str :: contains ( $source , 'LocalAddr' )) {
2018-01-18 14:54:38 -06:00
try {
$v = IP :: fromHexString ( $v ) -> uncompressed ();
} catch ( InvalidIpException $e ) {
// if parsing fails, leave the data as-is
2016-08-02 22:28:57 +01:00
}
2016-02-09 18:23:31 +00:00
}
2018-01-18 14:54:38 -06:00
$peer_data [ $target ] = $v ;
2015-07-13 20:10:26 +02:00
}
2020-05-24 04:11:55 +02:00
if ( strpos ( $peer_data [ 'bgpPeerLastErrorCode' ], ' ' )) {
// Some device return both Code and SubCode in the same snmp field, we need to split it
$splitted_codes = explode ( ' ' , $peer_data [ 'bgpPeerLastErrorCode' ]);
$error_code = intval ( $splitted_codes [ 0 ]);
$error_subcode = intval ( $splitted_codes [ 1 ]);
$peer_data [ 'bgpPeerLastErrorCode' ] = $error_code ;
$peer_data [ 'bgpPeerLastErrorSubCode' ] = $error_subcode ;
}
2022-05-22 14:27:28 +02:00
// --- Fill the bgpPeerIface column ---
$bgpPeerIfaceFilled = false ;
if ( isset ( $peer_data [ 'bgpPeerIface' ])) {
if ( ! ( filter_var ( $peer_data [ 'bgpPeerIface' ], FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 )) && ! ( filter_var ( $peer_data [ 'bgpPeerIface' ], FILTER_VALIDATE_IP , FILTER_FLAG_IPV6 ))) {
// The column is already filled with the ifName, we change it to ifIndex
$bgpPeerIface = DB :: table ( 'ports' ) -> where ( 'device_id' , '=' , $device [ 'device_id' ]) -> where ( 'ifName' , '=' , $peer_data [ 'bgpPeerIface' ]) -> first () -> ifIndex ;
$bgpPeerIfaceFilled = true ;
}
}
if ( ! ( $bgpPeerIfaceFilled ) && isset ( $peer_data [ 'bgpLocalAddr' ])) {
// else we use the bgpLocalAddr to find ifIndex
if ( filter_var ( $peer_data [ 'bgpLocalAddr' ], FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 )) {
$ipv4 = IP :: fromHexString ( $peer_data [ 'bgpLocalAddr' ]) -> uncompressed ();
$bgpPeerIface = DB :: table ( 'ports' ) -> join ( 'ipv4_addresses' , 'ports.port_id' , '=' , 'ipv4_addresses.port_id' ) -> where ( 'ipv4_address' , '=' , $ipv4 ) -> first () -> ifIndex ;
} elseif ( filter_var ( $peer_data [ 'bgpLocalAddr' ], FILTER_VALIDATE_IP , FILTER_FLAG_IPV6 )) {
$ipv6 = IP :: fromHexString ( $peer_data [ 'bgpLocalAddr' ]) -> uncompressed ();
$bgpPeerIface = DB :: table ( 'ports' ) -> join ( 'ipv6_addresses' , 'ports.port_id' , '=' , 'ipv6_addresses.port_id' ) -> where ( 'ipv6_address' , '=' , $ipv6 ) -> first () -> ifIndex ;
}
}
if ( isset ( $bgpPeerIface )) {
$peer_data [ 'bgpPeerIface' ] = $bgpPeerIface ;
}
2018-01-18 14:54:38 -06:00
}
d_echo ( $peer_data );
} catch ( InvalidIpException $e ) {
// ignore
}
// --- Send event log notices ---
if ( $peer_data [ 'bgpPeerFsmEstablishedTime' ]) {
2020-09-21 15:43:38 +02:00
if ( ! ( is_array ( \LibreNMS\Config :: get ( 'alerts.bgp.whitelist' ))
&& ! in_array ( $peer [ 'bgpPeerRemoteAs' ], \LibreNMS\Config :: get ( 'alerts.bgp.whitelist' )))
2018-01-18 14:54:38 -06:00
&& ( $peer_data [ 'bgpPeerFsmEstablishedTime' ] < $peer [ 'bgpPeerFsmEstablishedTime' ]
|| $peer_data [ 'bgpPeerState' ] != $peer [ 'bgpPeerState' ])
) {
if ( $peer [ 'bgpPeerState' ] == $peer_data [ 'bgpPeerState' ]) {
2022-06-22 13:06:07 -05:00
log_event ( 'BGP Session Flap: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ' ' . $peer [ 'bgpPeerDescr' ] . '), last error: ' . describe_bgp_error_code ( $peer [ 'bgpPeerLastErrorCode' ], $peer [ 'bgpPeerLastErrorSubCode' ]), $device , 'bgpPeer' , 4 , $peer_ip );
2018-01-18 14:54:38 -06:00
} elseif ( $peer_data [ 'bgpPeerState' ] == 'established' ) {
2022-06-22 13:06:07 -05:00
log_event ( 'BGP Session Up: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ' ' . $peer [ 'bgpPeerDescr' ] . ')' , $device , 'bgpPeer' , 1 , $peer_ip );
2016-08-28 12:32:58 -05:00
} elseif ( $peer [ 'bgpPeerState' ] == 'established' ) {
2022-06-22 13:06:07 -05:00
log_event ( 'BGP Session Down: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ' ' . $peer [ 'bgpPeerDescr' ] . '), last error: ' . describe_bgp_error_code ( $peer [ 'bgpPeerLastErrorCode' ], $peer [ 'bgpPeerLastErrorSubCode' ]), $device , 'bgpPeer' , 5 , $peer_ip );
2015-07-13 20:10:26 +02:00
}
2015-06-02 16:32:39 +01:00
}
}
2011-03-16 01:11:27 +00:00
2018-01-18 14:54:38 -06:00
// --- Update rrd data ---
2021-03-28 17:25:30 -05:00
$peer_rrd_name = \LibreNMS\Data\Store\Rrd :: safeName ( 'bgp-' . $peer [ 'bgpPeerIdentifier' ]);
2017-02-23 22:45:50 +00:00
$peer_rrd_def = RrdDefinition :: make ()
-> addDataset ( 'bgpPeerOutUpdates' , 'COUNTER' , null , 100000000000 )
-> addDataset ( 'bgpPeerInUpdates' , 'COUNTER' , null , 100000000000 )
-> addDataset ( 'bgpPeerOutTotal' , 'COUNTER' , null , 100000000000 )
-> addDataset ( 'bgpPeerInTotal' , 'COUNTER' , null , 100000000000 )
-> addDataset ( 'bgpPeerEstablished' , 'GAUGE' , 0 );
2017-11-20 18:37:02 +00:00
// Validate data
2018-01-18 14:54:38 -06:00
$peer_data [ 'bgpPeerFsmEstablishedTime' ] = set_numeric ( $peer_data [ 'bgpPeerFsmEstablishedTime' ]);
$peer_data [ 'bgpPeerInUpdates' ] = set_numeric ( $peer_data [ 'bgpPeerInUpdates' ]);
$peer_data [ 'bgpPeerOutUpdates' ] = set_numeric ( $peer_data [ 'bgpPeerOutUpdates' ]);
2022-02-14 06:05:18 -03:00
$peer_data [ 'bgpPeerInTotalMessages' ] = set_numeric ( $peer_data [ 'bgpPeerInTotalMessages' ]);
$peer_data [ 'bgpPeerOutTotalMessages' ] = set_numeric ( $peer_data [ 'bgpPeerOutTotalMessages' ]);
2017-11-20 18:37:02 +00:00
2020-04-10 13:22:26 +02:00
$fields = [
2018-01-18 14:54:38 -06:00
'bgpPeerOutUpdates' => $peer_data [ 'bgpPeerOutUpdates' ],
'bgpPeerInUpdates' => $peer_data [ 'bgpPeerInUpdates' ],
'bgpPeerOutTotal' => $peer_data [ 'bgpPeerOutTotalMessages' ],
'bgpPeerInTotal' => $peer_data [ 'bgpPeerInTotalMessages' ],
'bgpPeerEstablished' => $peer_data [ 'bgpPeerFsmEstablishedTime' ],
2020-04-10 13:22:26 +02:00
];
2016-02-09 18:23:31 +00:00
2020-04-10 13:22:26 +02:00
$tags = [
2016-07-07 01:33:43 -05:00
'bgpPeerIdentifier' => $peer [ 'bgpPeerIdentifier' ],
'rrd_name' => $peer_rrd_name ,
2020-09-21 15:43:38 +02:00
'rrd_def' => $peer_rrd_def ,
2020-04-10 13:22:26 +02:00
];
2016-08-28 12:32:58 -05:00
data_update ( $device , 'bgp' , $tags , $fields );
2016-02-09 18:23:31 +00:00
2018-01-18 14:54:38 -06:00
// --- Update Database data ---
$peer [ 'update' ] = array_diff_assoc ( $peer_data , $peer );
unset ( $peer_data );
2017-12-20 15:48:35 -06:00
2017-11-20 18:37:02 +00:00
if ( $peer [ 'update' ]) {
2019-01-19 18:44:32 +01:00
if ( $vrfId ) {
2020-09-21 15:43:38 +02:00
dbUpdate ( $peer [ 'update' ], 'bgpPeers' , '`device_id` = ? AND `bgpPeerIdentifier` = ? AND `vrf_id` = ?' , [ $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ], $vrfId ]);
2019-01-19 18:44:32 +01:00
} else {
2020-09-21 15:43:38 +02:00
dbUpdate ( $peer [ 'update' ], 'bgpPeers' , '`device_id` = ? AND `bgpPeerIdentifier` = ?' , [ $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ]]);
2019-01-19 18:44:32 +01:00
}
2017-11-20 18:37:02 +00:00
}
2016-02-09 18:23:31 +00:00
2018-01-18 14:54:38 -06:00
// --- Populate cbgp data ---
2021-04-04 15:17:49 +01:00
if ( $device [ 'os_group' ] == 'vrp' || $device [ 'os_group' ] == 'cisco' || $device [ 'os' ] == 'junos' || $device [ 'os' ] == 'aos7' || $device [ 'os_group' ] === 'arista' || $device [ 'os' ] == 'dell-os10' || $device [ 'os' ] == 'firebrick' ) {
2016-02-09 18:23:31 +00:00
// Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB or BGP4-V2-JUNIPER MIB)
2020-09-21 15:43:38 +02:00
$peer_afis = dbFetchRows ( 'SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ? AND bgpPeerIdentifier = ?' , [ $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ]]);
2016-02-09 18:23:31 +00:00
foreach ( $peer_afis as $peer_afi ) {
2020-09-21 15:43:38 +02:00
$afi = $peer_afi [ 'afi' ];
2016-02-09 18:23:31 +00:00
$safi = $peer_afi [ 'safi' ];
d_echo ( " $afi $safi \n " );
if ( $device [ 'os_group' ] == 'cisco' ) {
2018-01-18 14:54:38 -06:00
$bgp_peer_ident = $peer_ip -> toSnmpIndex ();
$ip_ver = $peer_ip -> getFamily ();
if ( $ip_ver == 'ipv6' ) {
2016-02-09 18:23:31 +00:00
$ip_type = 2 ;
2020-09-21 15:43:38 +02:00
$ip_len = 16 ;
2016-08-28 12:32:58 -05:00
} else {
2016-02-09 18:23:31 +00:00
$ip_type = 1 ;
2020-09-21 15:43:38 +02:00
$ip_len = 4 ;
2015-07-13 20:10:26 +02:00
}
2016-02-09 18:23:31 +00:00
$ip_cast = 1 ;
if ( $peer_afi [ 'safi' ] == 'multicast' ) {
$ip_cast = 2 ;
2016-08-28 12:32:58 -05:00
} elseif ( $peer_afi [ 'safi' ] == 'unicastAndMulticast' ) {
2016-02-09 18:23:31 +00:00
$ip_cast = 3 ;
2016-08-28 12:32:58 -05:00
} elseif ( $peer_afi [ 'safi' ] == 'vpn' ) {
2016-02-09 18:23:31 +00:00
$ip_cast = 128 ;
}
2015-07-13 20:10:26 +02:00
2020-09-21 15:43:38 +02:00
$check = snmp_get ( $device , 'cbgpPeer2AcceptedPrefixes.' . $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident . '.' . $ip_type . '.' . $ip_cast , '' , 'CISCO-BGP4-MIB' );
2016-02-09 18:23:31 +00:00
2020-09-21 15:43:38 +02:00
if ( ! empty ( $check )) {
$cgp_peer_identifier = $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident . '.' . $ip_type . '.' . $ip_cast ;
2020-04-10 13:22:26 +02:00
$cbgp2_oids = [
2018-02-06 15:06:44 -06:00
'cbgpPeer2AcceptedPrefixes.' . $cgp_peer_identifier ,
'cbgpPeer2DeniedPrefixes.' . $cgp_peer_identifier ,
'cbgpPeer2PrefixAdminLimit.' . $cgp_peer_identifier ,
'cbgpPeer2PrefixThreshold.' . $cgp_peer_identifier ,
'cbgpPeer2PrefixClearThreshold.' . $cgp_peer_identifier ,
'cbgpPeer2AdvertisedPrefixes.' . $cgp_peer_identifier ,
'cbgpPeer2SuppressedPrefixes.' . $cgp_peer_identifier ,
'cbgpPeer2WithdrawnPrefixes.' . $cgp_peer_identifier ,
2020-04-10 13:22:26 +02:00
];
2018-02-06 15:06:44 -06:00
$cbgp_data_tmp = snmp_get_multi ( $device , $cbgp2_oids , '-OQUs' , 'CISCO-BGP4-MIB' );
2020-09-21 15:43:38 +02:00
$ident = " $ip_ver . \" " . $peer [ 'bgpPeerIdentifier' ] . '"' . '.' . $ip_type . '.' . $ip_cast ;
2018-02-06 15:06:44 -06:00
$key = key ( $cbgp_data_tmp ); // get key of item
2020-04-10 13:22:26 +02:00
$cbgp_data = [
2018-02-06 15:06:44 -06:00
'cbgpPeerAcceptedPrefixes' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2AcceptedPrefixes' ],
'cbgpPeerDeniedPrefixes' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2DeniedPrefixes' ],
'cbgpPeerPrefixAdminLimit' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2PrefixAdminLimit' ],
'cbgpPeerPrefixThreshold' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2PrefixThreshold' ],
'cbgpPeerPrefixClearThreshold' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2PrefixClearThreshold' ],
'cbgpPeerAdvertisedPrefixes' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2AdvertisedPrefixes' ],
'cbgpPeerSuppressedPrefixes' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2SuppressedPrefixes' ],
'cbgpPeerWithdrawnPrefixes' => $cbgp_data_tmp [ $key ][ 'cbgpPeer2WithdrawnPrefixes' ],
2020-04-10 13:22:26 +02:00
];
2016-08-28 12:32:58 -05:00
} else {
2020-04-10 13:22:26 +02:00
$cbgp_oids = [
2018-02-06 15:06:44 -06:00
'cbgpPeerAcceptedPrefixes.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerDeniedPrefixes.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerPrefixAdminLimit.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerPrefixThreshold.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerPrefixClearThreshold.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerAdvertisedPrefixes.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerSuppressedPrefixes.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
'cbgpPeerWithdrawnPrefixes.' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " ,
2020-04-10 13:22:26 +02:00
];
2018-02-06 15:06:44 -06:00
$cbgp_data = snmp_get_multi ( $device , $cbgp_oids , '-OUQs' , 'CISCO-BGP4-MIB' );
$cbgp_data = reset ( $cbgp_data ); // get first entry
}
d_echo ( $cbgp_data );
2016-06-06 15:09:31 +01:00
$cbgpPeerAcceptedPrefixes = $cbgp_data [ 'cbgpPeerAcceptedPrefixes' ];
$cbgpPeerDeniedPrefixes = $cbgp_data [ 'cbgpPeerDeniedPrefixes' ];
$cbgpPeerPrefixAdminLimit = $cbgp_data [ 'cbgpPeerPrefixAdminLimit' ];
$cbgpPeerPrefixThreshold = $cbgp_data [ 'cbgpPeerPrefixThreshold' ];
$cbgpPeerPrefixClearThreshold = $cbgp_data [ 'cbgpPeerPrefixClearThreshold' ];
$cbgpPeerAdvertisedPrefixes = $cbgp_data [ 'cbgpPeerAdvertisedPrefixes' ];
$cbgpPeerSuppressedPrefixes = $cbgp_data [ 'cbgpPeerSuppressedPrefixes' ];
$cbgpPeerWithdrawnPrefixes = $cbgp_data [ 'cbgpPeerWithdrawnPrefixes' ];
2016-02-13 21:48:26 +01:00
unset ( $cbgp_data );
2021-01-26 06:56:59 +02:00
} //end if
2015-07-13 20:10:26 +02:00
2016-02-20 18:08:39 +00:00
if ( $device [ 'os' ] == 'junos' ) {
2022-08-24 14:45:59 -05:00
$safis = [
'unicast' => 1 ,
'multicast' => 2 ,
'unicastAndMulticast' => 3 ,
'labeledUnicast' => 4 ,
'mvpn' => 5 ,
'vpls' => 65 ,
'evpn' => 70 ,
'vpn' => 128 ,
'rtfilter' => 132 ,
'flow' => 133 ,
];
2020-09-21 15:43:38 +02:00
if ( ! isset ( $j_prefixes )) {
2022-08-24 14:45:59 -05:00
$j_prefixes = SnmpQuery :: walk ([
'BGP4-V2-MIB-JUNIPER::jnxBgpM2PrefixInPrefixesAccepted' ,
'BGP4-V2-MIB-JUNIPER::jnxBgpM2PrefixInPrefixesRejected' ,
'BGP4-V2-MIB-JUNIPER::jnxBgpM2PrefixOutPrefixes' ,
]) -> table ( 3 );
2016-08-02 22:28:57 +01:00
}
2017-08-08 14:14:58 -05:00
2022-08-24 14:45:59 -05:00
$current_peer_data = $j_prefixes [ $junos [( string ) $peer_ip ][ 'index' ]][ $afi ][ $safis [ $safi ]];
$cbgpPeerAcceptedPrefixes = $current_peer_data [ 'BGP4-V2-MIB-JUNIPER::jnxBgpM2PrefixInPrefixesAccepted' ];
$cbgpPeerDeniedPrefixes = $current_peer_data [ 'BGP4-V2-MIB-JUNIPER::jnxBgpM2PrefixInPrefixesRejected' ];
$cbgpPeerAdvertisedPrefixes = $current_peer_data [ 'BGP4-V2-MIB-JUNIPER::jnxBgpM2PrefixOutPrefixes' ];
2016-02-20 18:08:39 +00:00
} //end if
2017-03-11 23:16:49 +00:00
if ( $device [ 'os_group' ] === 'arista' ) {
2020-09-21 15:43:38 +02:00
$safis [ 'unicast' ] = 1 ;
2017-03-11 23:16:49 +00:00
$safis [ 'multicast' ] = 2 ;
2020-09-21 15:43:38 +02:00
$afis [ 'ipv4' ] = 1 ;
$afis [ 'ipv6' ] = 2 ;
2017-03-11 23:16:49 +00:00
if ( preg_match ( '/:/' , $peer [ 'bgpPeerIdentifier' ])) {
$tmp_peer = str_replace ( ':' , '' , $peer [ 'bgpPeerIdentifier' ]);
$tmp_peer = preg_replace ( '/([\w\d]{2})/' , '\1:' , $tmp_peer );
$tmp_peer = rtrim ( $tmp_peer , ':' );
} else {
$tmp_peer = $peer [ 'bgpPeerIdentifier' ];
}
2020-02-24 09:49:42 +01:00
$a_prefixes = snmpwalk_cache_multi_oid ( $device , 'aristaBgp4V2PrefixInPrefixesAccepted' , $a_prefixes , 'ARISTA-BGP4V2-MIB' , null , '-OQUs' );
$out_prefixes = snmpwalk_cache_multi_oid ( $device , 'aristaBgp4V2PrefixOutPrefixes' , $out_prefixes , 'ARISTA-BGP4V2-MIB' , null , '-OQUs' );
2020-04-10 13:22:26 +02:00
2017-03-11 23:16:49 +00:00
$cbgpPeerAcceptedPrefixes = $a_prefixes [ "1. $afi . $tmp_peer . $afi . $safi " ][ 'aristaBgp4V2PrefixInPrefixesAccepted' ];
2020-02-24 09:49:42 +01:00
$cbgpPeerAdvertisedPrefixes = $out_prefixes [ "1. $afi . $tmp_peer . $afi . $safi " ][ 'aristaBgp4V2PrefixOutPrefixes' ];
2017-03-11 23:16:49 +00:00
}
2021-02-27 01:57:16 +10:00
if ( $device [ 'os' ] == 'dell-os10' ) {
$safis [ 'unicast' ] = 1 ;
$safis [ 'multicast' ] = 2 ;
$afis [ 'ipv4' ] = 1 ;
$afis [ 'ipv6' ] = 2 ;
if ( preg_match ( '/:/' , $peer [ 'bgpPeerIdentifier' ])) {
$tmp_peer = str_replace ( ':' , '' , $peer [ 'bgpPeerIdentifier' ]);
$tmp_peer = preg_replace ( '/([\w\d]{2})/' , '\1:' , $tmp_peer );
$tmp_peer = rtrim ( $tmp_peer , ':' );
} else {
$tmp_peer = $peer [ 'bgpPeerIdentifier' ];
}
$a_prefixes = snmpwalk_cache_multi_oid ( $device , 'os10bgp4V2PrefixInPrefixesAccepted' , $a_prefixes , 'DELLEMC-OS10-BGP4V2-MIB' , null , '-OQUs' );
$out_prefixes = snmpwalk_cache_multi_oid ( $device , 'os10bgp4V2PrefixOutPrefixes' , $out_prefixes , 'DELLEMC-OS10-BGP4V2-MIB' , null , '-OQUs' );
$cbgpPeerAcceptedPrefixes = $a_prefixes [ "1. $afi . $tmp_peer . $afi . $safi " ][ 'os10bgp4V2PrefixInPrefixesAccepted' ];
$cbgpPeerAdvertisedPrefixes = $out_prefixes [ "1. $afi . $tmp_peer . $afi . $safi " ][ 'os10bgp4V2PrefixOutPrefixes' ];
}
2021-01-26 06:56:59 +02:00
if ( $device [ 'os' ] === 'aos7' ) {
$tmp_peer = $peer [ 'bgpPeerIdentifier' ];
$al_prefixes = snmpwalk_cache_multi_oid ( $device , 'alaBgpPeerRcvdPrefixes' , $al_prefixes , 'ALCATEL-IND1-BGP-MIB' , 'aos7' , '-OQUs' );
$cbgpPeerAcceptedPrefixes = $al_prefixes [ $tmp_peer ][ 'alaBgpPeerRcvdPrefixes' ];
}
2019-04-09 14:44:48 +02:00
if ( $device [ 'os_group' ] === 'vrp' ) {
$vrpPrefixes = snmpwalk_cache_multi_oid ( $device , 'hwBgpPeerPrefixRcvCounter' , $vrpPrefixes , 'HUAWEI-BGP-VPN-MIB' , null , '-OQUs' );
$vrpPrefixes = snmpwalk_cache_multi_oid ( $device , 'hwBgpPeerPrefixAdvCounter' , $vrpPrefixes , 'HUAWEI-BGP-VPN-MIB' , null , '-OQUs' );
2020-02-01 23:28:03 +01:00
2020-02-11 20:54:12 +01:00
// only works in global routing table, as the vpnInstanceId is not available
// for now in the VRF discovery of VRP devices
2020-09-21 15:43:38 +02:00
$key4 = $vrfInstance . '.' . $afi . '.' . $safi . '.ipv4.' . $peer [ 'bgpPeerIdentifier' ];
$key6 = $vrfInstance . '.' . $afi . '.' . $safi . '.ipv6.' . $peer [ 'bgpPeerIdentifier' ];
2020-04-10 13:22:26 +02:00
if ( isset ( $vrpPrefixes [ $key4 ])) {
$cbgpPeerAcceptedPrefixes = $vrpPrefixes [ $key4 ][ 'hwBgpPeerPrefixRcvCounter' ];
2020-09-21 15:43:38 +02:00
$cbgpPeerAdvertisedPrefixes = $vrpPrefixes [ $key4 ][ 'hwBgpPeerPrefixAdvCounter' ];
2020-04-10 13:22:26 +02:00
}
if ( isset ( $vrpPrefixes [ $key6 ])) {
$cbgpPeerAcceptedPrefixes = $vrpPrefixes [ $key6 ][ 'hwBgpPeerPrefixRcvCounter' ];
2020-09-21 15:43:38 +02:00
$cbgpPeerAdvertisedPrefixes = $vrpPrefixes [ $key6 ][ 'hwBgpPeerPrefixAdvCounter' ];
2020-04-10 13:22:26 +02:00
}
2019-04-09 14:44:48 +02:00
}
2022-08-24 14:29:55 -05:00
if ( $device [ 'os' ] == 'firebrick' ) {
2021-04-04 15:17:49 +01:00
foreach ( $peer_data_check as $key => $value ) {
$oid = explode ( '.' , $key );
$protocol = $oid [ 0 ];
$address = str_replace ( $oid [ 0 ] . '.' , '' , $key );
if ( strlen ( $address ) > 15 ) {
$address = IP :: fromHexString ( $address ) -> compressed ();
}
if ( $address == $peer [ 'bgpPeerIdentifier' ]) {
$cbgpPeerAcceptedPrefixes = $value [ 'fbBgpPeerReceivedIpv4Prefixes' ] + $value [ 'fbBgpPeerReceivedIpv6Prefixes' ];
$cbgpPeerAdvertisedPrefixes = $value [ 'fbBgpPeerExported' ];
break ;
}
}
}
2017-11-20 18:37:02 +00:00
// Validate data
2020-09-21 15:43:38 +02:00
$cbgpPeerAcceptedPrefixes = set_numeric ( $cbgpPeerAcceptedPrefixes );
$cbgpPeerDeniedPrefixes = set_numeric ( $cbgpPeerDeniedPrefixes );
$cbgpPeerPrefixAdminLimit = set_numeric ( $cbgpPeerPrefixAdminLimit );
$cbgpPeerPrefixThreshold = set_numeric ( $cbgpPeerPrefixThreshold );
2017-11-20 18:37:02 +00:00
$cbgpPeerPrefixClearThreshold = set_numeric ( $cbgpPeerPrefixClearThreshold );
2020-09-21 15:43:38 +02:00
$cbgpPeerAdvertisedPrefixes = set_numeric ( $cbgpPeerAdvertisedPrefixes );
$cbgpPeerSuppressedPrefixes = set_numeric ( $cbgpPeerSuppressedPrefixes );
$cbgpPeerWithdrawnPrefixes = set_numeric ( $cbgpPeerWithdrawnPrefixes );
2017-11-20 18:37:02 +00:00
2020-04-10 13:22:26 +02:00
$cbgpPeers_cbgp_fields = [
2017-11-20 18:37:02 +00:00
'AcceptedPrefixes' => $cbgpPeerAcceptedPrefixes ,
'DeniedPrefixes' => $cbgpPeerDeniedPrefixes ,
2017-12-29 09:17:23 -06:00
'PrefixAdminLimit' => $cbgpPeerPrefixAdminLimit ,
2017-11-20 18:37:02 +00:00
'PrefixThreshold' => $cbgpPeerPrefixThreshold ,
'PrefixClearThreshold' => $cbgpPeerPrefixClearThreshold ,
'AdvertisedPrefixes' => $cbgpPeerAdvertisedPrefixes ,
'SuppressedPrefixes' => $cbgpPeerSuppressedPrefixes ,
'WithdrawnPrefixes' => $cbgpPeerWithdrawnPrefixes ,
2020-04-10 13:22:26 +02:00
];
2017-11-20 18:37:02 +00:00
foreach ( $cbgpPeers_cbgp_fields as $field => $value ) {
if ( $peer_afi [ $field ] != $value ) {
$peer [ 'c_update' ][ $field ] = $value ;
}
}
2016-02-09 18:23:31 +00:00
2020-04-10 13:22:26 +02:00
$oids = [
2016-02-09 18:23:31 +00:00
'AcceptedPrefixes' ,
'DeniedPrefixes' ,
'AdvertisedPrefixes' ,
'SuppressedPrefixes' ,
'WithdrawnPrefixes' ,
2020-04-10 13:22:26 +02:00
];
2016-01-26 01:06:21 +00:00
2016-02-09 18:23:31 +00:00
foreach ( $oids as $oid ) {
2020-09-21 15:43:38 +02:00
$tmp_prev = set_numeric ( $peer_afi [ $oid ]);
2018-11-09 04:51:53 +07:00
$tmp_delta = $cbgpPeers_cbgp_fields [ $oid ] - $tmp_prev ;
2017-11-20 18:37:02 +00:00
if ( $peer_afi [ $oid . '_delta' ] != $tmp_delta ) {
$peer [ 'c_update' ][ $oid . '_delta' ] = $tmp_delta ;
}
if ( $peer_afi [ $oid . '_prev' ] != $tmp_prev ) {
$peer [ 'c_update' ][ $oid . '_prev' ] = $tmp_prev ;
}
2015-07-13 20:10:26 +02:00
}
2017-11-20 18:37:02 +00:00
if ( $peer [ 'c_update' ]) {
2018-02-06 15:06:44 -06:00
dbUpdate (
$peer [ 'c_update' ],
'bgpPeers_cbgp' ,
'`device_id` = ? AND bgpPeerIdentifier = ? AND afi = ? AND safi = ?' ,
2020-04-10 13:22:26 +02:00
[ $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ], $afi , $safi ]
2018-02-06 15:06:44 -06:00
);
2017-11-20 18:37:02 +00:00
}
2016-01-26 01:06:21 +00:00
2021-03-28 17:25:30 -05:00
$cbgp_rrd_name = \LibreNMS\Data\Store\Rrd :: safeName ( 'cbgp-' . $peer [ 'bgpPeerIdentifier' ] . ". $afi . $safi " );
2017-02-23 22:45:50 +00:00
$cbgp_rrd_def = RrdDefinition :: make ()
-> addDataset ( 'AcceptedPrefixes' , 'GAUGE' , null , 100000000000 )
-> addDataset ( 'DeniedPrefixes' , 'GAUGE' , null , 100000000000 )
-> addDataset ( 'AdvertisedPrefixes' , 'GAUGE' , null , 100000000000 )
-> addDataset ( 'SuppressedPrefixes' , 'GAUGE' , null , 100000000000 )
-> addDataset ( 'WithdrawnPrefixes' , 'GAUGE' , null , 100000000000 );
2015-07-13 20:10:26 +02:00
2020-04-10 13:22:26 +02:00
$fields = [
2016-02-09 18:23:31 +00:00
'AcceptedPrefixes' => $cbgpPeerAcceptedPrefixes ,
'DeniedPrefixes' => $cbgpPeerDeniedPrefixes ,
'AdvertisedPrefixes' => $cbgpPeerAdvertisedPrefixes ,
'SuppressedPrefixes' => $cbgpPeerSuppressedPrefixes ,
'WithdrawnPrefixes' => $cbgpPeerWithdrawnPrefixes ,
2020-04-10 13:22:26 +02:00
];
2016-02-09 18:23:31 +00:00
2020-04-10 13:22:26 +02:00
$tags = [
2016-07-07 01:33:43 -05:00
'bgpPeerIdentifier' => $peer [ 'bgpPeerIdentifier' ],
'afi' => $afi ,
'safi' => $safi ,
'rrd_name' => $cbgp_rrd_name ,
2020-09-21 15:43:38 +02:00
'rrd_def' => $cbgp_rrd_def ,
2020-04-10 13:22:26 +02:00
];
2016-08-28 12:32:58 -05:00
data_update ( $device , 'cbgp' , $tags , $fields );
2016-02-09 18:23:31 +00:00
} //end foreach
} //end if
echo " \n " ;
} //end foreach
} //end if
2015-07-13 20:10:26 +02:00
} //end if
2016-08-03 16:49:41 +01:00
2017-02-08 04:54:30 +00:00
unset ( $peers , $peer_data_tmp , $j_prefixes );