2009-09-07 11:07:59 +00:00
< ? php
2008-03-17 00:23:52 +00:00
echo ( " Polling BGP peers \n " );
2011-03-16 01:11:27 +00:00
if ( ! $config [ 'enable_bgp' ])
2009-12-31 19:06:05 +00:00
{
2011-03-23 09:54:56 +00:00
echo ( " BGP Support Disabled \n " );
2011-03-16 01:11:27 +00:00
}
2009-12-31 19:06:05 +00:00
else
{
2011-03-23 09:54:56 +00:00
$peers = mysql_query ( " SELECT * FROM bgpPeers WHERE device_id = ' " . $device [ 'device_id' ] . " ' " );
while ( $peer = mysql_fetch_array ( $peers ))
{
### Poll BGP Peer
2011-03-16 01:11:27 +00:00
2011-03-23 09:54:56 +00:00
echo ( " Checking " . $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
## FIXME - needs moved to function
$peer_cmd = $config [ 'snmpget' ] . " -M " . $config [ 'mibdir' ] . " -m BGP4-MIB -OUvq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
$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... " );
## FIXME - needs moved to function
$peer_cmd = $config [ 'snmpwalk' ] . " -M " . $config [ 'mibdir' ] . " /junos -m BGP4-V2-MIB-JUNIPER -OUnq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
$peer_cmd .= " jnxBgpM2PeerStatus.0.ipv6 " ;
foreach ( explode ( " \n " , trim ( `$peer_cmd` )) as $oid )
2011-03-16 01:11:27 +00:00
{
2011-03-23 09:54:56 +00:00
list ( $peer_oid ) = split ( ' ' , $oid );
$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
}
## FIXME - move to function (and clean up, wtf?)
$peer_cmd = $config [ 'snmpget' ] . " -M " . $config [ 'mibdir' ] . " /junos -m BGP4-V2-MIB-JUNIPER -OUvq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
$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 ];
$peer_cmd .= ' -M"' . $config [ 'install_dir' ] . '/mibs/junos"|grep -v "No Such Instance"' ;
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 )
{
if ( $bgpPeerFsmEstablishedTime < $peer [ 'bgpPeerFsmEstablishedTime' ] || $bgpPeerState != $peer [ 'bgpPeerState' ])
{
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' ] . ')' );
log_event ( 'BGP Session Flap: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device [ 'device_id' ], 'bgpPeer' , $bgpPeer_id );
}
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' ] . ')' );
log_event ( 'BGP Session Up: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device [ 'device_id' ], 'bgpPeer' , $bgpPeer_id );
}
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' ] . ')' );
log_event ( 'BGP Session Down: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device [ 'device_id' ], '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 \
DS : bgpPeerEstablished : GAUGE : 600 : 0 : U \
RRA : AVERAGE : 0.5 : 1 : 600 \
RRA : AVERAGE : 0.5 : 6 : 700 \
RRA : AVERAGE : 0.5 : 24 : 775 \
RRA : AVERAGE : 0.5 : 288 : 797 \
RRA : MAX : 0.5 : 1 : 600 \
RRA : MAX : 0.5 : 6 : 700 \
RRA : MAX : 0.5 : 24 : 775 \
RRA : MAX : 0.5 : 288 : 797 " ;
rrdtool_create ( $peerrrd , $create_rrd );
}
rrdtool_update ( " $peerrrd " , " N: $bgpPeerOutUpdates : $bgpPeerInUpdates : $bgpPeerOutTotalMessages : $bgpPeerInTotalMesages : $bgpPeerFsmEstablishedTime " );
$update = " UPDATE bgpPeers SET bgpPeerState = ' $bgpPeerState ', bgpPeerAdminStatus = ' $bgpPeerAdminStatus ', " ;
$update .= " bgpPeerFsmEstablishedTime = ' $bgpPeerFsmEstablishedTime ', bgpPeerInUpdates = ' $bgpPeerInUpdates ' , bgpLocalAddr = ' $bgpLocalAddr ' , bgpPeerOutUpdates = ' $bgpPeerOutUpdates ' " ;
$update .= " WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' " . $peer [ 'bgpPeerIdentifier' ] . " ' " ;
mysql_query ( $update );
if ( $device [ 'os_group' ] == " ios " || $device [ 'os' ] == " junos " )
{
## Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB or BGP4-V2-JUNIPER MIB)
$afi_query = mysql_query ( " SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' " . $peer [ 'bgpPeerIdentifier' ] . " ' " );
while ( $peer_afi = mysql_fetch_assoc ( $afi_query ))
{
$afi = $peer_afi [ 'afi' ];
$safi = $peer_afi [ 'safi' ];
if ( $debug ) { echo ( " $afi $safi " . $config [ 'afi' ][ $afi ][ $safi ] . " \n " ); }
if ( $device [ 'os_group' ] == " ios " )
2011-03-22 20:27:39 +00:00
{
2011-03-23 09:54:56 +00:00
## FIXME - move to function
$cbgp_cmd = $config [ 'snmpget' ] . " -M " . $config [ 'mibdir' ] . " -m CISCO-BGP4-MIB -Ovq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
$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` ));
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
2011-03-23 09:54:56 +00:00
# FIXME THESE FIELDS DO NOT EXIST IN THE DATABASE!
$update = " UPDATE bgpPeers_cbgp SET " ;
$update .= " `cbgpPeerAcceptedPrefixes` = ' $cbgpPeerAcceptedPrefixes ' " ;
$update .= " , `cbgpPeerDeniedPrefixes` = ' $cbgpPeerDeniedPrefixes ' " ;
$update .= " , `cbgpPeerPrefixAdminLimit` = ' $cbgpPeerAdminLimit ' " ;
$update .= " , `cbgpPeerPrefixThreshold` = ' $cbgpPeerPrefixThreshold ' " ;
$update .= " , `cbgpPeerPrefixClearThreshold` = ' $cbgpPeerPrefixClearThreshold ' " ;
$update .= " , `cbgpPeerAdvertisedPrefixes` = ' $cbgpPeerAdvertisedPrefixes ' " ;
$update .= " , `cbgpPeerSuppressedPrefixes` = ' $cbgpPeerSuppressedPrefixes ' " ;
$update .= " , `cbgpPeerWithdrawnPrefixes` = ' $cbgpPeerWithdrawnPrefixes ' " ;
$update .= " WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' " . $peer [ 'bgpPeerIdentifier' ] . " ' AND afi = ' $afi ' AND safi = ' $safi ' " ;
if ( $debug ) { echo ( " MYSQL: $update\n " ); }
2011-03-16 01:11:27 +00:00
mysql_query ( $update );
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 \
DS : WithdrawnPrefixes : GAUGE : 600 : U : 100000000000 \
RRA : AVERAGE : 0.5 : 1 : 600 \
RRA : AVERAGE : 0.5 : 6 : 700 \
RRA : AVERAGE : 0.5 : 24 : 775 \
RRA : AVERAGE : 0.5 : 288 : 797 \
RRA : MAX : 0.5 : 1 : 600 \
RRA : MAX : 0.5 : 6 : 700 \
RRA : MAX : 0.5 : 24 : 775 \
RRA : MAX : 0.5 : 288 : 797 " ;
rrdtool_create ( $cbgp_rrd , $rrd_create );
}
rrdtool_update ( " $cbgp_rrd " , " N: $cbgpPeerAcceptedPrefixes : $cbgpPeerDeniedPrefixes : $cbgpPeerAdvertisedPrefixes : $cbgpPeerSuppressedPrefixes : $cbgpPeerWithdrawnPrefixes " );
} # while
} # os=ios | junos
echo ( " \n " );
} ## End While loop on peers
2008-03-18 13:35:17 +00:00
} ## End check for BGP support
2011-03-16 01:11:27 +00:00
2011-03-23 09:54:56 +00:00
?>