mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
feature: Added better BGP support for Arista (#6046)
* feature: Added better BGP support for Arista
This commit is contained in:
@@ -41,7 +41,7 @@ echo ' | Prefixes: ';
|
||||
|
||||
if ($vars['view'] == 'prefixes_ipv4unicast') {
|
||||
echo "<span class='pagemenu-selected'>";
|
||||
$extra_sql = " AND `bgpLocalAddr` NOT LIKE '%:%'";
|
||||
$extra_sql = " AND `bgpPeerIdentifier` NOT LIKE '%:%'";
|
||||
}
|
||||
|
||||
echo generate_link('IPv4', $link_array, array('view' => 'prefixes_ipv4unicast'));
|
||||
@@ -64,7 +64,7 @@ echo ' | ';
|
||||
|
||||
if ($vars['view'] == 'prefixes_ipv6unicast') {
|
||||
echo "<span class='pagemenu-selected'>";
|
||||
$extra_sql = " AND `bgpLocalAddr` LIKE '%:%'";
|
||||
$extra_sql = " AND `bgpPeerIdentifier` LIKE '%:%'";
|
||||
}
|
||||
|
||||
echo generate_link('IPv6', $link_array, array('view' => 'prefixes_ipv6unicast'));
|
||||
@@ -96,7 +96,7 @@ if ($vars['view'] == 'macaccounting_pkts') {
|
||||
print_optionbar_end();
|
||||
|
||||
echo '<table border="0" cellspacing="0" cellpadding="5" width="100%">';
|
||||
echo '<tr style="height: 30px"><td width=1></td><th></th><th>Peer address</th><th>Type</th><th>Remote AS</th><th>State</th><th>Uptime</th></tr>';
|
||||
echo '<tr style="height: 30px"><th>Peer address</th><th>Type</th><th>Remote AS</th><th>State</th><th>Uptime</th></tr>';
|
||||
|
||||
$i = '1';
|
||||
|
||||
@@ -218,7 +218,7 @@ foreach (dbFetchRows("SELECT * FROM `bgpPeers` WHERE `device_id` = ? $extra_sql
|
||||
echo '<tr bgcolor="'.$bg_colour.'"'.($peer['alert'] ? ' bordercolor="#cc0000"' : '').($peer['disabled'] ? ' bordercolor="#cccccc"' : '').'>
|
||||
';
|
||||
|
||||
echo ' <td width=20><span class=list-large>'.$i.'</span></td>
|
||||
echo '
|
||||
<td>'.$peeraddresslink.'<br />'.$peername."</td>
|
||||
<td>$peer_type</td>
|
||||
<td style='font-size: 10px; font-weight: bold; line-height: 10px;'>".(isset($peer['afi']) ? $peer['afi'] : '').'</td>
|
||||
|
@@ -107,7 +107,7 @@ if ($_SESSION['userlevel'] < '5') {
|
||||
echo ' | Prefixes: Unicast (';
|
||||
if ($vars['graph'] == 'prefixes_ipv4unicast') {
|
||||
echo "<span class='pagemenu-selected'>";
|
||||
$extra_sql = " AND `bgpLocalAddr` NOT LIKE '%:%'";
|
||||
$extra_sql = " AND `bgpPeerIdentifier` NOT LIKE '%:%'";
|
||||
}
|
||||
|
||||
echo generate_link('IPv4', $vars, array('view' => 'graphs', 'graph' => 'prefixes_ipv4unicast'));
|
||||
@@ -119,7 +119,7 @@ if ($_SESSION['userlevel'] < '5') {
|
||||
|
||||
if ($vars['graph'] == 'prefixes_ipv6unicast') {
|
||||
echo "<span class='pagemenu-selected'>";
|
||||
$extra_sql = " AND `bgpLocalAddr` LIKE '%:%'";
|
||||
$extra_sql = " AND `bgpPeerIdentifier` LIKE '%:%'";
|
||||
}
|
||||
|
||||
echo generate_link('IPv6', $vars, array('view' => 'graphs', 'graph' => 'prefixes_ipv6unicast'));
|
||||
|
@@ -2,6 +2,7 @@ os: arista_eos
|
||||
text: 'Arista EOS'
|
||||
type: network
|
||||
icon: arista
|
||||
group: arista
|
||||
over:
|
||||
- { graph: device_bits, text: 'Device Traffic' }
|
||||
- { graph: device_processor, text: 'CPU Usage' }
|
||||
|
@@ -1,7 +1,5 @@
|
||||
<?php
|
||||
if ($config['enable_bgp']) {
|
||||
// Discover BGP peers
|
||||
|
||||
if (key_exists('vrf_lite_cisco', $device) && (count($device['vrf_lite_cisco'])!=0)) {
|
||||
$vrfs_lite_cisco = $device['vrf_lite_cisco'];
|
||||
} else {
|
||||
@@ -11,7 +9,7 @@ if ($config['enable_bgp']) {
|
||||
$bgpLocalAs = trim(snmp_walk($device, '.1.3.6.1.2.1.15.2', '-Oqvn', 'BGP4-MIB'));
|
||||
|
||||
foreach ($vrfs_lite_cisco as $vrf) {
|
||||
$device['context_name'] = $vrf['context_name'];
|
||||
$device['context_name'] = $vrf['context_name'];
|
||||
if (is_numeric($bgpLocalAs)) {
|
||||
echo "AS$bgpLocalAs ";
|
||||
if ($bgpLocalAs != $device['bgpLocalAs']) {
|
||||
@@ -19,69 +17,20 @@ if ($config['enable_bgp']) {
|
||||
echo 'Updated AS ';
|
||||
}
|
||||
|
||||
$peer2 = false;
|
||||
if ($device['os'] !== 'junos') {
|
||||
$peer2 = false;
|
||||
|
||||
if ($device['os_group'] === 'arista') {
|
||||
$peers_data = snmp_walk($device, 'aristaBgp4V2PeerRemoteAs', '-Oq', 'ARISTA-BGP4V2-MIB');
|
||||
$peer2 = true;
|
||||
} elseif ($device['os'] !== 'junos') {
|
||||
$peers_data = snmp_walk($device, 'cbgpPeer2RemoteAs', '-Oq', 'CISCO-BGP4-MIB');
|
||||
if (empty($peers_data)) {
|
||||
$peers_data = snmp_walk($device, 'BGP4-MIB::bgpPeerRemoteAs', '-Oq', 'BGP4-MIB');
|
||||
} else {
|
||||
$peer2 = true;
|
||||
}
|
||||
|
||||
d_echo("Peers : $peers_data \n");
|
||||
|
||||
$peers = trim(str_replace('CISCO-BGP4-MIB::cbgpPeer2RemoteAs.', '', $peers_data));
|
||||
$peers = trim(str_replace('BGP4-MIB::bgpPeerRemoteAs.', '', $peers));
|
||||
|
||||
foreach (explode("\n", $peers) as $peer) {
|
||||
if ($peer2 === true) {
|
||||
list($ver, $peer) = explode('.', $peer, 2);
|
||||
}
|
||||
|
||||
list($peer_ip, $peer_as) = explode(' ', $peer);
|
||||
if (strstr($peer_ip, ':')) {
|
||||
$peer_ip_snmp = preg_replace('/:/', ' ', $peer_ip);
|
||||
$peer_ip = preg_replace('/(\S+\s+\S+)\s/', '$1:', $peer_ip_snmp);
|
||||
$peer_ip = str_replace('"', '', str_replace(' ', '', $peer_ip));
|
||||
}
|
||||
|
||||
if ($peer && $peer_ip != '0.0.0.0') {
|
||||
d_echo("Found peer $peer_ip (AS$peer_as)\n");
|
||||
|
||||
$peerlist[] = array(
|
||||
'ip' => $peer_ip,
|
||||
'as' => $peer_as,
|
||||
'ver' => $ver,
|
||||
);
|
||||
}
|
||||
}
|
||||
} elseif ($device['os'] == 'junos') {
|
||||
// Juniper BGP4-V2 MIB
|
||||
// FIXME: needs a big cleanup! also see below.
|
||||
// FIXME: is .0.ipv6 the only possible value here?
|
||||
$result = snmp_walk($device, 'jnxBgpM2PeerRemoteAs', '-Onq', 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
$peers = trim(str_replace('.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.', '', $result));
|
||||
foreach (explode("\n", $peers) as $peer) {
|
||||
list($peer_ip_snmp, $peer_as) = explode(' ', $peer);
|
||||
// Magic! Basically, takes SNMP form and finds peer IPs from the walk OIDs.
|
||||
$octets = count(explode(".", $peer_ip_snmp));
|
||||
if ($octets > 11) {
|
||||
// ipv6
|
||||
$peer_ip = Net_IPv6::compress(snmp2ipv6(implode('.', array_slice(explode('.', $peer_ip_snmp), (count(explode('.', $peer_ip_snmp)) - 16)))));
|
||||
} else {
|
||||
// ipv4
|
||||
$peer_ip = implode('.', array_slice(explode('.', $peer_ip_snmp), (count(explode('.', $peer_ip_snmp)) - 4)));
|
||||
}
|
||||
|
||||
if ($peer) {
|
||||
d_echo("Found peer $peer_ip (AS$peer_as)\n");
|
||||
|
||||
$peerlist[] = array(
|
||||
'ip' => $peer_ip,
|
||||
'as' => $peer_as,
|
||||
);
|
||||
}
|
||||
}
|
||||
$peers_data = snmp_walk($device, 'jnxBgpM2PeerRemoteAs', '-Onq', 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
}
|
||||
} else {
|
||||
echo 'No BGP on host';
|
||||
@@ -91,171 +40,100 @@ if ($config['enable_bgp']) {
|
||||
}
|
||||
}
|
||||
|
||||
// Process disovered peers
|
||||
$peerlist = build_bgp_peers($device, $peers_data, $peer2);
|
||||
|
||||
// Process discovered peers
|
||||
if (isset($peerlist)) {
|
||||
foreach ($peerlist as $peer) {
|
||||
$astext = get_astext($peer['as']);
|
||||
$peer['astext'] = $astext;
|
||||
|
||||
if (dbFetchCell('SELECT COUNT(*) from `bgpPeers` WHERE device_id = ? AND bgpPeerIdentifier = ?', array($device['device_id'], $peer['ip'])) < '1') {
|
||||
$bgpPeers = array(
|
||||
'device_id' => $device['device_id'],
|
||||
'bgpPeerIdentifier' => $peer['ip'],
|
||||
'bgpPeerRemoteAs' => $peer['as'],
|
||||
'context_name' => $device['context_name'],
|
||||
'astext' => $astext,
|
||||
'bgpPeerState' => 'idle',
|
||||
'bgpPeerAdminStatus' => 'stop',
|
||||
'bgpLocalAddr' => '0.0.0.0',
|
||||
'bgpPeerRemoteAddr' => '0.0.0.0',
|
||||
'bgpPeerInUpdates' => 0,
|
||||
'bgpPeerOutUpdates' => 0,
|
||||
'bgpPeerInTotalMessages' => 0,
|
||||
'bgpPeerOutTotalMessages' => 0,
|
||||
'bgpPeerFsmEstablishedTime' => 0,
|
||||
'bgpPeerInUpdateElapsedTime' => 0,
|
||||
);
|
||||
$add = dbInsert($bgpPeers, 'bgpPeers');
|
||||
if ($config['autodiscovery']['bgp'] === true) {
|
||||
$name = gethostbyaddr($peer['ip']);
|
||||
$remote_device_id = discover_new_device($name, $device, 'BGP');
|
||||
}
|
||||
add_bgp_peer($device, $peer);
|
||||
|
||||
echo '+';
|
||||
} else {
|
||||
$update = dbUpdate(array('bgpPeerRemoteAs' => $peer['as'], 'astext' => mres($astext)), 'bgpPeers', 'device_id=? AND bgpPeerIdentifier=?', array($device['device_id'], $peer['ip']));
|
||||
echo '.';
|
||||
}
|
||||
|
||||
if ($device['os_group'] == 'cisco' || $device['os'] == 'junos') {
|
||||
if ($device['os_group'] == 'cisco') {
|
||||
// Get afi/safi and populate cbgp on cisco ios (xe/xr)
|
||||
unset($af_list);
|
||||
$af_data = array();
|
||||
$af_list = array();
|
||||
|
||||
if ($device['os_group'] == 'cisco') {
|
||||
if (empty($af_data)) {
|
||||
if ($peer2 === true) {
|
||||
$af_data = snmpwalk_cache_oid($device, 'cbgpPeer2AddrFamilyEntry', $cbgp, 'CISCO-BGP4-MIB');
|
||||
} else {
|
||||
$af_data = snmpwalk_cache_oid($device, 'cbgpPeerAddrFamilyEntry', $cbgp, 'CISCO-BGP4-MIB');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
d_echo('afi data :: ');
|
||||
d_echo($af_data);
|
||||
if ($device['os_group'] === 'arista') {
|
||||
if (empty($af_data)) {
|
||||
$af_data = snmpwalk_cache_oid($device, 'aristaBgp4V2PrefixInPrefixes', $af_data, 'ARISTA-BGP4V2-MIB');
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($af_data as $k => $v) {
|
||||
if ($peer2 === true) {
|
||||
list(,$k) = explode('.', $k, 2);
|
||||
}
|
||||
if (!empty($af_data)) {
|
||||
$af_list = build_cbgp_peers($device, $peer, $af_data, $peer2);
|
||||
}
|
||||
|
||||
d_echo("AFISAFI = $k\n");
|
||||
if ($device['os'] == 'junos') {
|
||||
$safis[1] = 'unicast';
|
||||
$safis[2] = 'multicast';
|
||||
|
||||
$afisafi_tmp = explode('.', $k);
|
||||
$safi = array_pop($afisafi_tmp);
|
||||
$afi = array_pop($afisafi_tmp);
|
||||
$bgp_ip = str_replace(".$afi.$safi", '', $k);
|
||||
$bgp_ip = preg_replace('/:/', ' ', $bgp_ip);
|
||||
$bgp_ip = preg_replace('/(\S+\s+\S+)\s/', '$1:', $bgp_ip);
|
||||
$bgp_ip = str_replace('"', '', str_replace(' ', '', $bgp_ip));
|
||||
if ($afi && $safi && $bgp_ip == $peer['ip']) {
|
||||
$af_list[$bgp_ip][$afi][$safi] = 1;
|
||||
if (dbFetchCell('SELECT COUNT(*) from `bgpPeers_cbgp` WHERE device_id = ? AND bgpPeerIdentifier = ? AND afi=? AND safi=?', array($device['device_id'], $peer['ip'], $afi, $safi)) == 0) {
|
||||
dbInsert(array('device_id' => $device['device_id'], 'bgpPeerIdentifier' => $peer['ip'], 'afi' => $afi, 'safi' => $safi, 'context_name' => $device['context_name']), 'bgpPeers_cbgp');
|
||||
}
|
||||
if (!isset($j_peerIndexes)) {
|
||||
$j_bgp = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PeerEntry', $jbgp, 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
d_echo($j_bgp);
|
||||
foreach ($j_bgp as $index => $entry) {
|
||||
switch ($entry['jnxBgpM2PeerRemoteAddrType']) {
|
||||
case 'ipv4':
|
||||
$ip = long2ip(hexdec($entry['jnxBgpM2PeerRemoteAddr']));
|
||||
d_echo("peerindex for ipv4 $ip is ".$entry['jnxBgpM2PeerIndex']."\n");
|
||||
$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);
|
||||
d_echo("peerindex for ipv6 $ip6 is ".$entry['jnxBgpM2PeerIndex']."\n");
|
||||
$j_peerIndexes[$ip6] = $entry['jnxBgpM2PeerIndex'];
|
||||
break;
|
||||
default:
|
||||
echo "HALP? Don't know RemoteAddrType ".$entry['jnxBgpM2PeerRemoteAddrType']."!\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($device['os'] == 'junos') {
|
||||
$safis[1] = 'unicast';
|
||||
$safis[2] = 'multicast';
|
||||
|
||||
if (!isset($j_peerIndexes)) {
|
||||
$j_bgp = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PeerEntry', $jbgp, 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
d_echo($j_bgp);
|
||||
foreach ($j_bgp as $index => $entry) {
|
||||
switch ($entry['jnxBgpM2PeerRemoteAddrType']) {
|
||||
case 'ipv4':
|
||||
$ip = long2ip(hexdec($entry['jnxBgpM2PeerRemoteAddr']));
|
||||
d_echo("peerindex for ipv4 $ip is ".$entry['jnxBgpM2PeerIndex']."\n");
|
||||
|
||||
$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);
|
||||
d_echo("peerindex for ipv6 $ip6 is ".$entry['jnxBgpM2PeerIndex']."\n");
|
||||
|
||||
$j_peerIndexes[$ip6] = $entry['jnxBgpM2PeerIndex'];
|
||||
break;
|
||||
|
||||
default:
|
||||
echo "HALP? Don't know RemoteAddrType ".$entry['jnxBgpM2PeerRemoteAddrType']."!\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($j_afisafi)) {
|
||||
$j_prefixes = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PrefixCountersTable', $jbgp, 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
foreach (array_keys($j_prefixes) as $key) {
|
||||
list($index,$afisafi) = explode('.', $key, 2);
|
||||
$j_afisafi[$index][] = $afisafi;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($j_afisafi[$j_peerIndexes[$peer['ip']]] as $afisafi) {
|
||||
list ($afi,$safi) = explode('.', $afisafi);
|
||||
$safi = $safis[$safi];
|
||||
$af_list[$peer['ip']][$afi][$safi] = 1;
|
||||
if (dbFetchCell('SELECT COUNT(*) from `bgpPeers_cbgp` WHERE device_id = ? AND bgpPeerIdentifier = ? AND afi=? AND safi=?', array($device['device_id'], $peer['ip'], $afi, $safi)) == 0) {
|
||||
$cbgp = array(
|
||||
'device_id' => $device['device_id'],
|
||||
'bgpPeerIdentifier' => $peer['ip'],
|
||||
'afi' => $afi,
|
||||
'safi' => $safi,
|
||||
'AcceptedPrefixes' => 0,
|
||||
'DeniedPrefixes' => 0,
|
||||
'PrefixAdminLimit' => 0,
|
||||
'PrefixThreshold' => 0,
|
||||
'PrefixClearThreshold' => 0,
|
||||
'AdvertisedPrefixes' => 0,
|
||||
'SuppressedPrefixes' => 0,
|
||||
'WithdrawnPrefixes' => 0,
|
||||
'AcceptedPrefixes_delta' => 0,
|
||||
'AcceptedPrefixes_prev' => 0,
|
||||
'DeniedPrefixes_delta' => 0,
|
||||
'DeniedPrefixes_prev' => 0,
|
||||
'AdvertisedPrefixes_delta' => 0,
|
||||
'AdvertisedPrefixes_prev' => 0,
|
||||
'SuppressedPrefixes_delta' => 0,
|
||||
'SuppressedPrefixes_prev' => 0,
|
||||
'WithdrawnPrefixes_delta' => 0,
|
||||
'WithdrawnPrefixes_prev' => 0,
|
||||
);
|
||||
dbInsert($cbgp, 'bgpPeers_cbgp');
|
||||
}
|
||||
if (!isset($j_afisafi)) {
|
||||
$j_prefixes = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PrefixCountersTable', $jbgp, 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
foreach (array_keys($j_prefixes) as $key) {
|
||||
list($index,$afisafi) = explode('.', $key, 2);
|
||||
$j_afisafi[$index][] = $afisafi;
|
||||
}
|
||||
}
|
||||
|
||||
$af_query = "SELECT * FROM bgpPeers_cbgp WHERE `device_id` = '".$device['device_id']."' AND bgpPeerIdentifier = '".$peer['ip']."'";
|
||||
foreach (dbFetchRows($af_query) as $entry) {
|
||||
$afi = $entry['afi'];
|
||||
$safi = $entry['safi'];
|
||||
if (!$af_list[$entry['bgpPeerIdentifier']][$afi][$safi]) {
|
||||
dbDelete('bgpPeers_cbgp', '`device_id` = ? AND `bgpPeerIdentifier` = ? AND afi=? AND safi=?', array($device['device_id'], $peer['ip'], $afi, $safi));
|
||||
}
|
||||
foreach ($j_afisafi[$j_peerIndexes[$peer['ip']]] as $afisafi) {
|
||||
list ($afi,$safi) = explode('.', $afisafi);
|
||||
$safi = $safis[$safi];
|
||||
$af_list[$peer['ip']][$afi][$safi] = 1;
|
||||
add_cbgp_peer($device, $peer, $afi, $safi);
|
||||
}
|
||||
}
|
||||
|
||||
$af_query = "SELECT * FROM bgpPeers_cbgp WHERE `device_id` = '".$device['device_id']."' AND bgpPeerIdentifier = '".$peer['ip']."'";
|
||||
foreach (dbFetchRows($af_query) as $entry) {
|
||||
$afi = $entry['afi'];
|
||||
$safi = $entry['safi'];
|
||||
if (!$af_list[$entry['bgpPeerIdentifier']][$afi][$safi]) {
|
||||
dbDelete('bgpPeers_cbgp', '`device_id` = ? AND `bgpPeerIdentifier` = ? AND afi=? AND safi=?', array($device['device_id'], $peer['ip'], $afi, $safi));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unset($j_afisafi);
|
||||
unset($j_prefixes);
|
||||
unset($j_bgp);
|
||||
unset($j_peerIndexes);
|
||||
}
|
||||
|
||||
// Delete removed peers
|
||||
$sql = "SELECT * FROM bgpPeers WHERE device_id = '".$device['device_id']."' AND (context_name = '".$device['context_name']."' OR context_name IS NULL)";
|
||||
// Delete removed peers
|
||||
$sql = "SELECT * FROM bgpPeers WHERE device_id = '".$device['device_id']."' AND (context_name = '".$device['context_name']."' OR context_name IS NULL)";
|
||||
|
||||
foreach (dbFetchRows($sql) as $entry) {
|
||||
unset($exists);
|
||||
@@ -274,13 +152,14 @@ if ($config['enable_bgp']) {
|
||||
echo '-';
|
||||
}
|
||||
}
|
||||
|
||||
unset($peerlist);
|
||||
|
||||
echo "\n";
|
||||
unset($device['context_name']);
|
||||
echo "\n";
|
||||
unset(
|
||||
$device['context_name'],
|
||||
$peerlist
|
||||
);
|
||||
}
|
||||
unset($device['context_name']);
|
||||
unset($vrfs_c);
|
||||
unset(
|
||||
$device['context_name'],
|
||||
$vrfs_c
|
||||
);
|
||||
}
|
||||
echo "FIN BGP \n\n\n";
|
||||
|
@@ -1010,3 +1010,144 @@ function sensors($types, $device, $valid, $pre_cache = array())
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
|
||||
function build_bgp_peers($device, $data, $peer2)
|
||||
{
|
||||
d_echo("Peers : $data\n");
|
||||
$peers = trim(str_replace('ARISTA-BGP4V2-MIB::aristaBgp4V2PeerRemoteAs.1.', '', $data));
|
||||
$peers = trim(str_replace('CISCO-BGP4-MIB::cbgpPeer2RemoteAs.', '', $peers));
|
||||
$peers = trim(str_replace('BGP4-MIB::bgpPeerRemoteAs.', '', $peers));
|
||||
$peers = trim(str_replace('.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.13.', '', $peers));
|
||||
$peerlist = array();
|
||||
$ver = '';
|
||||
foreach (explode("\n", $peers) as $peer) {
|
||||
if ($peer2 === true) {
|
||||
list($ver, $peer) = explode('.', $peer, 2);
|
||||
}
|
||||
list($peer_ip, $peer_as) = explode(' ', $peer);
|
||||
if ($device['os'] === 'junos') {
|
||||
$ver = '';
|
||||
$octets = count(explode(".", $peer_ip));
|
||||
if ($octets > 11) {
|
||||
// ipv6
|
||||
$peer_ip = Net_IPv6::compress(snmp2ipv6(implode('.', array_slice(explode('.', $peer_ip), (count(explode('.', $peer_ip)) - 16)))));
|
||||
} else {
|
||||
// ipv4
|
||||
$peer_ip = implode('.', array_slice(explode('.', $peer_ip), (count(explode('.', $peer_ip)) - 4)));
|
||||
}
|
||||
} else {
|
||||
if (strstr($peer_ip, ':')) {
|
||||
$peer_ip_snmp = preg_replace('/:/', ' ', $peer_ip);
|
||||
$peer_ip = preg_replace('/(\S+\s+\S+)\s/', '$1:', $peer_ip_snmp);
|
||||
$peer_ip = str_replace('"', '', str_replace(' ', '', $peer_ip));
|
||||
}
|
||||
}
|
||||
if ($peer && $peer_ip != '0.0.0.0') {
|
||||
d_echo("Found peer $peer_ip (AS$peer_as)\n");
|
||||
$peerlist[] = array(
|
||||
'ip' => $peer_ip,
|
||||
'as' => $peer_as,
|
||||
'ver' => $ver,
|
||||
);
|
||||
}
|
||||
}
|
||||
return $peerlist;
|
||||
}
|
||||
|
||||
function build_cbgp_peers($device, $peer, $af_data, $peer2)
|
||||
{
|
||||
|
||||
d_echo('afi data :: ');
|
||||
d_echo($af_data);
|
||||
|
||||
$af_list = array();
|
||||
foreach ($af_data as $k => $v) {
|
||||
if ($peer2 === true) {
|
||||
list(,$k) = explode('.', $k, 2);
|
||||
}
|
||||
|
||||
d_echo("AFISAFI = $k\n");
|
||||
|
||||
$afisafi_tmp = explode('.', $k);
|
||||
$safi = array_pop($afisafi_tmp);
|
||||
$afi = array_pop($afisafi_tmp);
|
||||
$bgp_ip = str_replace(".$afi.$safi", '', $k);
|
||||
if ($device['os_group'] === 'arista') {
|
||||
$bgp_ip = str_replace("$afi.", '', $bgp_ip);
|
||||
}
|
||||
$bgp_ip = preg_replace('/:/', ' ', $bgp_ip);
|
||||
$bgp_ip = preg_replace('/(\S+\s+\S+)\s/', '$1:', $bgp_ip);
|
||||
$bgp_ip = str_replace('"', '', str_replace(' ', '', $bgp_ip));
|
||||
|
||||
if ($afi && $safi && $bgp_ip == $peer['ip']) {
|
||||
$af_list[$bgp_ip][$afi][$safi] = 1;
|
||||
add_cbgp_peer($device, $peer, $afi, $safi);
|
||||
}
|
||||
}
|
||||
return $af_list;
|
||||
}
|
||||
|
||||
function add_bgp_peer($device, $peer)
|
||||
{
|
||||
global $config;
|
||||
if (dbFetchCell('SELECT COUNT(*) from `bgpPeers` WHERE device_id = ? AND bgpPeerIdentifier = ?', array($device['device_id'], $peer['ip'])) < '1') {
|
||||
$bgpPeers = array(
|
||||
'device_id' => $device['device_id'],
|
||||
'bgpPeerIdentifier' => $peer['ip'],
|
||||
'bgpPeerRemoteAs' => $peer['as'],
|
||||
'context_name' => $device['context_name'],
|
||||
'astext' => $peer['astext'],
|
||||
'bgpPeerState' => 'idle',
|
||||
'bgpPeerAdminStatus' => 'stop',
|
||||
'bgpLocalAddr' => '0.0.0.0',
|
||||
'bgpPeerRemoteAddr' => '0.0.0.0',
|
||||
'bgpPeerInUpdates' => 0,
|
||||
'bgpPeerOutUpdates' => 0,
|
||||
'bgpPeerInTotalMessages' => 0,
|
||||
'bgpPeerOutTotalMessages' => 0,
|
||||
'bgpPeerFsmEstablishedTime' => 0,
|
||||
'bgpPeerInUpdateElapsedTime' => 0,
|
||||
);
|
||||
dbInsert($bgpPeers, 'bgpPeers');
|
||||
if ($config['autodiscovery']['bgp'] === true) {
|
||||
$name = gethostbyaddr($peer['ip']);
|
||||
discover_new_device($name, $device, 'BGP');
|
||||
}
|
||||
echo '+';
|
||||
} else {
|
||||
dbUpdate(array('bgpPeerRemoteAs' => $peer['as'], 'astext' => mres($peer['astext'])), 'bgpPeers', 'device_id=? AND bgpPeerIdentifier=?', array($device['device_id'], $peer['ip']));
|
||||
echo '.';
|
||||
}
|
||||
}
|
||||
|
||||
function add_cbgp_peer($device, $peer, $afi, $safi)
|
||||
{
|
||||
if (dbFetchCell('SELECT COUNT(*) from `bgpPeers_cbgp` WHERE device_id = ? AND bgpPeerIdentifier = ? AND afi=? AND safi=?', array($device['device_id'], $peer['ip'], $afi, $safi)) == 0) {
|
||||
$cbgp = array(
|
||||
'device_id' => $device['device_id'],
|
||||
'bgpPeerIdentifier' => $peer['ip'],
|
||||
'afi' => $afi,
|
||||
'safi' => $safi,
|
||||
'context_name' => $device['context_name'],
|
||||
'AcceptedPrefixes' => 0,
|
||||
'DeniedPrefixes' => 0,
|
||||
'PrefixAdminLimit' => 0,
|
||||
'PrefixThreshold' => 0,
|
||||
'PrefixClearThreshold' => 0,
|
||||
'AdvertisedPrefixes' => 0,
|
||||
'SuppressedPrefixes' => 0,
|
||||
'WithdrawnPrefixes' => 0,
|
||||
'AcceptedPrefixes_delta' => 0,
|
||||
'AcceptedPrefixes_prev' => 0,
|
||||
'DeniedPrefixes_delta' => 0,
|
||||
'DeniedPrefixes_prev' => 0,
|
||||
'AdvertisedPrefixes_delta' => 0,
|
||||
'AdvertisedPrefixes_prev' => 0,
|
||||
'SuppressedPrefixes_delta' => 0,
|
||||
'SuppressedPrefixes_prev' => 0,
|
||||
'WithdrawnPrefixes_delta' => 0,
|
||||
'WithdrawnPrefixes_prev' => 0,
|
||||
);
|
||||
dbInsert($cbgp, 'bgpPeers_cbgp');
|
||||
}
|
||||
}
|
||||
|
@@ -8,13 +8,15 @@ if ($config['enable_bgp']) {
|
||||
if (!empty($peers)) {
|
||||
if ($device['os'] == 'junos') {
|
||||
$peer_data_check = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerIndex', '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos');
|
||||
} elseif ($device['os_group'] === 'arista') {
|
||||
$peer_data_check = snmpwalk_cache_oid($device, 'aristaBgp4V2PeerRemoteAs', array(), 'ARISTA-BGP4V2-MIB');
|
||||
} else {
|
||||
$peer_data_check = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteAs', array(), 'CISCO-BGP4-MIB');
|
||||
}
|
||||
|
||||
foreach ($peers as $peer) {
|
||||
//add context if exist
|
||||
$device['context_name']= $peer['context_name'];
|
||||
$device['context_name'] = $peer['context_name'];
|
||||
if (strstr(":", $peer['bgpPeerIdentifier'])) {
|
||||
$peer_ip = ipv62snmp($peer['bgpPeerIdentifier']);
|
||||
} else {
|
||||
@@ -44,18 +46,28 @@ if ($config['enable_bgp']) {
|
||||
$ip_ver = 'ipv4';
|
||||
}
|
||||
|
||||
$peer_identifier = $ip_type.'.'.$ip_len.'.'.$bgp_peer_ident;
|
||||
$peer_data_tmp = snmp_get_multi(
|
||||
$device,
|
||||
' cbgpPeer2State.'.$peer_identifier.' cbgpPeer2AdminStatus.'.$peer_identifier.' cbgpPeer2InUpdates.'.$peer_identifier.' cbgpPeer2OutUpdates.'.$peer_identifier.' cbgpPeer2InTotalMessages.'.$peer_identifier.' cbgpPeer2OutTotalMessages.'.$peer_identifier.' cbgpPeer2FsmEstablishedTime.'.$peer_identifier.' cbgpPeer2InUpdateElapsedTime.'.$peer_identifier.' cbgpPeer2LocalAddr.'.$peer_identifier,
|
||||
'-OQUs',
|
||||
'CISCO-BGP4-MIB'
|
||||
);
|
||||
if ($device['os_group'] === 'arista') {
|
||||
$peer_identifier = '1.'.$ip_type.'.'.$ip_len.'.'.$bgp_peer_ident;
|
||||
$peer_data_tmp = snmp_get_multi(
|
||||
$device,
|
||||
' aristaBgp4V2PeerState.' . $peer_identifier . ' aristaBgp4V2PeerAdminStatus.' . $peer_identifier . ' aristaBgp4V2PeerInUpdates.' . $peer_identifier . ' aristaBgp4V2PeerOutUpdates.' . $peer_identifier . ' aristaBgp4V2PeerInTotalMessages.' . $peer_identifier . ' aristaBgp4V2PeerOutTotalMessages.' . $peer_identifier . ' aristaBgp4V2PeerFsmEstablishedTime.' . $peer_identifier . ' aristaBgp4V2PeerInUpdatesElapsedTime.' . $peer_identifier . ' aristaBgp4V2PeerLocalAddr.' . $peer_identifier,
|
||||
'-OQUs',
|
||||
'ARISTA-BGP4V2-MIB'
|
||||
);
|
||||
} else {
|
||||
$peer_identifier = $ip_type.'.'.$ip_len.'.'.$bgp_peer_ident;
|
||||
$peer_data_tmp = snmp_get_multi(
|
||||
$device,
|
||||
' cbgpPeer2State.' . $peer_identifier . ' cbgpPeer2AdminStatus.' . $peer_identifier . ' cbgpPeer2InUpdates.' . $peer_identifier . ' cbgpPeer2OutUpdates.' . $peer_identifier . ' cbgpPeer2InTotalMessages.' . $peer_identifier . ' cbgpPeer2OutTotalMessages.' . $peer_identifier . ' cbgpPeer2FsmEstablishedTime.' . $peer_identifier . ' cbgpPeer2InUpdateElapsedTime.' . $peer_identifier . ' cbgpPeer2LocalAddr.' . $peer_identifier,
|
||||
'-OQUs',
|
||||
'CISCO-BGP4-MIB'
|
||||
);
|
||||
}
|
||||
$ident = "$ip_ver.\"".$bgp_peer_ident.'"';
|
||||
unset($peer_data);
|
||||
$ident_key = array_keys($peer_data_tmp);
|
||||
foreach ($peer_data_tmp[$ident_key[0]] as $k => $v) {
|
||||
if (strstr($k, 'cbgpPeer2LocalAddr')) {
|
||||
if (strstr($k, 'cbgpPeer2LocalAddr') || $k === 'aristaBgp4V2PeerLocalAddr') {
|
||||
if ($ip_ver == 'ipv6') {
|
||||
$v = str_replace('"', '', $v);
|
||||
$v = rtrim($v);
|
||||
@@ -178,7 +190,7 @@ if ($config['enable_bgp']) {
|
||||
|
||||
dbUpdate($peer['update'], 'bgpPeers', '`device_id` = ? AND `bgpPeerIdentifier` = ?', array($device['device_id'], $peer['bgpPeerIdentifier']));
|
||||
|
||||
if ($device['os_group'] == 'cisco' || $device['os'] == 'junos') {
|
||||
if ($device['os_group'] == 'cisco' || $device['os'] == 'junos' || $device['os_group'] === 'arista') {
|
||||
// Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB or BGP4-V2-JUNIPER MIB)
|
||||
$peer_afis = dbFetchRows('SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ? AND bgpPeerIdentifier = ?', array($device['device_id'], $peer['bgpPeerIdentifier']));
|
||||
foreach ($peer_afis as $peer_afi) {
|
||||
@@ -280,6 +292,26 @@ if ($config['enable_bgp']) {
|
||||
$cbgpPeerAdvertisedPrefixes = array_shift($j_prefixes['1.3.6.1.4.1.2636.5.1.1.2.6.2.1.10.'.$junos[$peer_ip]['index'].".$afis[$afi].".$safis[$safi]]);
|
||||
}//end if
|
||||
|
||||
if ($device['os_group'] === 'arista') {
|
||||
$safis['unicast'] = 1;
|
||||
$safis['multicast'] = 2;
|
||||
$afis['ipv4'] = 1;
|
||||
$afis['ipv6'] = 2;
|
||||
$type['ipv4'] = 4;
|
||||
$type['ipv6'] = 16;
|
||||
if (preg_match('/:/', $peer['bgpPeerIdentifier'])) {
|
||||
$tmp_peer = str_replace(':', '', $peer['bgpPeerIdentifier']);
|
||||
$tmp_peer = preg_replace('/([\w\d]{2})/', '\1:', $tmp_peer);
|
||||
$tmp_peer = rtrim($tmp_peer, ':');
|
||||
} else {
|
||||
$tmp_peer = $peer['bgpPeerIdentifier'];
|
||||
}
|
||||
if (empty($a_prefixes)) {
|
||||
$a_prefixes = snmpwalk_cache_multi_oid($device, 'aristaBgp4V2PrefixInPrefixesAccepted', $a_prefixes, 'ARISTA-BGP4V2-MIB', null, '-OQUs');
|
||||
}
|
||||
$cbgpPeerAcceptedPrefixes = $a_prefixes["1.$afi.$tmp_peer.$afi.$safi"]['aristaBgp4V2PrefixInPrefixesAccepted'];
|
||||
}
|
||||
|
||||
// FIXME THESE FIELDS DO NOT EXIST IN THE DATABASE!
|
||||
$update = 'UPDATE bgpPeers_cbgp SET';
|
||||
$peer['c_update']['AcceptedPrefixes'] = set_numeric($cbgpPeerAcceptedPrefixes);
|
||||
|
1784
mibs/arista/ARISTA-BGP4V2-MIB
Normal file
1784
mibs/arista/ARISTA-BGP4V2-MIB
Normal file
File diff suppressed because it is too large
Load Diff
93
mibs/arista/ARISTA-BGP4V2-TC-MIB
Normal file
93
mibs/arista/ARISTA-BGP4V2-TC-MIB
Normal file
@@ -0,0 +1,93 @@
|
||||
-- extracted from draft-ietf-idr-bgp4-mibv2-tc-mib-03.txt
|
||||
-- at Tue Jul 12 06:11:02 2011
|
||||
|
||||
-- Renumbered to sit underneath Arista's enterprise.
|
||||
|
||||
ARISTA-BGP4V2-TC-MIB DEFINITIONS ::= BEGIN
|
||||
|
||||
IMPORTS
|
||||
MODULE-IDENTITY FROM SNMPv2-SMI
|
||||
aristaExperiment FROM ARISTA-SMI-MIB
|
||||
TEXTUAL-CONVENTION FROM SNMPv2-TC;
|
||||
|
||||
aristaBgp4V2TC MODULE-IDENTITY
|
||||
LAST-UPDATED "201408150000Z"
|
||||
ORGANIZATION "Arista Networks, Inc."
|
||||
CONTACT-INFO
|
||||
"Arista Networks, Inc.
|
||||
|
||||
Postal: 5453 Great America Parkway
|
||||
Santa Clara, CA 95054
|
||||
|
||||
Tel: +1 408 547-5500
|
||||
|
||||
E-mail: snmp@arista.com"
|
||||
DESCRIPTION
|
||||
"Textual conventions for BGP-4.
|
||||
This version was published in
|
||||
draft-ietf-idr-bgp4-mibv2-13, and
|
||||
modified to be homed inside the Arista
|
||||
enterprise. There were no other
|
||||
modifications.
|
||||
|
||||
|
||||
Copyright (C) The IETF Trust (2011). This
|
||||
version of this MIB module is part of
|
||||
draft-ietf-idr-bgp4-mibv2-13.txt;
|
||||
see the draft itself for full legal notices."
|
||||
|
||||
REVISION "201408150000Z"
|
||||
DESCRIPTION
|
||||
"Updated postal and e-mail addresses."
|
||||
REVISION "201210190000Z"
|
||||
DESCRIPTION
|
||||
"Renumbered inside the Arista enterprise space."
|
||||
REVISION "201101170000Z"
|
||||
DESCRIPTION
|
||||
"Initial version."
|
||||
::= { aristaExperiment 2 }
|
||||
|
||||
--
|
||||
-- Textual Conventions
|
||||
--
|
||||
|
||||
AristaBgp4V2IdentifierTC ::= TEXTUAL-CONVENTION
|
||||
DISPLAY-HINT "1d."
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"The representation of a BGP Identifier. BGP Identifiers
|
||||
are presented in the received network byte order.
|
||||
|
||||
The BGP Identifier is displayed as if it is an IP address,
|
||||
even if it would be an illegal one."
|
||||
REFERENCE
|
||||
"RFC 4273, Section 4.2"
|
||||
SYNTAX OCTET STRING(SIZE (4))
|
||||
|
||||
AristaBgp4V2AddressFamilyIdentifierTC ::= TEXTUAL-CONVENTION
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"The representation of a BGP AFI. The value of this object
|
||||
should be restricted to be between the values of 0 and
|
||||
65535."
|
||||
REFERENCE
|
||||
"RFC 4760, Section 3"
|
||||
SYNTAX INTEGER {
|
||||
ipv4(1),
|
||||
ipv6(2)
|
||||
}
|
||||
|
||||
AristaBgp4V2SubsequentAddressFamilyIdentifierTC ::= TEXTUAL-CONVENTION
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"The representation of a BGP SAFI"
|
||||
REFERENCE
|
||||
"RFC 4760, Section 3. The value of this object should be
|
||||
restricted to be between the values of 0 and 255."
|
||||
SYNTAX INTEGER {
|
||||
unicast(1),
|
||||
multicast(2),
|
||||
mpls(4)
|
||||
}
|
||||
|
||||
END
|
68
mibs/arista/ARISTA-SMI-MIB
Normal file
68
mibs/arista/ARISTA-SMI-MIB
Normal file
@@ -0,0 +1,68 @@
|
||||
-- ARISTA-SMI_MIB: arista structure of management information
|
||||
-- Copyright (c) 2008 Arista Networks, Inc. All rights reserved.
|
||||
|
||||
ARISTA-SMI-MIB DEFINITIONS ::= BEGIN
|
||||
|
||||
IMPORTS
|
||||
MODULE-IDENTITY,
|
||||
OBJECT-IDENTITY,
|
||||
enterprises
|
||||
FROM SNMPv2-SMI;
|
||||
|
||||
arista MODULE-IDENTITY
|
||||
LAST-UPDATED "201408150000Z"
|
||||
ORGANIZATION "Arista Networks, Inc."
|
||||
CONTACT-INFO
|
||||
"Arista Networks, Inc.
|
||||
|
||||
Postal: 5453 Great America Parkway
|
||||
Santa Clara, CA 95054
|
||||
|
||||
Tel: +1 408 547-5500
|
||||
|
||||
E-mail: snmp@arista.com"
|
||||
DESCRIPTION
|
||||
"The Structure of Management Information for the
|
||||
Arista Networks enterprise."
|
||||
REVISION "201408150000Z"
|
||||
DESCRIPTION
|
||||
"Updated postal and e-mail addresses"
|
||||
REVISION "201103311300Z"
|
||||
DESCRIPTION
|
||||
"Updated postal address and telephone"
|
||||
REVISION "200810271830Z"
|
||||
DESCRIPTION
|
||||
"Initial version."
|
||||
::= { enterprises 30065 } -- assigned by IANA
|
||||
|
||||
aristaProducts OBJECT-IDENTITY
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"aristaProducts is the root object identifier from
|
||||
which sysObjectID values are assigned. Values are
|
||||
defined in ARISTA-PRODUCTS-MIB."
|
||||
::= { arista 1 }
|
||||
|
||||
aristaModules OBJECT-IDENTITY
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"aristaModules provides a root object identifier
|
||||
from which MODULE-IDENTITY values may be assigned."
|
||||
::= { arista 2 }
|
||||
|
||||
aristaMibs OBJECT-IDENTITY
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"aristaMibs provides a root object identifier
|
||||
for management-related MIBs."
|
||||
::= { arista 3 }
|
||||
|
||||
aristaExperiment OBJECT-IDENTITY
|
||||
STATUS current
|
||||
DESCRIPTION
|
||||
"aristaExperiment provides a root object identifier
|
||||
for experimental MIBs. The structure of information
|
||||
for these MIBs can not be guaranteed between releases."
|
||||
::= { arista 4 }
|
||||
|
||||
END
|
Reference in New Issue
Block a user