2009-09-07 11:07:59 +00:00
< ? php
2008-03-17 00:23:52 +00:00
2012-05-25 12:24:34 +00:00
// We should walk, so we can discover here too.
2011-05-16 21:56:01 +00:00
2012-03-26 13:34:49 +00:00
global $debug ;
2012-04-14 23:28:23 +00:00
if ( $config [ 'enable_bgp' ])
2009-12-31 19:06:05 +00:00
{
2011-05-16 21:56:01 +00:00
foreach ( dbFetchRows ( " SELECT * FROM bgpPeers WHERE device_id = ? " , array ( $device [ 'device_id' ])) as $peer )
2011-03-23 09:54:56 +00:00
{
2012-05-25 12:24:34 +00:00
// Poll BGP Peer
2011-03-16 01:11:27 +00:00
2012-04-14 23:28:23 +00:00
echo ( " Checking BGP peer " . $peer [ 'bgpPeerIdentifier' ] . " " );
2008-03-17 00:23:52 +00:00
2011-03-23 09:54:56 +00:00
if ( ! strstr ( $peer [ 'bgpPeerIdentifier' ], ':' ))
{
# v4 BGP4 MIB
2012-05-25 12:24:34 +00:00
// FIXME - needs moved to function
2012-05-15 13:45:26 +00:00
$peer_cmd = $config [ 'snmpget' ] . " -M " . $config [ 'mibdir' ] . " -m BGP4-MIB -OUvq " . snmp_gen_auth ( $device ) . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
2011-03-23 09:54:56 +00:00
$peer_cmd .= " bgpPeerState. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerAdminStatus. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerInUpdates. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerOutUpdates. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerInTotalMessages. " . $peer [ 'bgpPeerIdentifier' ] . " " ;
$peer_cmd .= " bgpPeerOutTotalMessages. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerFsmEstablishedTime. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerInUpdateElapsedTime. " . $peer [ 'bgpPeerIdentifier' ] . " " ;
$peer_cmd .= " bgpPeerLocalAddr. " . $peer [ 'bgpPeerIdentifier' ] . " " ;
$peer_data = trim ( `$peer_cmd` );
list ( $bgpPeerState , $bgpPeerAdminStatus , $bgpPeerInUpdates , $bgpPeerOutUpdates , $bgpPeerInTotalMessages , $bgpPeerOutTotalMessages , $bgpPeerFsmEstablishedTime , $bgpPeerInUpdateElapsedTime , $bgpLocalAddr ) = explode ( " \n " , $peer_data );
}
else
if ( $device [ 'os' ] == " junos " )
{
# v6 for JunOS via Juniper MIB
$peer_ip = ipv62snmp ( $peer [ 'bgpPeerIdentifier' ]);
if ( ! isset ( $junos_v6 ))
{
echo ( " \n Caching Oids... " );
2012-05-25 12:24:34 +00:00
// FIXME - needs moved to function
2012-05-15 13:45:26 +00:00
$peer_cmd = $config [ 'snmpwalk' ] . " -M " . $config [ 'mibdir' ] . " /junos -m BGP4-V2-MIB-JUNIPER -OUnq - " . $device [ 'snmpver' ] . " " . snmp_gen_auth ( $device ) . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
2011-03-23 09:54:56 +00:00
$peer_cmd .= " jnxBgpM2PeerStatus.0.ipv6 " ;
foreach ( explode ( " \n " , trim ( `$peer_cmd` )) as $oid )
2011-03-16 01:11:27 +00:00
{
2011-04-11 09:22:12 +00:00
list ( $peer_oid ) = explode ( ' ' , $oid );
2011-03-23 09:54:56 +00:00
$peer_id = explode ( '.' , $peer_oid );
$junos_v6 [ implode ( '.' , array_slice ( $peer_id , 35 ))] = implode ( '.' , array_slice ( $peer_id , 18 ));
2011-03-16 01:11:27 +00:00
}
2011-03-23 09:54:56 +00:00
}
2012-05-25 12:24:34 +00:00
// FIXME - move to function (and clean up, wtf?)
2012-05-16 15:12:57 +00:00
$peer_cmd = $config [ 'snmpget' ] . " -M " . $config [ 'mibdir' ] . " /junos -m BGP4-V2-MIB-JUNIPER -OUvq " . snmp_gen_auth ( $device );
2012-03-26 13:34:49 +00:00
$peer_cmd .= ' -M"' . $config [ 'install_dir' ] . '/mibs/junos"' ;
$peer_cmd .= " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
2011-03-23 09:54:56 +00:00
$peer_cmd .= " jnxBgpM2PeerState.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerStatus.0.ipv6. " . $junos_v6 [ $peer_ip ]; # Should be jnxBgpM2CfgPeerAdminStatus but doesn't seem to be implemented?
$peer_cmd .= " jnxBgpM2PeerInUpdates.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerOutUpdates.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerInTotalMessages.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerOutTotalMessages.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerFsmEstablishedTime.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerInUpdatesElapsedTime.0.ipv6. " . $junos_v6 [ $peer_ip ];
$peer_cmd .= " jnxBgpM2PeerLocalAddr.0.ipv6. " . $junos_v6 [ $peer_ip ];
2012-03-26 13:34:49 +00:00
$peer_cmd .= '|grep -v "No Such Instance"' ;
2011-03-23 09:54:56 +00:00
if ( $debug ) echo ( " \n $peer_cmd\n " );
$peer_data = trim ( `$peer_cmd` );
list ( $bgpPeerState , $bgpPeerAdminStatus , $bgpPeerInUpdates , $bgpPeerOutUpdates , $bgpPeerInTotalMessages , $bgpPeerOutTotalMessages , $bgpPeerFsmEstablishedTime , $bgpPeerInUpdateElapsedTime , $bgpLocalAddr ) = explode ( " \n " , $peer_data );
if ( $debug ) { echo ( " State = $bgpPeerState - AdminStatus: $bgpPeerAdminStatus\n " ); }
$bgpLocalAddr = str_replace ( '"' , '' , str_replace ( ' ' , '' , $bgpLocalAddr ));
if ( $bgpLocalAddr == " 00000000000000000000000000000000 " )
{
$bgpLocalAddr = '' ; # Unknown?
}
else
{
$bgpLocalAddr = strtolower ( $bgpLocalAddr );
for ( $i = 0 ; $i < 32 ; $i += 4 )
{
$bgpLocalAddr6 [] = substr ( $bgpLocalAddr , $i , 4 );
}
$bgpLocalAddr = Net_IPv6 :: compress ( implode ( ':' , $bgpLocalAddr6 )); unset ( $bgpLocalAddr6 );
}
}
2010-11-23 14:33:02 +00:00
2011-03-23 09:54:56 +00:00
if ( $bgpPeerFsmEstablishedTime )
{
2011-09-23 11:06:14 +00:00
if ( ! ( is_array ( $config [ 'alerts' ][ 'bgp' ][ 'whitelist' ]) && ! in_array ( $peer [ 'bgpPeerRemoteAs' ], $config [ 'alerts' ][ 'bgp' ][ 'whitelist' ])) && ( $bgpPeerFsmEstablishedTime < $peer [ 'bgpPeerFsmEstablishedTime' ] || $bgpPeerState != $peer [ 'bgpPeerState' ]))
2011-03-23 09:54:56 +00:00
{
if ( $peer [ 'bgpPeerState' ] == $bgpPeerState )
2010-11-23 14:33:02 +00:00
{
2011-03-23 09:54:56 +00:00
notify ( $device , " BGP Session flapped: " . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ' - ' . $peer [ 'astext' ] . ')' , " BGP Session flapped " . formatUptime ( $bgpPeerFsmEstablishedTime ) . " ago. \n \n Hostname : " . $device [ 'hostname' ] . " \n Peer IP : " . $peer [ 'bgpPeerIdentifier' ] . " \n Remote AS: " . $peer [ 'bgpPeerRemoteAs' ] . ' (' . $peer [ 'astext' ] . ')' );
2011-04-03 19:36:32 +00:00
log_event ( 'BGP Session Flap: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device , 'bgpPeer' , $bgpPeer_id );
2011-03-23 09:54:56 +00:00
}
else if ( $bgpPeerState == " established " )
{
notify ( $device , " BGP Session up: " . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ' - ' . $peer [ 'astext' ] . ')' , " BGP Session up since " . formatUptime ( $bgpPeerFsmEstablishedTime ) . " . \n \n Hostname : " . $device [ 'hostname' ] . " \n Peer IP : " . $peer [ 'bgpPeerIdentifier' ] . " \n Remote AS: " . $peer [ 'bgpPeerRemoteAs' ] . ' (' . $peer [ 'astext' ] . ')' );
2011-04-03 19:36:32 +00:00
log_event ( 'BGP Session Up: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device , 'bgpPeer' , $bgpPeer_id );
2011-03-23 09:54:56 +00:00
}
else if ( $peer [ 'bgpPeerState' ] == " established " )
{
notify ( $device , " BGP Session down: " . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ' - ' . $peer [ 'astext' ] . ')' , " BGP Session down since " . formatUptime ( $bgpPeerFsmEstablishedTime ) . " . \n \n Hostname : " . $device [ 'hostname' ] . " \n Peer IP : " . $peer [ 'bgpPeerIdentifier' ] . " \n Remote AS: " . $peer [ 'bgpPeerRemoteAs' ] . ' (' . $peer [ 'astext' ] . ')' );
2011-04-03 19:36:32 +00:00
log_event ( 'BGP Session Down: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device , 'bgpPeer' , $bgpPeer_id );
2011-03-22 20:27:39 +00:00
}
2011-03-23 09:54:56 +00:00
}
}
2008-03-17 00:23:52 +00:00
2011-03-23 09:54:56 +00:00
$peerrrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " / " . safename ( " bgp- " . $peer [ 'bgpPeerIdentifier' ] . " .rrd " );
if ( ! is_file ( $peerrrd ))
{
$create_rrd = " DS:bgpPeerOutUpdates:COUNTER:600:U:100000000000 \
DS : bgpPeerInUpdates : COUNTER : 600 : U : 100000000000 \
DS : bgpPeerOutTotal : COUNTER : 600 : U : 100000000000 \
DS : bgpPeerInTotal : COUNTER : 600 : U : 100000000000 \
2012-04-20 17:37:58 +00:00
DS : bgpPeerEstablished : GAUGE : 600 : 0 : U " . $config['rrd_rra'] ;
2011-03-23 09:54:56 +00:00
rrdtool_create ( $peerrrd , $create_rrd );
}
rrdtool_update ( " $peerrrd " , " N: $bgpPeerOutUpdates : $bgpPeerInUpdates : $bgpPeerOutTotalMessages : $bgpPeerInTotalMesages : $bgpPeerFsmEstablishedTime " );
2011-05-16 21:56:01 +00:00
$peer [ 'update' ][ 'bgpPeerState' ] = $bgpPeerState ;
$peer [ 'update' ][ 'bgpPeerAdminStatus' ] = $bgpPeerAdminStatus ;
$peer [ 'update' ][ 'bgpPeerFsmEstablishedTime' ] = $bgpPeerFsmEstablishedTime ;
$peer [ 'update' ][ 'bgpPeerInUpdates' ] = $bgpPeerInUpdates ;
$peer [ 'update' ][ 'bgpLocalAddr' ] = $bgpLocalAddr ;
$peer [ 'update' ][ 'bgpPeerOutUpdates' ] = $bgpPeerOutUpdates ;
dbUpdate ( $peer [ 'update' ], 'bgpPeers' , '`device_id` = ? AND `bgpPeerIdentifier` = ?' , array ( $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ]));
2011-03-23 09:54:56 +00:00
2012-01-12 11:16:38 +00:00
if ( $device [ 'os_group' ] == " cisco " || $device [ 'os' ] == " junos " )
2011-03-23 09:54:56 +00:00
{
2012-05-25 12:24:34 +00:00
// Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB or BGP4-V2-JUNIPER MIB)
2011-05-16 21:56:01 +00:00
$peer_afis = dbFetchRows ( " SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ? AND bgpPeerIdentifier = ? " , array ( $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ]));
foreach ( $peer_afis as $peer_afi )
2011-03-23 09:54:56 +00:00
{
$afi = $peer_afi [ 'afi' ];
$safi = $peer_afi [ 'safi' ];
2011-05-01 17:26:06 +00:00
if ( $debug ) { echo ( " $afi $safi\n " ); }
2011-03-23 09:54:56 +00:00
2012-01-12 11:16:38 +00:00
if ( $device [ 'os_group' ] == " cisco " )
2011-03-22 20:27:39 +00:00
{
2012-05-25 12:24:34 +00:00
// FIXME - move to function
2012-05-15 13:45:26 +00:00
$cbgp_cmd = $config [ 'snmpget' ] . " -M " . $config [ 'mibdir' ] . " -m CISCO-BGP4-MIB -Ovq " . snmp_gen_auth ( $device ) . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
2011-03-23 09:54:56 +00:00
$cbgp_cmd .= " cbgpPeerAcceptedPrefixes. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerDeniedPrefixes. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerPrefixAdminLimit. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerPrefixThreshold. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerPrefixClearThreshold. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerAdvertisedPrefixes. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerSuppressedPrefixes. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
$cbgp_cmd .= " cbgpPeerWithdrawnPrefixes. " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi " ;
if ( $debug ) { echo ( " $cbgp_cmd\n " ); }
$cbgp_data = preg_replace ( " /^OID.* $ / " , " " , trim ( `$cbgp_cmd` ));
2014-11-06 21:12:42 +00:00
$cbgp_data = preg_replace ( " /No Such Instance currently exists at this OID/ " , " 0 " , $cbgp_data );
2011-03-23 09:54:56 +00:00
if ( $debug ) { echo ( " $cbgp_data\n " ); }
list ( $cbgpPeerAcceptedPrefixes , $cbgpPeerDeniedPrefixes , $cbgpPeerPrefixAdminLimit , $cbgpPeerPrefixThreshold , $cbgpPeerPrefixClearThreshold , $cbgpPeerAdvertisedPrefixes , $cbgpPeerSuppressedPrefixes , $cbgpPeerWithdrawnPrefixes ) = explode ( " \n " , $cbgp_data );
2011-03-16 01:11:27 +00:00
}
2011-03-23 09:54:56 +00:00
if ( $device [ 'os' ] == " junos " )
{
# Missing: cbgpPeerAdminLimit cbgpPeerPrefixThreshold cbgpPeerPrefixClearThreshold cbgpPeerSuppressedPrefixes cbgpPeerWithdrawnPrefixes
$safis [ 'unicast' ] = 1 ;
$safis [ 'multicast' ] = 2 ;
if ( ! isset ( $peerIndexes ))
{
$j_bgp = snmpwalk_cache_multi_oid ( $device , " jnxBgpM2PeerTable " , $jbgp , " BGP4-V2-MIB-JUNIPER " , $config [ 'install_dir' ] . " /mibs/junos " );
foreach ( $j_bgp as $index => $entry )
{
switch ( $entry [ 'jnxBgpM2PeerRemoteAddrType' ])
{
case 'ipv4' :
$ip = long2ip ( hexdec ( $entry [ 'jnxBgpM2PeerRemoteAddr' ]));
$j_peerIndexes [ $ip ] = $entry [ 'jnxBgpM2PeerIndex' ];
break ;
case 'ipv6' :
$ip6 = trim ( str_replace ( ' ' , '' , $entry [ 'jnxBgpM2PeerRemoteAddr' ]), '"' );
$ip6 = substr ( $ip6 , 0 , 4 ) . ':' . substr ( $ip6 , 4 , 4 ) . ':' . substr ( $ip6 , 8 , 4 ) . ':' . substr ( $ip6 , 12 , 4 ) . ':' . substr ( $ip6 , 16 , 4 ) . ':' . substr ( $ip6 , 20 , 4 ) . ':' . substr ( $ip6 , 24 , 4 ) . ':' . substr ( $ip6 , 28 , 4 );
$ip6 = Net_IPv6 :: compress ( $ip6 );
$j_peerIndexes [ $ip6 ] = $entry [ 'jnxBgpM2PeerIndex' ];
break ;
default :
echo ( " PANIC: Don't know RemoteAddrType " . $entry [ 'jnxBgpM2PeerRemoteAddrType' ] . " ! \n " );
break ;
}
}
}
$j_prefixes = snmpwalk_cache_multi_oid ( $device , " jnxBgpM2PrefixCountersTable " , $jbgp , " BGP4-V2-MIB-JUNIPER " , $config [ 'install_dir' ] . " /mibs/junos " );
$cbgpPeerAcceptedPrefixes = $j_prefixes [ $j_peerIndexes [ $peer [ 'bgpPeerIdentifier' ]] . " . $afi . " . $safis [ $safi ]][ 'jnxBgpM2PrefixInPrefixesAccepted' ];
$cbgpPeerDeniedPrefixes = $j_prefixes [ $j_peerIndexes [ $peer [ 'bgpPeerIdentifier' ]] . " . $afi . " . $safis [ $safi ]][ 'jnxBgpM2PrefixInPrefixesRejected' ];
$cbgpPeerAdvertisedPrefixes = $j_prefixes [ $j_peerIndexes [ $peer [ 'bgpPeerIdentifier' ]] . " . $afi . " . $safis [ $safi ]][ 'jnxBgpM2PrefixOutPrefixes' ];
unset ( $j_prefixes );
unset ( $j_bgp );
unset ( $j_peerIndexes );
}
2011-03-22 20:27:39 +00:00
2012-05-25 12:24:34 +00:00
// FIXME THESE FIELDS DO NOT EXIST IN THE DATABASE!
2011-03-23 09:54:56 +00:00
$update = " UPDATE bgpPeers_cbgp SET " ;
2011-05-16 21:56:01 +00:00
$peer [ 'c_update' ][ 'AcceptedPrefixes' ] = $cbgpPeerAcceptedPrefixes ;
$peer [ 'c_update' ][ 'DeniedPrefixes' ] = $cbgpPeerDeniedPrefixes ;
$peer [ 'c_update' ][ 'PrefixAdminLimit' ] = $cbgpPeerAdminLimit ;
$peer [ 'c_update' ][ 'PrefixThreshold' ] = $cbgpPeerPrefixThreshold ;
$peer [ 'c_update' ][ 'PrefixClearThreshold' ] = $cbgpPeerPrefixClearThreshold ;
$peer [ 'c_update' ][ 'AdvertisedPrefixes' ] = $cbgpPeerAdvertisedPrefixes ;
$peer [ 'c_update' ][ 'SuppressedPrefixes' ] = $cbgpPeerSuppressedPrefixes ;
$peer [ 'c_update' ][ 'WithdrawnPrefixes' ] = $cbgpPeerWithdrawnPrefixes ;
dbUpdate ( $peer [ 'c_update' ], 'bgpPeers_cbgp' , '`device_id` = ? AND bgpPeerIdentifier = ? AND afi = ? AND safi = ?' , array ( $device [ 'device_id' ], $peer [ 'bgpPeerIdentifier' ], $afi , $safi ));
2011-03-16 01:11:27 +00:00
2011-03-23 09:54:56 +00:00
$cbgp_rrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " / " . safename ( " cbgp- " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi .rrd " );
if ( ! is_file ( $cbgp_rrd ))
2011-03-16 01:11:27 +00:00
{
2011-03-23 09:54:56 +00:00
$rrd_create = " DS:AcceptedPrefixes:GAUGE:600:U:100000000000 \
DS : DeniedPrefixes : GAUGE : 600 : U : 100000000000 \
DS : AdvertisedPrefixes : GAUGE : 600 : U : 100000000000 \
DS : SuppressedPrefixes : GAUGE : 600 : U : 100000000000 \
2012-04-20 17:37:58 +00:00
DS : WithdrawnPrefixes : GAUGE : 600 : U : 100000000000 " . $config['rrd_rra'] ;
2011-03-23 09:54:56 +00:00
rrdtool_create ( $cbgp_rrd , $rrd_create );
}
rrdtool_update ( " $cbgp_rrd " , " N: $cbgpPeerAcceptedPrefixes : $cbgpPeerDeniedPrefixes : $cbgpPeerAdvertisedPrefixes : $cbgpPeerSuppressedPrefixes : $cbgpPeerWithdrawnPrefixes " );
} # while
2012-01-12 11:16:38 +00:00
} # os_group=cisco | junos
2011-03-23 09:54:56 +00:00
echo ( " \n " );
2012-05-25 12:24:34 +00:00
} // End While loop on peers
} // End check for BGP support
2011-03-16 01:11:27 +00:00
2011-05-16 21:56:01 +00:00
?>