2009-09-07 11:07:59 +00:00
< ? php
2008-03-17 00:23:52 +00:00
echo ( " Polling BGP peers \n " );
2008-03-18 13:35:17 +00:00
if ( ! $config [ 'enable_bgp' ]) { echo ( " BGP Support Disabled \n " ); } else {
2008-03-17 00:23:52 +00:00
$query = " SELECT * FROM bgpPeers WHERE device_id = ' " . $device [ 'device_id' ] . " ' " ;
$peers = mysql_query ( $query );
while ( $peer = mysql_fetch_array ( $peers )) {
### Poll BGP Peer
2009-03-30 11:20:18 +00:00
echo ( " Checking " . $peer [ 'bgpPeerIdentifier' ] . " " );
2008-03-17 00:23:52 +00:00
2009-12-31 19:06:05 +00:00
if ( ! strstr ( $peer [ 'bgpPeerIdentifier' ], ':' ))
{
# v4 BGP4 MIB
2009-03-24 11:00:29 +00:00
$peer_cmd = $config [ 'snmpget' ] . " -m BGP4-MIB -Ovq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
2008-03-17 00:23:52 +00:00
$peer_cmd .= " bgpPeerState. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerAdminStatus. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerInUpdates. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerOutUpdates. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerInTotalMessages. " . $peer [ 'bgpPeerIdentifier' ] . " " ;
2008-09-25 13:54:58 +00:00
$peer_cmd .= " bgpPeerOutTotalMessages. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerFsmEstablishedTime. " . $peer [ 'bgpPeerIdentifier' ] . " bgpPeerInUpdateElapsedTime. " . $peer [ 'bgpPeerIdentifier' ] . " " ;
$peer_cmd .= " bgpPeerLocalAddr. " . $peer [ 'bgpPeerIdentifier' ] . " " ;
2008-03-17 00:23:52 +00:00
$peer_data = trim ( `$peer_cmd` );
2008-09-25 13:54:58 +00:00
list ( $bgpPeerState , $bgpPeerAdminStatus , $bgpPeerInUpdates , $bgpPeerOutUpdates , $bgpPeerInTotalMessages , $bgpPeerOutTotalMessages , $bgpPeerFsmEstablishedTime , $bgpPeerInUpdateElapsedTime , $bgpLocalAddr ) = explode ( " \n " , $peer_data );
2009-12-31 19:06:05 +00:00
}
else
if ( $device [ 'os' ] == " junos " )
{
# v6 for JunOS via Juniper MIB
2010-01-01 14:09:57 +00:00
$peer_ip = ipv62snmp ( $peer [ 'bgpPeerIdentifier' ]);
2009-12-31 19:06:05 +00:00
if ( ! isset ( $junos_v6 ))
{
echo " \n Caching Oids... " ;
$peer_cmd = $config [ 'snmpwalk' ] . " -m BGP4-V2-MIB-JUNIPER -Onq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
$peer_cmd .= " jnxBgpM2PeerStatus.0.ipv6 " ;
foreach ( explode ( " \n " , trim ( `$peer_cmd` )) as $oid )
{
list ( $peer_oid ) = split ( ' ' , $oid );
$peer_id = explode ( '.' , $peer_oid );
2010-01-08 00:00:25 +00:00
$junos_v6 [ implode ( '.' , array_slice ( $peer_id , 35 ))] = implode ( '.' , array_slice ( $peer_id , 18 ));
2009-12-31 19:06:05 +00:00
}
}
$peer_cmd = $config [ 'snmpget' ] . " -m BGP4-V2-MIB-JUNIPER -Ovq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ];
$peer_cmd .= " jnxBgpM2PeerState.0.ipv6. " . $junos_v6 [ $peer_ip ];
2010-01-08 00:00:25 +00:00
$peer_cmd .= " jnxBgpM2PeerStatus.0.ipv6. " . $junos_v6 [ $peer_ip ]; # Should be jnxBgpM2CfgPeerAdminStatus but doesn't seem to be implemented?
2009-12-31 19:06:05 +00:00
$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 ];
2010-02-15 14:47:37 +00:00
$peer_cmd .= ' -M"+' . $config [ 'install_dir' ] . '/mibs/junos"|grep -v "No Such Instance"' ;
2010-01-08 00:00:25 +00:00
if ( $debug ) echo " \n $peer_cmd\n " ;
2010-02-15 14:47:37 +00:00
$peer_data = trim ( `$peer_cmd` );
2009-12-31 19:06:05 +00:00
list ( $bgpPeerState , $bgpPeerAdminStatus , $bgpPeerInUpdates , $bgpPeerOutUpdates , $bgpPeerInTotalMessages , $bgpPeerOutTotalMessages , $bgpPeerFsmEstablishedTime , $bgpPeerInUpdateElapsedTime , $bgpLocalAddr ) = explode ( " \n " , $peer_data );
2010-01-08 00:00:25 +00:00
if ( $debug ) { echo " State = $bgpPeerState - AdminStatus: $bgpPeerAdminStatus\n " ; }
2009-12-31 19:06:05 +00:00
$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-01-12 16:27:57 +00:00
}
2010-02-15 23:41:56 +00:00
if ( $bgpPeerFsmEstablishedTime )
2010-01-12 16:27:57 +00:00
{
2010-02-15 23:41:56 +00:00
if ( $bgpPeerFsmEstablishedTime < $peer [ 'bgpPeerFsmEstablishedTime' ] || $bgpPeerState != $peer [ 'bgpPeerState' ])
2010-01-12 16:27:57 +00:00
{
2010-02-15 23:41:56 +00:00
if ( $device [ 'sysContact' ]) { $email = $device [ 'sysContact' ]; } else { $email = $config [ 'email_default' ]; }
if ( $peer [ 'bgpPeerState' ] == $bgpPeerState )
{
mail ( $email , " 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' ] . ')' , $config [ 'email_headers' ]);
eventlog ( 'BGP Session Flap: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device [ 'device_id' ]);
}
else if ( $bgpPeerState == " established " )
{
mail ( $email , " 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' ] . ')' , $config [ 'email_headers' ]);
eventlog ( 'BGP Session Up: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device [ 'device_id' ]);
}
else if ( $peer [ 'bgpPeerState' ] == " established " )
{
mail ( $email , " 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' ] . ')' , $config [ 'email_headers' ]);
eventlog ( 'BGP Session Down: ' . $peer [ 'bgpPeerIdentifier' ] . ' (AS' . $peer [ 'bgpPeerRemoteAs' ] . ')' , $device [ 'device_id' ]);
}
2010-01-12 16:27:57 +00:00
}
}
2008-03-17 00:23:52 +00:00
2010-02-05 22:10:06 +00:00
$peerrrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " / " . safename ( " bgp- " . $peer [ 'bgpPeerIdentifier' ] . " .rrd " );
2008-03-17 00:23:52 +00:00
if ( ! is_file ( $peerrrd )) {
2009-03-24 11:16:58 +00:00
$woo = shell_exec ( $config [ 'rrdtool' ] . " create $peerrrd \
2008-03-17 00:23:52 +00:00
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 \
2009-10-28 23:39:05 +00:00
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 " );
2008-03-17 00:23:52 +00:00
}
2009-03-24 11:16:58 +00:00
rrdtool_update ( " $peerrrd " , " N: $bgpPeerOutUpdates : $bgpPeerInUpdates : $bgpPeerOutTotalMessages : $bgpPeerInTotalMesages : $bgpPeerFsmEstablishedTime " );
2008-03-17 00:23:52 +00:00
$update = " UPDATE bgpPeers SET bgpPeerState = ' $bgpPeerState ', bgpPeerAdminStatus = ' $bgpPeerAdminStatus ', " ;
2008-09-25 13:54:58 +00:00
$update .= " bgpPeerFsmEstablishedTime = ' $bgpPeerFsmEstablishedTime ', bgpPeerInUpdates = ' $bgpPeerInUpdates ' , bgpLocalAddr = ' $bgpLocalAddr ' , bgpPeerOutUpdates = ' $bgpPeerOutUpdates ' " ;
2008-03-17 00:23:52 +00:00
$update .= " WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' " . $peer [ 'bgpPeerIdentifier' ] . " ' " ;
mysql_query ( $update );
2009-11-28 09:48:23 +00:00
if ( $device [ 'os_group' ] == " ios " ) {
2009-03-30 11:20:18 +00:00
## Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB)
$afi_query = mysql_query ( " SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' " . $peer [ 'bgpPeerIdentifier' ] . " ' " );
while ( $peer_afi = mysql_fetch_array ( $afi_query )) {
$afi = $peer_afi [ 'afi' ];
$safi = $peer_afi [ 'safi' ];
2010-02-06 23:36:33 +00:00
if ( $debug ) { echo ( " $afi $safi " . $config [ 'afi' ][ $afi ][ $safi ] . " \n " ); }
2009-03-30 11:20:18 +00:00
$cbgp_cmd = $config [ 'snmpget' ] . " -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 " ;
2010-02-06 23:36:33 +00:00
if ( $debug ) { echo ( " $cbgp_cmd\n " ); }
2009-03-30 11:20:18 +00:00
$cbgp_data = preg_replace ( " /^OID.* $ / " , " " , trim ( `$cbgp_cmd` ));
2010-02-06 23:36:33 +00:00
if ( $debug ) { echo ( " $cbgp_data\n " ); }
2009-03-30 11:20:18 +00:00
list ( $cbgpPeerAcceptedPrefixes , $cbgpPeerDeniedPrefixes , $cbgpPeerPrefixAdminLimit , $cbgpPeerPrefixThreshold , $cbgpPeerPrefixClearThreshold , $cbgpPeerAdvertisedPrefixes , $cbgpPeerSuppressedPrefixes , $cbgpPeerWithdrawnPrefixes ) = explode ( " \n " , $cbgp_data );
$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 ' " ;
2010-02-06 23:36:33 +00:00
if ( $debug ) { echo ( " MYSQL: $update\n " ); }
2009-03-30 11:20:18 +00:00
mysql_query ( $update );
2010-02-05 22:10:06 +00:00
$cbgp_rrd = $config [ 'rrd_dir' ] . " / " . $device [ 'hostname' ] . " / " . safename ( " cbgp- " . $peer [ 'bgpPeerIdentifier' ] . " . $afi . $safi .rrd " );
2009-03-30 11:20:18 +00:00
if ( ! is_file ( $cbgp_rrd )) {
$woo = shell_exec ( $config [ 'rrdtool' ] . " create $cbgp_rrd \
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 \
2009-10-28 23:39:05 +00:00
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 " );
2009-03-30 11:20:18 +00:00
}
rrdtool_update ( " $cbgp_rrd " , " N: $cbgpPeerAcceptedPrefixes : $cbgpPeerDeniedPrefixes : $cbgpPeerAdvertisedPrefixes : $cbgpPeerSuppressedPrefixes : $cbgpPeerWithdrawnPrefixes " );
}
}
echo ( " \n " );
2008-03-18 13:35:17 +00:00
} ## End While loop on peers
2008-03-17 00:23:52 +00:00
2008-03-18 13:35:17 +00:00
} ## End check for BGP support
2008-03-17 00:23:52 +00:00
?>