Nokia vrf bgp (#9622)

* first commit

* clean code

* add snmpsim data for bgp

* renumber sql patch

* clear public ip

* update  misc/db_schema.yaml

* add test data and renumber sql-schema

* sql-schema

* sql-schema

* Update module_tables.yaml

* Update module_tables.yaml

* Update timos.json

* Update timos.snmprec

* Rename 281.sql to 282.sql

* update test data

* db migration

* Update 2019_01_16_195644_add_vrf_id_and_bgpLocalAs.php

* update db schema

* Update 2019_01_16_195644_add_vrf_id_and_bgpLocalAs.php

* Update 2019_01_16_195644_add_vrf_id_and_bgpLocalAs.php

* Update db_schema.yaml

* update schema
This commit is contained in:
Vitali Kari
2019-01-19 18:44:32 +01:00
committed by Tony Murray
parent b4741442c5
commit b55938f031
22 changed files with 21160 additions and 116 deletions

View File

@@ -5,6 +5,71 @@ use LibreNMS\Exceptions\InvalidIpException;
use LibreNMS\Util\IP;
if (Config::get('enable_bgp')) {
if ($device['os'] == 'timos') {
$bgpPeersCache =snmpwalk_cache_multi_oid($device, 'tBgpPeerNgTable', [], 'TIMETRA-BGP-MIB', 'nokia');
foreach ($bgpPeersCache as $key => $value) {
$oid = explode(".", $key);
$vrfInstance = $oid[0];
$address = str_replace($oid[0].".".$oid[1].".", '', $key);
if (strlen($address) > 15) {
$address = IP::fromHexString($address)->compressed();
}
$bgpPeers[$vrfInstance][$address] = $value;
}
unset($bgpPeersCache);
foreach ($bgpPeers as $vrfOid => $vrf) {
$vrfId = dbFetchCell('SELECT vrf_id from `vrfs` WHERE vrf_oid = ?', [$vrfOid]);
foreach ($vrf as $address => $value) {
$astext = get_astext($value['tBgpPeerNgPeerAS4Byte']);
if (dbFetchCell('SELECT COUNT(*) from `bgpPeers` WHERE device_id = ? AND bgpPeerIdentifier = ? AND vrf_id = ?', [$device['device_id'], $address, $vrfId]) < '1') {
$peers = [
'device_id' => $device['device_id'],
'vrf_id' => $vrfId,
'bgpPeerIdentifier' => $address,
'bgpPeerRemoteAs' => $value['tBgpPeerNgPeerAS4Byte'],
'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,
'astext' => $astext,
];
dbInsert($peers, 'bgpPeers');
if (Config::get('autodiscovery.bgp')) {
$name = gethostbyaddr($address);
discover_new_device($name, $device, 'BGP');
}
echo '+';
} else {
dbUpdate(['bgpPeerRemoteAs' => $value['tBgpPeerNgPeerAS4Byte'], 'astext' => $astext], 'bgpPeers', 'device_id = ? AND bgpPeerIdentifier = ? AND vrf_id = ?', [$device['device_id'], $address, $vrfId]);
echo '.';
}
}
}
// clean up peers
$peers = dbFetchRows('SELECT `B`.`vrf_id` AS `vrf_id`, `bgpPeerIdentifier`, `vrf_oid` FROM `bgpPeers` AS B LEFT JOIN `vrfs` AS V ON `B`.`vrf_id` = `V`.`vrf_id` WHERE `B`.`device_id` = ?', [$device['device_id']]);
foreach ($peers as $value) {
$vrfId = $value['vrf_id'];
$vrfOid = $value['vrf_oid'];
$address = $value['bgpPeerIdentifier'];
if (empty($bgpPeers[$vrfOid][$address])) {
$deleted = dbDelete('bgpPeers', 'device_id = ? AND bgpPeerIdentifier = ? AND vrf_id = ?', [$device['device_id'], $address, $vrfId]);
echo str_repeat('-', $deleted);
echo PHP_EOL;
}
}
}
unset($bgpPeers);
if (key_exists('vrf_lite_cisco', $device) && (count($device['vrf_lite_cisco'])!=0)) {
$vrfs_lite_cisco = $device['vrf_lite_cisco'];
} else {

View File

@@ -149,6 +149,7 @@ if (Config::get('enable_vrfs')) {
foreach ($vrtr as $vrf_oid => $vr) {
$vrf_name = $vr['vRtrName'];
$vrf_desc = $vr['vRtrName'];
$vrf_as = $vr['vRtrAS4Byte'];
$vrf_rd = $vr['vRtrRouteDistinguisher'];
// Nokia, The VPRN route distinguisher is a 8-octet object.
// It contains a 2-octet type field followed by a 6-octet value field. The type field specify how to interpret the value field.
@@ -169,10 +170,19 @@ if (Config::get('enable_vrfs')) {
echo "\n [VRF $vrf_name] RD - $vrf_rd";
echo "\n [VRF $vrf_name] DESC - $vrf_desc";
$vrfs = [
'vrf_oid' => $vrf_oid,
'vrf_name' => $vrf_name,
'bgpLocalAs' => $vrf_as,
'mplsVpnVrfRouteDistinguisher' => $vrf_rd,
'mplsVpnVrfDescription' => $$vrf_desc,
'device_id' => $device['device_id'],
];
if (dbFetchCell('SELECT COUNT(*) FROM vrfs WHERE device_id = ? AND `vrf_oid`=?', [$device['device_id'], $vrf_oid])) {
dbUpdate(['mplsVpnVrfDescription' => $vrf_desc, 'mplsVpnVrfRouteDistinguisher' => $vrf_rd], 'vrfs', 'device_id=? AND vrf_oid=?', [$device['device_id'], $vrf_oid]);
dbUpdate(['vrf_name' => $vrf_name, 'bgpLocalAs' => $vrf_as, 'mplsVpnVrfRouteDistinguisher' => $vrf_rd, 'mplsVpnVrfDescription' => $vrf_desc], 'vrfs', 'device_id=? AND vrf_oid=?', [$device['device_id'], $vrf_oid]);
} else {
dbInsert(['vrf_oid' => $vrf_oid, 'vrf_name' => $vrf_name, 'mplsVpnVrfRouteDistinguisher' => $vrf_rd, 'mplsVpnVrfDescription' => $$vrf_desc, 'device_id' => $device['device_id']], 'vrfs');
dbInsert($vrfs, 'vrfs');
}
$vrf_id = dbFetchCell('SELECT vrf_id FROM vrfs WHERE device_id = ? AND `vrf_oid`=?', [$device['device_id'], $vrf_oid]);