diff --git a/Netdisco/Changes b/Netdisco/Changes index 891967dc..6a6cecb1 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -7,6 +7,7 @@ [BUG FIXES] * Subnets report date range fixed, but (unnecessary?) "not" option removed + * Track how many times the device uptime wrapped (F. Schiavarelli) 2.027008_001 - 2014-06-23 diff --git a/Netdisco/lib/App/Netdisco/Core/Discover.pm b/Netdisco/lib/App/Netdisco/Core/Discover.pm index bfe790b8..0ca20078 100644 --- a/Netdisco/lib/App/Netdisco/Core/Discover.pm +++ b/Netdisco/lib/App/Netdisco/Core/Discover.pm @@ -216,9 +216,20 @@ sub store_interfaces { # clear the cached uptime and get a new one my $dev_uptime = $snmp->load_uptime; - # used to track whether we've wrapped the device uptime + # used to track how many times the device uptime wrapped my $dev_uptime_wrapped = 0; + # use SNMP-FRAMEWORK-MIB::snmpEngineTime if available to + # fix device uptime if wrapped + if (defined $snmp->snmpEngineTime) { + $dev_uptime_wrapped = int( $snmp->snmpEngineTime * 100 / 2**32 ); + if ($dev_uptime_wrapped > 0) { + info sprintf ' [%s] interface - device uptime wrapped %d times - correcting', + $device->ip, $dev_uptime_wrapped; + $device->uptime( $dev_uptime + $dev_uptime_wrapped * 2**32 ); + } + } + # build device interfaces suitable for DBIC my %interfaces; foreach my $entry (keys %$interfaces) { @@ -264,7 +275,7 @@ sub store_interfaces { debug sprintf ' [%s] interfaces - correcting LastChange for %s, assuming sysUptime wrap', $device->ip, $port; - $lc += 2**32; + $lc += $dev_uptime_wrapped * 2**32; } } }