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