From 5b6a6b3c1e2de675adcf60c18fcf0c3a59fdd98f Mon Sep 17 00:00:00 2001 From: qgarnier Date: Fri, 21 Jul 2017 11:23:14 +0200 Subject: [PATCH] add an option to manage uptime overload --- .../network/adva/fsp3000/snmp/plugin.pm | 1 + .../network/huawei/snmp/plugin.pm | 1 + .../network/nokia/timos/snmp/plugin.pm | 1 + centreon-plugins/snmp_standard/mode/uptime.pm | 58 ++++++++++++++++--- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/centreon-plugins/network/adva/fsp3000/snmp/plugin.pm b/centreon-plugins/network/adva/fsp3000/snmp/plugin.pm index 192c5bcce..ffb1ceac5 100644 --- a/centreon-plugins/network/adva/fsp3000/snmp/plugin.pm +++ b/centreon-plugins/network/adva/fsp3000/snmp/plugin.pm @@ -35,6 +35,7 @@ sub new { 'interfaces' => 'network::adva::fsp3000::snmp::mode::interfaces', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'memory' => 'snmp_standard::mode::memory', + 'uptime' => 'snmp_standard::mode::uptime', ); return $self; diff --git a/centreon-plugins/network/huawei/snmp/plugin.pm b/centreon-plugins/network/huawei/snmp/plugin.pm index 3cc311585..3289100c7 100644 --- a/centreon-plugins/network/huawei/snmp/plugin.pm +++ b/centreon-plugins/network/huawei/snmp/plugin.pm @@ -35,6 +35,7 @@ sub new { 'interfaces' => 'snmp_standard::mode::interfaces', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'memory' => 'network::huawei::snmp::mode::memory', + 'uptime' => 'snmp_standard::mode::uptime', ); return $self; diff --git a/centreon-plugins/network/nokia/timos/snmp/plugin.pm b/centreon-plugins/network/nokia/timos/snmp/plugin.pm index 41a839324..5768ed9fa 100644 --- a/centreon-plugins/network/nokia/timos/snmp/plugin.pm +++ b/centreon-plugins/network/nokia/timos/snmp/plugin.pm @@ -36,6 +36,7 @@ sub new { 'interfaces' => 'snmp_standard::mode::interfaces', 'list-interfaces' => 'snmp_standard::mode::listinterfaces', 'memory' => 'network::nokia::timos::snmp::mode::memory', + 'uptime' => 'snmp_standard::mode::uptime', ); return $self; diff --git a/centreon-plugins/snmp_standard/mode/uptime.pm b/centreon-plugins/snmp_standard/mode/uptime.pm index 7f5a2778c..e4a26deaf 100644 --- a/centreon-plugins/snmp_standard/mode/uptime.pm +++ b/centreon-plugins/snmp_standard/mode/uptime.pm @@ -26,6 +26,8 @@ use strict; use warnings; use POSIX; use centreon::plugins::misc; +use centreon::plugins::statefile; +use Time::HiRes qw(time); sub new { my ($class, %options) = @_; @@ -35,11 +37,13 @@ sub new { $self->{version} = '1.0'; $options{options}->add_options(arguments => { - "warning:s" => { name => 'warning', }, - "critical:s" => { name => 'critical', }, - "force-oid:s" => { name => 'force_oid', }, + "warning:s" => { name => 'warning' }, + "critical:s" => { name => 'critical' }, + "force-oid:s" => { name => 'force_oid' }, + "check-overload" => { name => 'check_overload' }, }); - + + $self->{statefile_cache} = centreon::plugins::statefile->new(%options); return $self; } @@ -55,6 +59,38 @@ sub check_options { $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); $self->{output}->option_exit(); } + + $self->{statefile_cache}->check_options(%options); +} + +sub check_overload { + my ($self, %options) = @_; + + return $options{timeticks} if (!defined($self->{option_results}->{check_overload})); + + my $current_time = floor(time() * 100); + $self->{new_datas} = { last_time => $current_time, uptime => $options{timeticks}, overload => 0 }; + $self->{statefile_cache}->read(statefile => "cache_" . $self->{snmp}->get_hostname() . '_' . $self->{snmp}->get_port() . '_' . $self->{mode}); + my $old_uptime = $self->{statefile_cache}->get(name => 'uptime'); + my $last_time = $self->{statefile_cache}->get(name => 'last_time'); + my $overload = $self->{statefile_cache}->get(name => 'overload'); + + if (defined($old_uptime) && $old_uptime < $current_time) { + my $diff_time = $current_time - $last_time; + my $overflow = ($old_uptime + $diff_time) % 4294967296; + my $division = ($old_uptime + $diff_time) / 4294967296; + if ($division >= 1 && + $overflow >= ($options{timeticks} - 5000) && + $overflow <= ($options{timeticks} + 5000)) { + $overload++; + } + + $options{timeticks} += ($overload * 4294967296); + } + $self->{new_datas}->{overload} = $overload if (defined($overload)); + + $self->{statefile_cache}->write(data => $self->{new_datas}); + return $options{timeticks}; } sub run { @@ -79,17 +115,20 @@ sub run { } } - my $exit_code = $self->{perfdata}->threshold_check(value => floor($value / 100), + $value = $self->check_overload(timeticks => $value); + $value = floor($value / 100); + + my $exit_code = $self->{perfdata}->threshold_check(value => $value, threshold => [ { label => 'critical', exit_litteral => 'critical' }, { label => 'warning', exit_litteral => 'warning' } ]); $self->{output}->perfdata_add(label => 'uptime', unit => 's', - value => floor($value / 100), + value => $value, warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning'), critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical'), min => 0); $self->{output}->output_add(severity => $exit_code, short_msg => sprintf("System uptime is: %s", - centreon::plugins::misc::change_seconds(value => floor($value / 100), start => 'd'))); + centreon::plugins::misc::change_seconds(value => $value, start => 'd'))); $self->{output}->display(); $self->{output}->exit(); @@ -117,6 +156,11 @@ Threshold critical in seconds. Can choose your oid (numeric format only). +=item B<--check-overload> + +Uptime counter limit is 4294967296 and overflow. +With that option, we manage the counter going back. But there is a few chance we can miss a reboot. + =back =cut