2009-09-07 11:07:59 +00:00
< ? php
2008-03-15 17:58:15 +00:00
2010-01-29 17:09:47 +00:00
### Discover BGP peers
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 ));
2010-02-05 17:38:30 +00:00
if ( is_numeric ( $bgpLocalAs ))
2010-01-09 22:34:18 +00:00
{
2009-11-12 17:51:36 +00:00
echo ( " AS $bgpLocalAs " );
2008-03-15 17:58:15 +00:00
2010-01-09 22:34:18 +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 " ;
2010-02-04 16:33:24 +00:00
$peers_data = shell_exec ( $peers_cmd );
2010-02-04 16:42:02 +00:00
if ( $debug ) { echo ( " Peers : $peers_cmd --> \n $peers_data \n " ); }
2010-02-04 16:33:24 +00:00
$peers = trim ( str_replace ( " BGP4-MIB::bgpPeerRemoteAs. " , " " , $peers_data ));
2010-01-09 22:34:18 +00:00
foreach ( explode ( " \n " , $peers ) as $peer )
{
2009-09-03 15:13:53 +00:00
list ( $peer_ip , $peer_as ) = split ( " " , $peer );
2010-01-09 22:34:18 +00:00
if ( $peer && $peer_ip != " 0.0.0.0 " )
{
if ( $debug ) echo " Found peer $peer_ip (AS $peer_as ) \n " ;
$peerlist [] = array ( 'ip' => $peer_ip , 'as' => $peer_as );
}
2009-12-31 19:06:05 +00:00
} # Foreach
if ( $device [ 'os' ] == " junos " )
2010-01-09 22:34:18 +00:00
{
## Juniper BGP4-V2 MIB, ipv6 only for now, because v4 should be covered in BGP4-MIB above
2010-02-13 21:45:39 +00:00
$peers_cmd = $config [ 'snmpwalk' ] . " -M + " . $config [ 'install_dir' ] . " /mibs/junos -m BGP4-V2-MIB-JUNIPER -CI -Onq - " . $device [ 'snmpver' ] . " -c " . $device [ 'community' ] . " " . $device [ 'hostname' ] . " : " . $device [ 'port' ] . " " ;
2010-01-09 22:34:18 +00:00
$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 );
# Magic! Basically, takes SNMP form and finds peer IPs from the walk OIDs.
2010-01-16 23:37:26 +00:00
$peer_ip = Net_IPv6 :: compress ( snmp2ipv6 ( implode ( '.' , array_slice ( explode ( '.' , $peer_ip_snmp ), count ( explode ( '.' , $peer_ip_snmp )) - 16 ))));
2009-12-31 19:06:05 +00:00
2010-01-09 22:34:18 +00:00
if ( $peer )
{
if ( $debug ) echo " Found peer $peer_ip (AS $peer_as ) \n " ;
$peerlist [] = array ( 'ip' => $peer_ip , 'as' => $peer_as );
2009-12-31 19:06:05 +00:00
}
2010-01-09 22:34:18 +00:00
} # Foreach
} # OS junos
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
2010-01-09 22:34:18 +00:00
## Process disovered peers
2010-01-09 23:28:06 +00:00
if ( isset ( $peerlist ))
2010-01-09 22:34:18 +00:00
{
2010-01-09 23:28:06 +00:00
foreach ( $peerlist as $peer )
2010-01-09 22:34:18 +00:00
{
2010-01-09 23:28:06 +00:00
$astext = get_astext ( $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-02-21 11:58:07 +00:00
$update = mysql_query ( " UPDATE `bgpPeers` SET bgpPeerRemoteAs = " . $peer [ 'as' ] . " , astext = ' " . mres ( $astext ) . " ' WHERE `device_id` = ' " . $device [ 'device_id' ] . " ' AND bgpPeerIdentifier = ' " . $peer [ 'ip' ] . " ' " );
2010-01-09 23:28:06 +00:00
echo ( " . " );
}
2010-01-09 22:34:18 +00:00
2010-01-09 23:28:06 +00:00
## Get afi/safi and populate cbgp on cisco ios (xe/xr)
if ( $device [ 'os' ] == " ios " )
2010-01-09 22:34:18 +00:00
{
2010-01-09 23:28:06 +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' ];
2010-02-04 16:30:41 +00:00
$af_data = shell_exec ( $af_cmd );
2010-02-04 16:33:24 +00:00
if ( $debug ) { echo ( " afi data :: $af_cmd --> \n $af_data \n " ); }
2010-02-04 16:30:41 +00:00
$afs = trim ( str_replace ( " cbgpPeerAddrFamilyName. " . $peer [ 'ip' ] . " . " , " " , $af_data ));
2010-01-09 23:28:06 +00:00
foreach ( explode ( " \n " , $afs ) as $af )
2010-01-09 22:34:18 +00:00
{
2010-02-04 16:23:22 +00:00
if ( $debug ) { echo ( " AFISAFI = $af\n " ); }
2010-01-09 23:28:06 +00:00
list ( $afisafi , $text ) = explode ( " = " , $af );
list ( $afi , $safi ) = explode ( " . " , $afisafi );
if ( $afi && $safi )
2010-01-09 22:34:18 +00:00
{
2010-01-09 23:28:06 +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 ') " );
}
2010-01-09 22:34:18 +00:00
}
}
2010-01-09 23:28:06 +00:00
$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 ))
2010-01-09 22:34:18 +00:00
{
2010-01-09 23:28:06 +00:00
$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
} # if os = ios
} # Foreach
} # isset
2010-01-09 22:34:18 +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 ;
2010-01-16 23:37:26 +00:00
while ( $i < count ( $peerlist ) && ! isset ( $exists ))
2010-01-09 22:34:18 +00:00
{
if ( $peerlist [ $i ][ 'ip' ] == $entry [ 'bgpPeerIdentifier' ]) { $exists = 1 ; }
$i ++ ;
2008-03-15 17:58:15 +00:00
}
2010-01-16 23:37:26 +00:00
if ( ! isset ( $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
}
}
2010-01-09 23:28:06 +00:00
unset ( $peerlist );
2009-11-12 17:51:36 +00:00
echo ( " \n " );
2008-03-15 17:58:15 +00:00
?>