Skip to end of banner
Go to start of banner

DRAFT - Perl Net::SNMP Error: Time synchronization failed during discovery

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 9 Next »

While working with SNMPv3 with a specific SNMP agent, we encountered problems with SNMPv3 “Time syncronization”, some research determined that this error could be ignored at the users peril, so modifying the Net::SNMP Perl library could workaround this problem.
If you encounter the 'Time synchronization failed during discovery' error using the perl Net::SNMP library there may be a fairly easy work around.  It may be as easy as editing the Net::SNMP module to not invoke this error.  The following advice should be executed as root.
The following was done with the Net::SNMP Version 6.0.1 package.  If this library is upgraded, this patch may need to be reapplied.

Find Net::SNMP

In order to find where Net::SNMP is on the subject system issue the following command.

# find /usr/ -type f -path "*/Net/SNMP.pm"
/usr/local/share/perl5/Net/SNMP.pm
/usr/share/perl5/Net/SNMP.pm

If you are unfortunate as in the above example, two SNMP.pm files may be returned.  In order to determine which one perl is invoking use the perl -V command.

# perl -V | grep -A 30 @INC
  @INC:
    /usr/local/lib64/perl5
    /usr/local/share/perl5
    /usr/lib64/perl5/vendor_perl
    /usr/share/perl5/vendor_perl
    /usr/lib64/perl5
    /usr/share/perl5
    .
# 

The @INC array is a list of directories that perl looks in to find modules.  This is a top down, first match find operation.  Based on this the version in /usr/local/share/perl5/Net will be utilized because it will be found first.

Edit Net::SNMP

Always make a backup of a module prior to editing it.  In order to prevent Net::SNMP from failing due to this error we edited it in the following fashion.

SNMP.pm v5.2.0
2544    if (($this->{_security}->discovered) &&
2545        ($this->{_error} =~ /usmStatsNotInTimeWindows/))
2546    {
2547       $this->_error_clear;
2548 
2549       DEBUG_INFO('discovery and synchronization complete');
2550 
2551       # Discovery is complete, send any pending messages
2552       while (my $q = shift(@{$this->{_discovery_queue}})) {
2553          $DISPATCHER->send_pdu(@{$q});
2554       }
2555 
2556       return TRUE;
2557    }
2558 
2559    # If we received the usmStatsNotInTimeWindows report or no error, but 
2560    # we are still not synchronized, provide a generic error message.
2561 
2562    if ((!$this->{_error}) || ($this->{_error} =~ /usmStatsNotInTimeWindows/)) {
2563       $this->_error_clear;
2564       $this->_error('Time synchronization failed during discovery');
2565    }
  • No labels