2009-09-07 11:07:59 +00:00
< ? php
2008-03-15 17:58:15 +00:00
2009-12-31 19:06:05 +00:00
### Discover BGP peers on Cisco and Juniper devices
2008-03-15 17:58:15 +00:00
2008-03-22 23:09:35 +00:00
echo ( " BGP Sessions : " );
2008-03-15 17:58:15 +00:00
2009-04-24 15:04:45 +00:00
$as_cmd = $config [ 'snmpwalk' ] . " -m BGP4-MIB -CI -Oqvn - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
2008-03-15 17:58:15 +00:00
$as_cmd .= " .1.3.6.1.2.1.15.2 " ;
2008-03-16 15:17:40 +00:00
$bgpLocalAs = trim ( shell_exec ( $as_cmd ));
2008-03-15 17:58:15 +00:00
2009-08-07 11:53:10 +00:00
if ( $bgpLocalAs && ! strstr ( $bgpLocalAs , " " )) {
2008-03-15 17:58:15 +00:00
2009-11-12 17:51:36 +00:00
echo ( " AS $bgpLocalAs " );
2008-03-15 17:58:15 +00:00
2009-12-02 23:50:09 +00:00
if ( $bgpLocalAs != $device [ 'bgpLocalAs' ]) { mysql_query ( " UPDATE devices SET bgpLocalAs = ' $bgpLocalAs ' WHERE device_id = ' " . $device [ 'device_id' ] . " ' " ); echo ( " Updated AS " ); }
2008-03-15 17:58:15 +00:00
2009-04-24 15:04:45 +00:00
$peers_cmd = $config [ 'snmpwalk' ] . " -m BGP4-MIB -CI -Oq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
2008-03-15 17:58:15 +00:00
$peers_cmd .= " BGP4-MIB::bgpPeerRemoteAs " ;
$peers = trim ( str_replace ( " BGP4-MIB::bgpPeerRemoteAs. " , " " , `$peers_cmd` ));
foreach ( explode ( " \n " , $peers ) as $peer ) {
2009-09-03 15:13:53 +00:00
list ( $peer_ip , $peer_as ) = split ( " " , $peer );
if ( $peer && $peer_ip != " 0.0.0.0 " ) {
2008-03-15 17:58:15 +00:00
2008-03-17 00:23:52 +00:00
$peerlist [] = $device [ 'device_id' ] . " $peer_ip " ;
2010-01-09 16:58:54 +00:00
$astext = get_astext ( $peer_as );
2008-03-15 17:58:15 +00:00
2009-11-12 17:51:36 +00:00
# echo(str_pad($peer_ip, 40) . " AS$peer_as ");
2009-03-30 11:20:18 +00:00
#echo("$peer_ip AS$peer_as ");
2008-03-15 17:58:15 +00:00
if ( mysql_result ( mysql_query ( " SELECT COUNT(*) FROM `bgpPeers` WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' " ), 0 ) < '1' ) {
$add = mysql_query ( " INSERT INTO bgpPeers (`device_id`, `bgpPeerIdentifier`, `bgpPeerRemoteAS`) VALUES (' " . $device [ 'device_id' ] . " ',' $peer_ip ',' $peer_as ') " );
2008-03-22 23:09:35 +00:00
echo ( " + " );
2008-03-18 13:35:17 +00:00
} else {
2010-01-09 21:34:13 +00:00
$update = mysql_query ( " UPDATE `bgpPeers` SET bgpPeerRemoteAs = " . $peer_as . " , astext = ' " . mysql_escape_string ( $astext ) . " ' WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' " );
2009-12-31 19:06:05 +00:00
echo ( " . " );
2008-03-18 13:35:17 +00:00
}
2009-03-30 11:20:18 +00:00
2009-11-28 09:48:23 +00:00
## Get afi/safi and populate cbgp on cisco ios (xe/xr)
2009-12-31 19:06:05 +00:00
if ( $device [ 'os' ] == " ios " ) {
2009-03-30 11:20:18 +00:00
unset ( $af_list );
$af_cmd = $config [ 'snmpwalk' ] . " -CI -m CISCO-BGP4-MIB -OsQ - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
$af_cmd .= " cbgpPeerAddrFamilyName. " . $peer_ip ;
$afs = trim ( str_replace ( " cbgpPeerAddrFamilyName. " . $peer_ip . " . " , " " , `$af_cmd` ));
foreach ( explode ( " \n " , $afs ) as $af ) {
list ( $afisafi , $text ) = explode ( " = " , $af );
list ( $afi , $safi ) = explode ( " . " , $afisafi );
if ( $afi && $safi ) {
2009-11-12 17:51:36 +00:00
# echo("($afi:$safi)");
2009-03-30 11:20:18 +00:00
$af_list [ '$afi' ][ '$safi' ] = 1 ;
if ( mysql_result ( mysql_query ( " SELECT COUNT(*) FROM `bgpPeers_cbgp` WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' AND afi = ' $afi ' AND safi = ' $safi ' " ), 0 ) == 0 ) {
mysql_query ( " INSERT INTO `bgpPeers_cbgp` (device_id,bgpPeerIdentifier, afi, safi) VALUES (' " . $device [ 'device_id' ] . " ',' $peer_ip ',' $afi ',' $safi ') " );
}
}
}
$af_query = mysql_query ( " SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' " );
while ( $entry = mysql_fetch_array ( $af_query )) {
$afi = $entry [ 'afi' ];
$afi = $entry [ 'safi' ];
if ( ! $af_list [ '$afi' ][ '$safi' ]) {
mysql_query ( " DELETE FROM `bgpPeers_cbgp` WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' AND afi = ' $afi ' AND safi = ' $safi ' " );
}
} # AF list
2009-12-31 19:06:05 +00:00
} # if os = ios
} # If Peer
} # Foreach
if ( $device [ 'os' ] == " junos " )
## Juniper BGP4-V2 MIB, ipv6 only for now, because v4 should be covered in BGP4-MIB above
$peers_cmd = $config [ 'snmpwalk' ] . " -m BGP4-V2-MIB-JUNIPER -CI -Onq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
$peers_cmd .= " jnxBgpM2PeerRemoteAs.0.ipv6 " ; # FIXME: is .0 the only possible value here?
$peers = trim ( str_replace ( " .1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.0. " , " " , `$peers_cmd` ));
foreach ( explode ( " \n " , $peers ) as $peer ) {
list ( $peer_ip_snmp , $peer_as ) = split ( " " , $peer );
2010-01-01 14:09:57 +00:00
# Magic! Basically, takes SNMP form and finds peer IPs from the walk OIDs.
$peer_ip = Net_IPv6 :: compress ( snmp2ipv6 ( implode ( '.' , array_slice ( explode ( '.' , $peer_ip_snmp ), count ( $ipv6 ) - 16 ))));
2009-12-31 19:06:05 +00:00
if ( $peer ) {
$peerlist [] = $device [ 'device_id' ] . " $peer_ip " ;
2010-01-03 20:13:10 +00:00
$astext = get_astext ( $peer_as );
2009-12-31 19:06:05 +00:00
#echo("$peer_ip AS$peer_as ");
if ( mysql_result ( mysql_query ( " SELECT COUNT(*) FROM `bgpPeers` WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' " ), 0 ) < '1' ) {
$add = mysql_query ( " INSERT INTO bgpPeers (`device_id`, `bgpPeerIdentifier`, `bgpPeerRemoteAS`) VALUES (' " . $device [ 'device_id' ] . " ',' $peer_ip ',' $peer_as ') " );
echo ( " + " );
} else {
2010-01-09 21:34:13 +00:00
$update = mysql_query ( " UPDATE `bgpPeers` SET bgpPeerRemoteAs = " . $peer_as . " , astext = ' " . mysql_escape_string ( $astext ) . " ' WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' $peer_ip ' " );
2009-12-31 19:06:05 +00:00
echo ( " . " );
}
2008-03-22 23:09:35 +00:00
} # If Peer
} # Foreach
2009-08-07 11:53:10 +00:00
} else {
echo ( " No BGP on host " );
if ( $device [ 'bgpLocalAs' ]) {
2009-12-02 23:50:09 +00:00
mysql_query ( " UPDATE devices SET bgpLocalAs = NULL WHERE device_id = ' " . $device [ 'device_id' ] . " ' " ); echo ( " (Removed ASN) " );
2009-08-07 11:53:10 +00:00
} # End if
} # End if
2008-03-15 17:58:15 +00:00
2008-03-17 00:23:52 +00:00
## Delete removed peers
2008-03-15 17:58:15 +00:00
2008-03-22 23:09:35 +00:00
$sql = " SELECT * FROM bgpPeers AS B, devices AS D WHERE B.device_id = D.device_id AND D.device_id = ' " . $device [ 'device_id' ] . " ' " ;
2008-03-15 17:58:15 +00:00
$query = mysql_query ( $sql );
2008-03-17 00:23:52 +00:00
while ( $entry = mysql_fetch_array ( $query )) {
2008-03-15 17:58:15 +00:00
unset ( $exists );
$i = 0 ;
2008-03-17 00:23:52 +00:00
while ( $i < count ( $peerlist ) && ! $exists ) {
2008-03-22 23:09:35 +00:00
$checkme = $entry [ 'device_id' ] . " " . $entry [ 'bgpPeerIdentifier' ];
if ( $peerlist [ $i ] == $checkme ) { $exists = 1 ; }
2008-03-15 17:58:15 +00:00
$i ++ ;
}
if ( ! $exists ) {
2008-03-17 00:23:52 +00:00
mysql_query ( " DELETE FROM bgpPeers WHERE bgpPeer_id = ' " . $entry [ 'bgpPeer_id' ] . " ' " );
2009-04-13 19:16:22 +00:00
mysql_query ( " DELETE FROM bgpPeers_cbgp WHERE bgpPeer_id = ' " . $entry [ 'bgpPeer_id' ] . " ' " );
2008-03-22 23:09:35 +00:00
echo ( " - " );
2008-03-15 17:58:15 +00:00
}
}
2009-11-12 17:51:36 +00:00
echo ( " \n " );
2008-03-15 17:58:15 +00:00
?>