Perl Net::SNMP Error: Time synchronization failed during discovery
- While working with SNMPv3 with a specific SNMP agent, we encountered problems with SNMPv3 “Time synchronization”, some research determined that this error could be ignored, 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
We were able to get the agent to work by doing the following:
- Commenting out part of the if statement on line 2545. (The if statement will need to be re-written)
- Commenting out lines 2562 through 2565.
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 }