mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
Fix bgp peers discovery cleanup (#8263)
Take context into account, update index for that
This commit is contained in:
@@ -8,7 +8,7 @@ if (Config::get('enable_bgp')) {
|
|||||||
if (key_exists('vrf_lite_cisco', $device) && (count($device['vrf_lite_cisco'])!=0)) {
|
if (key_exists('vrf_lite_cisco', $device) && (count($device['vrf_lite_cisco'])!=0)) {
|
||||||
$vrfs_lite_cisco = $device['vrf_lite_cisco'];
|
$vrfs_lite_cisco = $device['vrf_lite_cisco'];
|
||||||
} else {
|
} else {
|
||||||
$vrfs_lite_cisco = array(array('context_name'=>null));
|
$vrfs_lite_cisco = array(array('context_name'=>''));
|
||||||
}
|
}
|
||||||
|
|
||||||
$bgpLocalAs = snmp_getnext($device, 'bgpLocalAs', '-Oqvn', 'BGP4-MIB');
|
$bgpLocalAs = snmp_getnext($device, 'bgpLocalAs', '-Oqvn', 'BGP4-MIB');
|
||||||
@@ -125,12 +125,16 @@ if (Config::get('enable_bgp')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$af_query = "SELECT bgpPeerIdentifier, afi, safi FROM bgpPeers_cbgp WHERE `device_id` = '".$device['device_id']."' AND bgpPeerIdentifier = '".$peer['ip']."'";
|
$af_query = "SELECT bgpPeerIdentifier, afi, safi FROM bgpPeers_cbgp WHERE `device_id`=? AND bgpPeerIdentifier=? AND context_name=?";
|
||||||
foreach (dbFetchRows($af_query) as $entry) {
|
foreach (dbFetchRows($af_query, [$device['device_id'], $peer['ip'], $device['context_name']]) as $entry) {
|
||||||
$afi = $entry['afi'];
|
$afi = $entry['afi'];
|
||||||
$safi = $entry['safi'];
|
$safi = $entry['safi'];
|
||||||
if (!$af_list[$entry['bgpPeerIdentifier']][$afi][$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));
|
dbDelete(
|
||||||
|
'bgpPeers_cbgp',
|
||||||
|
'`device_id`=? AND `bgpPeerIdentifier`=? AND context_name=? AND afi=? AND safi=?',
|
||||||
|
[$device['device_id'], $peer['ip'], $device['context_name'], $afi, $safi]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,9 +144,13 @@ if (Config::get('enable_bgp')) {
|
|||||||
unset($j_peerIndexes);
|
unset($j_peerIndexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
$params = array_column($peerlist, 'ip');
|
// clean up peers
|
||||||
$query = 'device_id=? AND bgpPeerIdentifier NOT IN ' . dbGenPlaceholders(count($params));
|
$params = [$device['device_id'], $device['context_name']];
|
||||||
array_unshift($params, $device['device_id']); // prepend device_id
|
$query = 'device_id=? AND context_name=?';
|
||||||
|
if (!empty($peerlist)) {
|
||||||
|
$query .= ' AND bgpPeerIdentifier NOT IN ' . dbGenPlaceholders(count($peerlist));
|
||||||
|
$params = array_merge($params, array_column($peerlist, 'ip'));
|
||||||
|
}
|
||||||
|
|
||||||
$deleted = dbDelete('bgpPeers', $query, $params);
|
$deleted = dbDelete('bgpPeers', $query, $params);
|
||||||
dbDelete('bgpPeers_cbgp', $query, $params);
|
dbDelete('bgpPeers_cbgp', $query, $params);
|
||||||
@@ -156,8 +164,27 @@ if (Config::get('enable_bgp')) {
|
|||||||
$af_data
|
$af_data
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delete unknown contexts
|
||||||
|
$contexts = dbFetchColumn(
|
||||||
|
'SELECT DISTINCT context_name FROM bgpPeers WHERE device_id=?',
|
||||||
|
[$device['device_id']]
|
||||||
|
);
|
||||||
|
$existing_contexts = array_column($vrfs_lite_cisco, 'context_name');
|
||||||
|
foreach ($contexts as $context) {
|
||||||
|
if (!in_array($context, $existing_contexts)) {
|
||||||
|
dbDelete('bgpPeers', 'device_id=? and context_name=?', [$device['device_id'], $context]);
|
||||||
|
dbDelete('bgpPeers_cbgp', 'device_id=? and context_name=?', [$device['device_id'], $context]);
|
||||||
|
echo '-';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unset(
|
unset(
|
||||||
$device['context_name'],
|
$device['context_name'],
|
||||||
|
$vrfs_lite_cisco,
|
||||||
|
$peers_data,
|
||||||
|
$af_data,
|
||||||
|
$contexts,
|
||||||
$vrfs_c
|
$vrfs_c
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ bgpPeers:
|
|||||||
- { Field: context_name, Type: varchar(128), 'Null': true, Extra: '' }
|
- { Field: context_name, Type: varchar(128), 'Null': true, Extra: '' }
|
||||||
Indexes:
|
Indexes:
|
||||||
PRIMARY: { Name: PRIMARY, Columns: [bgpPeer_id], Unique: true, Type: BTREE }
|
PRIMARY: { Name: PRIMARY, Columns: [bgpPeer_id], Unique: true, Type: BTREE }
|
||||||
device_id: { Name: device_id, Columns: [device_id], Unique: false, Type: BTREE }
|
device_id: { Name: device_id, Columns: [device_id, context_name], Unique: false, Type: BTREE }
|
||||||
bgpPeers_cbgp:
|
bgpPeers_cbgp:
|
||||||
Columns:
|
Columns:
|
||||||
- { Field: device_id, Type: int(11), 'Null': false, Extra: '' }
|
- { Field: device_id, Type: int(11), 'Null': false, Extra: '' }
|
||||||
@@ -198,7 +198,7 @@ bgpPeers_cbgp:
|
|||||||
- { Field: context_name, Type: varchar(128), 'Null': true, Extra: '' }
|
- { Field: context_name, Type: varchar(128), 'Null': true, Extra: '' }
|
||||||
Indexes:
|
Indexes:
|
||||||
unique_index: { Name: unique_index, Columns: [device_id, bgpPeerIdentifier, afi, safi], Unique: true, Type: BTREE }
|
unique_index: { Name: unique_index, Columns: [device_id, bgpPeerIdentifier, afi, safi], Unique: true, Type: BTREE }
|
||||||
device_id: { Name: device_id, Columns: [device_id, bgpPeerIdentifier], Unique: false, Type: BTREE }
|
device_id: { Name: device_id, Columns: [device_id, bgpPeerIdentifier, context_name], Unique: false, Type: BTREE }
|
||||||
bills:
|
bills:
|
||||||
Columns:
|
Columns:
|
||||||
- { Field: bill_id, Type: int(11), 'Null': false, Extra: auto_increment }
|
- { Field: bill_id, Type: int(11), 'Null': false, Extra: auto_increment }
|
||||||
|
|||||||
4
sql-schema/236.sql
Normal file
4
sql-schema/236.sql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
DROP INDEX device_id ON bgpPeers;
|
||||||
|
CREATE INDEX device_id ON bgpPeers (device_id, context_name);
|
||||||
|
DROP INDEX device_id ON bgpPeers_cbgp;
|
||||||
|
CREATE INDEX device_id ON bgpPeers_cbgp (device_id, bgpPeerIdentifier, context_name);
|
||||||
Reference in New Issue
Block a user