C 497 дня (4-миллиарда timeticks) обновляется значение Uptime при опросе sysUpTime (DISMAN-EVENT-MIB::sysUpTimeInstance или .1.3.6.1.6.3.10.2.1.3). Такое поведение аналогично на всех устройствах, включая Cisco. 64-битного счетчика timeticks (1/100 секунды), по аналогии с Counter64, пока не существует. Для Cisco, Alcatel и многих других устройств (даже ZTE, но не D-Link) есть альтернатива – опрашивать количество секунд со старта (не epoch seconds) (SNMP-FRAMEWORK-MIB::snmpEngineTime или .1.3.6.1.2.1.1.3.0) и конвертировать во время самостоятельно скриптом.
$ snmpwalk -v 2c -Cc -c xxx 11.22.33.44 .1.3.6.1.6.3.10.2.1.3 SNMP-FRAMEWORK-MIB::snmpEngineTime.0 = INTEGER: 48842811 seconds $ snmpwalk -v 2c -Cc -c xxx 11.22.33.44 .1.3.6.1.2.1.1.3.0 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (589314318) 68 days, 4:59:03.18
В таком случае переполнение счетчика >4млрд произойдет только через 135 лет. Получается, точность немного хуже, но кейсов необходимости точности в 1/100 секунды (10 мс), имхо, не много. В целом Cisco рекомендует опрашивать и то, и то, а потом добивать в значение seconds значение последних двух цифр из timeticks.
Currently, IOS based devices rely on RFC1213's sysUpTime which is a 32 bit counter in 1/100 second and wraps around every 496 days. This makes it difficult to tell how long the device has been up if the counter has rolled over. Workarounds: The uptime value in the show version output is accurate even after 496 days. Routers running 12.0(3)T or higher can also use the snmpEngineTime object from the SNMP-FRAMEWORK-MIB. This object keeps track of seconds since the SNMP engine started. While not as granular as sysUpTime, it will not roll over for 135 years. By polling both sysUpTime and snmpEngineTime together, then taking the full value of sysUpTime and combining it with the additional two digits from snmpEngineTime, one can gain additional granularity. Note, if sysUpTime is polled right during roll-over, time will change +/- one year."
Для устройств без счетчика в секундах (привет, D-Link!) нужно придумывать костыли, например, выгружать дату загрузки через заход по telnet/ssh и чтобы получить аптайм вычитать из текущей даты выгруженную.
fun_uptime_days_exp () { #static date=`date -d "24 Oct 2017" "+%s"` date=$(exp_get_bootdate $1 | grep "Boot Time" | awk '{print $5,$6,$7}') date=`date -d "$date" "+%s"` curdate=`date "+%s"` diff=$(($curdate-$date)) days=$(($diff/(60*60*24))) echo "$days" }