Send Netdot-devel mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
https://osl.uoregon.edu/mailman/listinfo/netdot-devel
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Netdot-devel digest..."
Today's Topics:
1. [SCM] Netdot branch netdot-1.0 updated.
netdot-1.0.4-41-gb50c577 ([email protected])
----------------------------------------------------------------------
Message: 1
Date: Sun, 3 Mar 2013 11:12:53 -0800
From: [email protected]
Subject: [Netdot-devel] [SCM] Netdot branch netdot-1.0 updated.
netdot-1.0.4-41-gb50c577
To: [email protected]
Message-ID: <[email protected]>
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Netdot".
The branch, netdot-1.0 has been updated
via b50c577fbe3a42c747436388b73e620202561726 (commit)
from 6ef6f307e00ad8f04b61c678cb6d8e0f942edf85 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit b50c577fbe3a42c747436388b73e620202561726
Author: Carlos Vicente <[email protected]>
Date: Sun Mar 3 14:12:45 2013 -0500
Introduced checks to avoid removing all BGP peerings if SNMP data is
missing or truncated
diff --git a/lib/Netdot/Model/Device.pm b/lib/Netdot/Model/Device.pm
index 0b0d138..50db3d8 100644
--- a/lib/Netdot/Model/Device.pm
+++ b/lib/Netdot/Model/Device.pm
@@ -925,10 +925,10 @@ sub get_snmp_info {
}
}
- # Set some defaults specific to device types
+ # Set some values specific to device types
if ( $dev{ipforwarding} ){
- $dev{bgplocalas} = $sinfo->bgp_local_as();
- $dev{bgpid} = $sinfo->bgp_id();
+ $dev{bgplocalas} = $sinfo->bgp_local_as();
+ $dev{bgpid} = $sinfo->bgp_id();
}
################################################################
@@ -990,7 +990,6 @@ sub get_snmp_info {
}
}
}
-
}
@@ -1185,20 +1184,20 @@ sub get_snmp_info {
##############################################
# for each BGP Peer discovered...
foreach my $peer ( keys %{$hashes{'bgp_peers'}} ) {
- $dev{bgppeer}{$peer}{address} = $peer;
- unless ( $dev{bgppeer}{$peer}{bgppeerid} =
$hashes{'bgp_peer_id'}->{$peer} ){
+ $dev{bgp_peer}{$peer}{address} = $peer;
+ unless ( $dev{bgp_peer}{$peer}{bgppeerid} =
$hashes{'bgp_peer_id'}->{$peer} ){
$logger->warn("Could not determine BGP peer id of peer $peer");
}
if ( my $asn = $hashes{'bgp_peer_as'}->{$peer} ){
- $dev{bgppeer}{$peer}{asnumber} = $asn;
- $dev{bgppeer}{$peer}{asname} = "AS $asn";
- $dev{bgppeer}{$peer}{orgname} = "AS $asn";
+ $dev{bgp_peer}{$peer}{asnumber} = $asn;
+ $dev{bgp_peer}{$peer}{asname} = "AS $asn";
+ $dev{bgp_peer}{$peer}{orgname} = "AS $asn";
if ( Netdot->config->get('DO_WHOISQ') ){
# We enabled whois queries in config
if ( my $as_info = $self->_get_as_info($asn) ){
- $dev{bgppeer}{$peer}{asname} = $as_info->{asname};
- $dev{bgppeer}{$peer}{orgname} = $as_info->{orgname};
+ $dev{bgp_peer}{$peer}{asname} = $as_info->{asname};
+ $dev{bgp_peer}{$peer}{orgname} = $as_info->{orgname};
}
}
}else{
@@ -2548,25 +2547,25 @@ sub update {
asnumber
orgname
bgppeerid
- oldpeerings - Hash ref containing old peering objects
+ old_peerings - Hash ref containing old peering objects
Returns:
BGPPeering object or undef if error
Example:
- foreach my $peer ( keys %{$info->{bgppeer}} ){
- $self->update_bgp_peering(peer => $info->{bgppeer}->{$peer},
- oldpeerings => \%oldpeerings);
+ foreach my $peer ( keys %{$info->{bgp_peer}} ){
+ $self->update_bgp_peering(peer => $info->{bgp_peer}->{$peer},
+ old_peerings => \%old_peerings);
}
=cut
sub update_bgp_peering {
my ($self, %argv) = @_;
- my ($peer, $oldpeerings) = @argv{"peer", "oldpeerings"};
+ my ($peer, $old_peerings) = @argv{"peer", "old_peerings"};
$self->isa_object_method('update_bgp_peering');
$self->throw_fatal('Model::Device::update_bgp_peering: '.
- 'Missing required arguments: peer, oldpeerings')
- unless ( $peer && $oldpeerings );
+ 'Missing required arguments: peer, old_peerings')
+ unless ( $peer && $old_peerings );
my $host = $self->fqdn;
my $p; # bgppeering object
@@ -2630,16 +2629,16 @@ sub update_bgp_peering {
bgppeeraddr => $peer->{address});
# Check if peering exists
- foreach my $peerid ( keys %{ $oldpeerings } ){
+ foreach my $peerid ( keys %{ $old_peerings } ){
- my $oldpeer = $oldpeerings->{$peerid};
- if ( $oldpeer->bgppeeraddr eq $peer->{address} ){
+ my $old_peer = $old_peerings->{$peerid};
+ if ( $old_peer->bgppeeraddr eq $peer->{address} ){
# Peering Exists.
- $p = $oldpeer;
+ $p = $old_peer;
# Delete from list of old peerings
- delete $oldpeerings->{$peerid};
+ delete $old_peerings->{$peerid};
last;
}
}
@@ -2980,7 +2979,10 @@ sub info_update {
$argv{bgp_peers} : $self->config->get('ADD_BGP_PEERS');
if ( $update_bgp ){
- $self->_update_bgp_info($info, \%devtmp);
+ $self->_update_bgp_info(bgp_local_as => $info->{bgplocalas},
+ bgp_id => $info->{bgpid},
+ peers => $info->{bgp_peer},
+ newdev => \%devtmp);
}
##############################################################
@@ -6001,42 +6003,70 @@ sub _update_interfaces {
# Add/Update/Delete BGP Peerings
#
# Arguments
-# snmp info hashref
-# Device object arguments hashref
+# Hash with following keys:
+# bgp_local_as - Local AS to this device
+# bgp_id - BGP ID of this device
+# peers - Hashref of peering info
+# newdev - Device object arguments hashref
# Returns
# Nothing
#
sub _update_bgp_info {
- my ($self, $info, $devtmp) = @_;
+ my ($self, %argv) = @_;
my $host = $self->fqdn;
+ my $devtmp = $argv{newdev};
# Set Local BGP info
- if( defined $info->{bgplocalas} ){
- $logger->debug(sub{ sprintf("%s: BGP Local AS is %s", $host,
$info->{bgplocalas}) });
- $devtmp->{bgplocalas} = $info->{bgplocalas};
+ if( defined $argv{bgp_local_as} ){
+ $logger->debug(sub{ sprintf("%s: BGP Local AS is %s", $host,
$argv{bgp_local_as}) });
+ $devtmp->{bgplocalas} = $argv{bgp_local_as};
}
- if( defined $info->{bgpid} ){
- $logger->debug(sub{ sprintf("%s: BGP ID is %s", $host,
$info->{bgpid})});
- $devtmp->{bgpid} = $info->{bgpid};
+ if( defined $argv{bgp_id} ){
+ $logger->debug(sub{ sprintf("%s: BGP ID is %s", $host, $argv{bgp_id})});
+ $devtmp->{bgpid} = $argv{bgp_id};
}
# Get current BGP peerings
#
- my %oldpeerings;
- map { $oldpeerings{ $_->id } = $_ } $self->bgppeers();
+ my %old_peerings;
+ map { $old_peerings{ $_->id } = $_ } $self->bgppeers();
+ if ( $ENV{REMOTE_USER} eq 'netdot' ){
+
+ # Avoid deleting all peerings in cases where we fail to fetch the SNMP
data
+ # We compare the number of old and the number of new, and stop if
+ # the difference is > threshold. We only do this if the user is 'netdot'
+ # to allow a real user to manually update it
+
+ my $p_old = scalar(keys(%old_peerings));
+ my $p_new = scalar(keys(%{$argv{peers}}));
+
+ $logger->debug("$host: Old peerings: $p_old, New peerings: $p_new");
+
+ # Threshold hard set for now
+ my $p_thold = 0.5;
+
+ if ( ($p_old && !$p_new) || ($p_new && ($p_new < $p_old) &&
+ ($p_new / $p_old) <= $p_thold) ){
+ $logger->warn(sprintf("%s: new/old interface ratio: %.2f is below
threshold (%s) ".
+ "Skipping BGP peerings update. Re-discover
manually if needed.",
+ $host, $p_new/$p_old, $p_thold));
+ return;
+ }
+ }
+
# Update BGP Peerings
#
- foreach my $peer ( keys %{$info->{bgppeer}} ){
- $self->update_bgp_peering(peer => $info->{bgppeer}->{$peer},
- oldpeerings => \%oldpeerings);
+ foreach my $peer ( keys %{$argv{peers}} ){
+ $self->update_bgp_peering(peer => $argv{peers}->{$peer},
+ old_peerings => \%old_peerings);
}
# remove each BGP Peering that no longer exists
#
- foreach my $peerid ( keys %oldpeerings ) {
- my $p = $oldpeerings{$peerid};
+ foreach my $peerid ( keys %old_peerings ) {
+ my $p = $old_peerings{$peerid};
$logger->info(sprintf("%s: BGP Peering with %s (%s) no longer exists.
Removing.",
$host, $p->entity->name, $p->bgppeeraddr));
$p->delete();
-----------------------------------------------------------------------
Summary of changes:
lib/Netdot/Model/Device.pm | 110 ++++++++++++++++++++++++++++----------------
1 files changed, 70 insertions(+), 40 deletions(-)
hooks/post-receive
--
Netdot
------------------------------
_______________________________________________
Netdot-devel mailing list
[email protected]
https://osl.uoregon.edu/mailman/listinfo/netdot-devel
End of Netdot-devel Digest, Vol 72, Issue 1
*******************************************