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
*******************************************

Reply via email to