New upstream version 2.3
This commit is contained in:
parent
c845af032a
commit
5c6ba24b61
129 changed files with 14313 additions and 2999 deletions
|
@ -16,11 +16,13 @@ VPATH=$(top_srcdir) $(top_srcdir)/plugins-scripts $(top_srcdir)/plugins-scripts/
|
|||
libexec_SCRIPTS = check_breeze check_disk_smb check_flexlm check_ircd \
|
||||
check_log check_oracle check_rpc check_sensors check_wave \
|
||||
check_ifstatus check_ifoperstatus check_mailq check_file_age \
|
||||
check_uptime \
|
||||
utils.sh utils.pm
|
||||
|
||||
EXTRA_DIST=check_breeze.pl check_disk_smb.pl check_flexlm.pl check_ircd.pl \
|
||||
check_log.sh check_oracle.sh check_rpc.pl check_sensors.sh \
|
||||
check_ifstatus.pl check_ifoperstatus.pl check_wave.pl check_mailq.pl check_file_age.pl \
|
||||
check_uptime.pl \
|
||||
utils.sh.in utils.pm.in t
|
||||
|
||||
EDIT = sed \
|
||||
|
|
|
@ -53,8 +53,10 @@ subdir = plugins-scripts
|
|||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
||||
$(srcdir)/utils.pm.in $(srcdir)/utils.sh.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/np_mysqlclient.m4 \
|
||||
$(top_srcdir)/gl/m4/00gnulib.m4 $(top_srcdir)/gl/m4/alloca.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/libcurl.m4 \
|
||||
$(top_srcdir)/m4/np_mysqlclient.m4 \
|
||||
$(top_srcdir)/m4/uriparser.m4 $(top_srcdir)/gl/m4/00gnulib.m4 \
|
||||
$(top_srcdir)/gl/m4/alloca.m4 \
|
||||
$(top_srcdir)/gl/m4/arpa_inet_h.m4 \
|
||||
$(top_srcdir)/gl/m4/base64.m4 $(top_srcdir)/gl/m4/btowc.m4 \
|
||||
$(top_srcdir)/gl/m4/codeset.m4 \
|
||||
|
@ -910,6 +912,11 @@ LD = @LD@
|
|||
LDAPINCLUDE = @LDAPINCLUDE@
|
||||
LDAPLIBS = @LDAPLIBS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBCURL = @LIBCURL@
|
||||
LIBCURLCFLAGS = @LIBCURLCFLAGS@
|
||||
LIBCURLINCLUDE = @LIBCURLINCLUDE@
|
||||
LIBCURLLIBS = @LIBCURLLIBS@
|
||||
LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
|
||||
LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
|
||||
LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
|
||||
LIBICONV = @LIBICONV@
|
||||
|
@ -1035,6 +1042,7 @@ PERL = @PERL@
|
|||
PERLMODS_DIR = @PERLMODS_DIR@
|
||||
PGINCLUDE = @PGINCLUDE@
|
||||
PGLIBS = @PGLIBS@
|
||||
PKGCONFIG = @PKGCONFIG@
|
||||
PKG_ARCH = @PKG_ARCH@
|
||||
PLUGIN_TEST = @PLUGIN_TEST@
|
||||
POSUB = @POSUB@
|
||||
|
@ -1252,6 +1260,11 @@ TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
|
|||
UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
|
||||
UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
|
||||
UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
|
||||
URIPARSER = @URIPARSER@
|
||||
URIPARSERCFLAGS = @URIPARSERCFLAGS@
|
||||
URIPARSERINCLUDE = @URIPARSERINCLUDE@
|
||||
URIPARSERLIBS = @URIPARSERLIBS@
|
||||
URIPARSER_CPPFLAGS = @URIPARSER_CPPFLAGS@
|
||||
USE_NLS = @USE_NLS@
|
||||
VERSION = @VERSION@
|
||||
WARRANTY = @WARRANTY@
|
||||
|
@ -1262,6 +1275,7 @@ WTSAPI32LIBS = @WTSAPI32LIBS@
|
|||
XGETTEXT = @XGETTEXT@
|
||||
XGETTEXT_015 = @XGETTEXT_015@
|
||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
||||
_libcurl_config = @_libcurl_config@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
|
@ -1328,11 +1342,13 @@ SUFFIXES = .pl .sh
|
|||
libexec_SCRIPTS = check_breeze check_disk_smb check_flexlm check_ircd \
|
||||
check_log check_oracle check_rpc check_sensors check_wave \
|
||||
check_ifstatus check_ifoperstatus check_mailq check_file_age \
|
||||
check_uptime \
|
||||
utils.sh utils.pm
|
||||
|
||||
EXTRA_DIST = check_breeze.pl check_disk_smb.pl check_flexlm.pl check_ircd.pl \
|
||||
check_log.sh check_oracle.sh check_rpc.pl check_sensors.sh \
|
||||
check_ifstatus.pl check_ifoperstatus.pl check_wave.pl check_mailq.pl check_file_age.pl \
|
||||
check_uptime.pl \
|
||||
utils.sh.in utils.pm.in t
|
||||
|
||||
EDIT = sed \
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#
|
||||
|
||||
require 5.004;
|
||||
use POSIX;
|
||||
use POSIX qw(setsid);
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use vars qw($opt_P $opt_V $opt_h $opt_H $opt_s $opt_W $opt_u $opt_p $opt_w $opt_c $opt_a $verbose);
|
||||
|
@ -28,6 +28,9 @@ use FindBin;
|
|||
use lib "$FindBin::Bin";
|
||||
use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);
|
||||
|
||||
# make us session leader which makes all childs exit if we do
|
||||
setsid;
|
||||
|
||||
sub print_help ();
|
||||
sub print_usage ();
|
||||
|
||||
|
@ -175,6 +178,8 @@ my @lines = undef;
|
|||
# Just in case of problems, let's not hang the monitoring system
|
||||
$SIG{'ALRM'} = sub {
|
||||
print "No Answer from Client\n";
|
||||
$SIG{'INT'} = 'IGNORE';
|
||||
kill(-2, $$);
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
};
|
||||
alarm($TIMEOUT);
|
||||
|
|
|
@ -43,8 +43,6 @@ $ENV{'ENV'}='';
|
|||
|
||||
$opt_w = 240;
|
||||
$opt_c = 600;
|
||||
$opt_W = 0;
|
||||
$opt_C = 0;
|
||||
$opt_f = "";
|
||||
|
||||
Getopt::Long::Configure('bundling');
|
||||
|
@ -53,10 +51,10 @@ GetOptions(
|
|||
"h" => \$opt_h, "help" => \$opt_h,
|
||||
"i" => \$opt_i, "ignore-missing" => \$opt_i,
|
||||
"f=s" => \$opt_f, "file" => \$opt_f,
|
||||
"w=f" => \$opt_w, "warning-age=f" => \$opt_w,
|
||||
"W=f" => \$opt_W, "warning-size=f" => \$opt_W,
|
||||
"c=f" => \$opt_c, "critical-age=f" => \$opt_c,
|
||||
"C=f" => \$opt_C, "critical-size=f" => \$opt_C);
|
||||
"w=s" => \$opt_w, "warning-age=s" => \$opt_w,
|
||||
"W=s" => \$opt_W, "warning-size=s" => \$opt_W,
|
||||
"c=s" => \$opt_c, "critical-age=s" => \$opt_c,
|
||||
"C=s" => \$opt_C, "critical-size=s" => \$opt_C);
|
||||
|
||||
if ($opt_V) {
|
||||
print_revision($PROGNAME, '@NP_VERSION@');
|
||||
|
@ -91,18 +89,47 @@ unless (-e $opt_f) {
|
|||
$st = File::stat::stat($opt_f);
|
||||
$age = time - $st->mtime;
|
||||
$size = $st->size;
|
||||
$perfdata = "age=${age}s;${opt_w};${opt_c} size=${size}B;${opt_W};${opt_C};0";
|
||||
|
||||
|
||||
$result = 'OK';
|
||||
|
||||
if (($opt_c and $age > $opt_c) or ($opt_C and $size < $opt_C)) {
|
||||
$result = 'CRITICAL';
|
||||
if ($opt_c !~ m/^\d+$/ or ($opt_C and $opt_C !~ m/^\d+$/)
|
||||
or $opt_w !~ m/^\d+$/ or ($opt_W and $opt_W !~ m/^\d+$/)) {
|
||||
# range has been specified so use M::P::R to process
|
||||
require Monitoring::Plugin::Range;
|
||||
# use permissive range defaults for size when none specified
|
||||
$opt_W = "0:" unless ($opt_W);
|
||||
$opt_C = "0:" unless ($opt_C);
|
||||
|
||||
if (Monitoring::Plugin::Range->parse_range_string($opt_c)
|
||||
->check_range($age) == 1) { # 1 means it raises an alert because it's OUTSIDE the range
|
||||
$result = 'CRITICAL';
|
||||
}
|
||||
elsif (Monitoring::Plugin::Range->parse_range_string($opt_C)
|
||||
->check_range($size) == 1) {
|
||||
$result = 'CRITICAL';
|
||||
}
|
||||
elsif (Monitoring::Plugin::Range->parse_range_string($opt_w)
|
||||
->check_range($age) == 1) {
|
||||
$result = 'WARNING';
|
||||
}
|
||||
elsif (Monitoring::Plugin::Range->parse_range_string($opt_W)
|
||||
->check_range($size) == 1) {
|
||||
$result = 'WARNING';
|
||||
}
|
||||
}
|
||||
elsif (($opt_w and $age > $opt_w) or ($opt_W and $size < $opt_W)) {
|
||||
$result = 'WARNING';
|
||||
else {
|
||||
# use permissive defaults for size when none specified
|
||||
$opt_W = 0 unless ($opt_W);
|
||||
$opt_C = 0 unless ($opt_C);
|
||||
if ($age > $opt_c or $size < $opt_C) {
|
||||
$result = 'CRITICAL';
|
||||
}
|
||||
elsif ($age > $opt_w or $size < $opt_W) {
|
||||
$result = 'WARNING';
|
||||
}
|
||||
}
|
||||
|
||||
$perfdata = "age=${age}s;${opt_w};${opt_c} size=${size}B;${opt_W};${opt_C};0";
|
||||
print "FILE_AGE $result: $opt_f is $age seconds old and $size bytes | $perfdata\n";
|
||||
exit $ERRORS{$result};
|
||||
|
||||
|
@ -120,7 +147,15 @@ sub print_help () {
|
|||
print "\n";
|
||||
print " -i | --ignore-missing : return OK if the file does not exist\n";
|
||||
print " <secs> File must be no more than this many seconds old (default: warn 240 secs, crit 600)\n";
|
||||
print " <size> File must be at least this many bytes long (default: crit 0 bytes)\n";
|
||||
print " <size> File must be at least this many bytes long (default: crit 0 bytes)\n\n";
|
||||
print " Both <secs> and <size> can specify a range using the standard plugin syntax\n";
|
||||
print " If any of the warning and critical arguments are in range syntax (not just bare numbers)\n";
|
||||
print " then all warning and critical arguments will be interpreted as ranges.\n";
|
||||
print " To use range processing the perl module Monitoring::Plugin must be installed\n";
|
||||
print " For range syntax see https://www.monitoring-plugins.org/doc/guidelines.html#THRESHOLDFORMAT\n";
|
||||
print " It is strongly recommended when using range syntax that all four of -w, -W, -c and -C are specified\n";
|
||||
print " otherwise it is unlikely that the size test will be doing what is desired\n";
|
||||
print "\n";
|
||||
support();
|
||||
}
|
||||
|
||||
|
|
|
@ -568,7 +568,9 @@ sub process_arguments(){
|
|||
"w=i" => \$opt_w, "warning=i" => \$opt_w, # warning if above this number
|
||||
"c=i" => \$opt_c, "critical=i" => \$opt_c, # critical if above this number
|
||||
"t=i" => \$opt_t, "timeout=i" => \$opt_t,
|
||||
"s" => \$opt_s, "sudo" => \$opt_s
|
||||
"s" => \$opt_s, "sudo" => \$opt_s,
|
||||
"W=i" => \$opt_W, # warning if above this number
|
||||
"C=i" => \$opt_C, # critical if above this number
|
||||
);
|
||||
|
||||
if ($opt_V) {
|
||||
|
@ -662,8 +664,8 @@ sub print_help () {
|
|||
print " Feedback/patches to support non-sendmail mailqueue welcome\n\n";
|
||||
print "-w (--warning) = Min. number of messages in queue to generate warning\n";
|
||||
print "-c (--critical) = Min. number of messages in queue to generate critical alert ( w < c )\n";
|
||||
print "-W (--Warning) = Min. number of messages for same domain in queue to generate warning\n";
|
||||
print "-C (--Critical) = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n";
|
||||
print "-W = Min. number of messages for same domain in queue to generate warning\n";
|
||||
print "-C = Min. number of messages for same domain in queue to generate critical alert ( W < C )\n";
|
||||
print "-t (--timeout) = Plugin timeout in seconds (default = $utils::TIMEOUT)\n";
|
||||
print "-M (--mailserver) = [ sendmail | qmail | postfix | exim | nullmailer ] (default = autodetect)\n";
|
||||
print "-s (--sudo) = Use sudo to call the mailq command\n";
|
||||
|
|
315
plugins-scripts/check_uptime.pl
Executable file
315
plugins-scripts/check_uptime.pl
Executable file
|
@ -0,0 +1,315 @@
|
|||
#!@PERL@ -w
|
||||
|
||||
# check_uptime - check uptime to see how long the system is running.
|
||||
#
|
||||
|
||||
# License Information:
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
# USA
|
||||
#
|
||||
############################################################################
|
||||
|
||||
use POSIX;
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use vars qw($opt_V $opt_h $opt_v $verbose $PROGNAME $opt_w $opt_c
|
||||
$opt_f $opt_s
|
||||
$lower_warn_threshold $upper_warn_threshold
|
||||
$lower_crit_threshold $upper_crit_threshold
|
||||
$status $state $msg);
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin";
|
||||
use utils qw(%ERRORS &print_revision &support &usage );
|
||||
|
||||
sub print_help ();
|
||||
sub print_usage ();
|
||||
sub process_arguments ();
|
||||
|
||||
$ENV{'PATH'}='@TRUSTED_PATH@';
|
||||
$ENV{'BASH_ENV'}='';
|
||||
$ENV{'ENV'}='';
|
||||
$PROGNAME = "check_uptime";
|
||||
$state = $ERRORS{'UNKNOWN'};
|
||||
|
||||
my $uptime_file = "/proc/uptime";
|
||||
|
||||
|
||||
# Process arguments
|
||||
|
||||
Getopt::Long::Configure('bundling');
|
||||
$status = process_arguments();
|
||||
if ($status){
|
||||
print "ERROR: processing arguments\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
|
||||
# Get uptime info from file
|
||||
|
||||
if ( ! -r $uptime_file ) {
|
||||
print "ERROR: file '$uptime_file' is not readable\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
if ( ! open FILE, "<", $uptime_file ) {
|
||||
print "ERROR: cannot read from file '$uptime_file'\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
chomp( my $file_content = <FILE> );
|
||||
close FILE;
|
||||
|
||||
print "$uptime_file: $file_content\n" if $verbose;
|
||||
|
||||
# Get first digit value (without fraction)
|
||||
my ( $uptime_seconds ) = $file_content =~ /^([\d]+)/;
|
||||
|
||||
# Bail out if value is not numeric
|
||||
if ( $uptime_seconds !~ /^\d+$/ ) {
|
||||
print "ERROR: no numeric value: $uptime_seconds\n";
|
||||
exit $ERRORS{"UNKNOWN"};
|
||||
}
|
||||
|
||||
|
||||
# Do calculations for a "pretty" format (2 weeks, 5 days, ...)
|
||||
|
||||
my ( $secs, $mins, $hours, $days, $weeks );
|
||||
$secs = $uptime_seconds;
|
||||
$mins = $hours = $days = $weeks = 0;
|
||||
if ( $secs > 100 ) {
|
||||
$mins = int( $secs / 60 );
|
||||
$secs -= $mins * 60;
|
||||
}
|
||||
if ( $mins > 100 ) {
|
||||
$hours = int( $mins / 60 );
|
||||
$mins -= $hours * 60;
|
||||
}
|
||||
if ( $hours > 48 ) {
|
||||
$days = int( $hours / 24 );
|
||||
$hours -= $days * 24;
|
||||
}
|
||||
if ( $days > 14 ) {
|
||||
$weeks = int( $days / 7 );
|
||||
$days -= $weeks * 7;
|
||||
}
|
||||
|
||||
my $pretty_uptime = "";
|
||||
$pretty_uptime .= sprintf( "%d week%s, ", $weeks, $weeks == 1 ? "" : "s" ) if $weeks;
|
||||
$pretty_uptime .= sprintf( "%d day%s, ", $days, $days == 1 ? "" : "s" ) if $days;
|
||||
$pretty_uptime .= sprintf( "%d hour%s, ", $hours, $hours == 1 ? "" : "s" ) if $hours;
|
||||
$pretty_uptime .= sprintf( "%d minute%s, ", $mins, $mins == 1 ? "" : "s" ) if $mins;
|
||||
# Replace last occurence of comma with "and"
|
||||
$pretty_uptime =~ s/, $/ and /;
|
||||
# Always print the seconds (though it may be 0 seconds)
|
||||
$pretty_uptime .= sprintf( "%d second%s", $secs, $secs == 1 ? "" : "s" );
|
||||
|
||||
|
||||
# Default to catch errors in program
|
||||
my $state_str = "UNKNOWN";
|
||||
|
||||
# Check values
|
||||
my $out_of_bounds_text = "";
|
||||
if ( $uptime_seconds > $upper_crit_threshold ) {
|
||||
$state_str = "CRITICAL";
|
||||
$out_of_bounds_text = "upper crit";
|
||||
} elsif ( $uptime_seconds < $lower_crit_threshold ) {
|
||||
$state_str = "CRITICAL";
|
||||
$out_of_bounds_text = "lower crit";
|
||||
} elsif ( $uptime_seconds > $upper_warn_threshold ) {
|
||||
$state_str = "WARNING";
|
||||
$out_of_bounds_text = "upper warn";
|
||||
} elsif ( $uptime_seconds < $lower_warn_threshold ) {
|
||||
$state_str = "WARNING";
|
||||
$out_of_bounds_text = "lower warn";
|
||||
} else {
|
||||
$state_str = "OK";
|
||||
}
|
||||
|
||||
$msg = "$state_str: ";
|
||||
|
||||
$msg .= "uptime is $uptime_seconds seconds. ";
|
||||
$msg .= "Exceeds $out_of_bounds_text threshold. " if $out_of_bounds_text;
|
||||
$msg .= "Running for $pretty_uptime. " if $opt_f;
|
||||
if ( $opt_s ) {
|
||||
my $up_since = strftime( "%Y-%m-%d %H:%M:%S", localtime( time - $uptime_seconds ) );
|
||||
$msg .= "Running since $up_since. ";
|
||||
}
|
||||
|
||||
$state = $ERRORS{$state_str};
|
||||
|
||||
# Perfdata support
|
||||
print "$msg|uptime=${uptime_seconds}s;$upper_warn_threshold;$upper_crit_threshold;0\n";
|
||||
exit $state;
|
||||
|
||||
|
||||
#####################################
|
||||
#### subs
|
||||
|
||||
|
||||
sub process_arguments(){
|
||||
GetOptions
|
||||
("V" => \$opt_V, "version" => \$opt_V,
|
||||
"v" => \$opt_v, "verbose" => \$opt_v,
|
||||
"h" => \$opt_h, "help" => \$opt_h,
|
||||
"w=s" => \$opt_w, "warning=s" => \$opt_w, # warning if above this number
|
||||
"c=s" => \$opt_c, "critical=s" => \$opt_c, # critical if above this number
|
||||
"f" => \$opt_f, "for" => \$opt_f, # show "running for ..."
|
||||
"s" => \$opt_s, "since" => \$opt_s, # show "running since ..."
|
||||
);
|
||||
|
||||
if ($opt_V) {
|
||||
print_revision($PROGNAME,'@NP_VERSION@');
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
|
||||
if ($opt_h) {
|
||||
print_help();
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
|
||||
if (defined $opt_v) {
|
||||
$verbose = $opt_v;
|
||||
}
|
||||
|
||||
unless ( defined $opt_w && defined $opt_c ) {
|
||||
print_usage();
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
|
||||
# Check if a range was supplied ("lowvalue:highvalue") for warning and critical
|
||||
# Otherwise, set 0 as the lower threshold and the parameter value as upper threshold
|
||||
# (the uptime should always be positive, so there should be no issue)
|
||||
if ( $opt_w =~ /^(.+):(.+)$/ ) {
|
||||
$lower_warn_threshold = $1;
|
||||
$upper_warn_threshold = $2;
|
||||
} else {
|
||||
$lower_warn_threshold = 0;
|
||||
$upper_warn_threshold = $opt_w;
|
||||
}
|
||||
if ( $opt_c =~ /^(.+):(.+)$/ ) {
|
||||
$lower_crit_threshold = $1;
|
||||
$upper_crit_threshold = $2;
|
||||
} else {
|
||||
$lower_crit_threshold = 0;
|
||||
$upper_crit_threshold = $opt_c;
|
||||
}
|
||||
|
||||
# Set as seconds (calculate if suffix present)
|
||||
$lower_warn_threshold = calc_as_seconds( $lower_warn_threshold );
|
||||
$lower_crit_threshold = calc_as_seconds( $lower_crit_threshold );
|
||||
$upper_warn_threshold = calc_as_seconds( $upper_warn_threshold );
|
||||
$upper_crit_threshold = calc_as_seconds( $upper_crit_threshold );
|
||||
|
||||
# Check for numeric value of warning parameter
|
||||
if ( $lower_warn_threshold !~ /^\d+$/ ) {
|
||||
print "Lower warning (-w) is not numeric\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
if ( $upper_warn_threshold !~ /^\d+$/ ) {
|
||||
print "Upper warning (-w) is not numeric\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
# Check for numeric value of critical parameter
|
||||
if ( $lower_crit_threshold !~ /^\d+$/ ) {
|
||||
print "Lower critical (-c) is not numeric\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
if ( $upper_crit_threshold !~ /^\d+$/ ) {
|
||||
print "Upper critical (-c) is not numeric\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
|
||||
# Check boundaries
|
||||
if ( $upper_warn_threshold >= $upper_crit_threshold ) {
|
||||
print "Upper Warning (-w) cannot be greater than Critical (-c)!\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
# No "<=" since both values are zero if no range (only upper threshold values) is given
|
||||
if ( $lower_warn_threshold < $lower_crit_threshold ) {
|
||||
print "Lower Warning (-w) cannot be less than Critical (-c)!\n";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
|
||||
return $ERRORS{'OK'};
|
||||
}
|
||||
|
||||
sub print_usage () {
|
||||
print "Usage: $PROGNAME -w <warn> -c <crit> [-v]\n";
|
||||
}
|
||||
|
||||
sub print_help () {
|
||||
print_revision($PROGNAME,'@NP_VERSION@');
|
||||
print "Copyright (c) 2002 Subhendu Ghosh/Carlos Canau/Benjamin Schmid\n";
|
||||
print "Copyright (c) 2018 Bernd Arnold\n";
|
||||
print "\n";
|
||||
print_usage();
|
||||
print "\n";
|
||||
print " Checks the uptime of the system using $uptime_file\n";
|
||||
print "\n";
|
||||
print "-w (--warning) = Min. number of uptime to generate warning\n";
|
||||
print "-c (--critical) = Min. number of uptime to generate critical alert ( w < c )\n";
|
||||
print "-f (--for) = Show uptime in a pretty format (Running for x weeks, x days, ...)\n";
|
||||
print "-s (--since) = Show last boot in yyyy-mm-dd HH:MM:SS format (output from 'uptime -s')\n";
|
||||
print "-h (--help)\n";
|
||||
print "-V (--version)\n";
|
||||
print "-v (--verbose) = debugging output\n";
|
||||
print "\n\n";
|
||||
print "Note: -w and -c are required arguments.\n";
|
||||
print " You can suffix both values with s for seconds (default), m (minutes), h (hours), d (days) or w (weeks).\n";
|
||||
print "\n";
|
||||
print "Range support: You may specify a range for both warning and critical thresholds.\n";
|
||||
print " This works without additional Perl modules.\n";
|
||||
print "Example: ./check_uptime -w 10m:4w -c 1m:8w\n";
|
||||
print " Results in a critical state when uptime is below 60 seconds or higher than 8 weeks,\n";
|
||||
print " and in a warning state when uptime is below 10 minutes or above 4 weeks.\n";
|
||||
print "\n\n";
|
||||
support();
|
||||
}
|
||||
|
||||
sub calc_as_seconds () {
|
||||
|
||||
my $parameter = shift;
|
||||
|
||||
# Check if suffix is present
|
||||
# Calculate parameter to seconds (to get an integer value finally)
|
||||
# If no suffix is present, just return the value
|
||||
|
||||
# Possible suffixes:
|
||||
# s = seconds
|
||||
# m = minutes
|
||||
# h = hours
|
||||
# d = days
|
||||
# w = weeks
|
||||
my %factor = ( "s" => 1,
|
||||
"m" => 60,
|
||||
"h" => 60 * 60,
|
||||
"d" => 60 * 60 * 24,
|
||||
"w" => 60 * 60 * 24 * 7,
|
||||
);
|
||||
|
||||
if ( $parameter =~ /^(\d+)([a-z])$/ ) {
|
||||
my $value = $1;
|
||||
my $suffix = $2;
|
||||
print "detected: value=$value, suffix=$suffix\n" if $verbose;
|
||||
if ( ! defined $factor{$suffix} ) {
|
||||
print "Error: wrong suffix ($suffix) for value '$parameter'";
|
||||
exit $ERRORS{'UNKNOWN'};
|
||||
}
|
||||
$parameter = $value * $factor{$suffix};
|
||||
}
|
||||
|
||||
return $parameter;
|
||||
|
||||
}
|
|
@ -5,14 +5,14 @@
|
|||
#
|
||||
|
||||
use strict;
|
||||
use Test::More tests => 17;
|
||||
use Test::More tests => 27;
|
||||
use NPTest;
|
||||
|
||||
my $successOutput = '/^FILE_AGE OK: /';
|
||||
my $warningOutput = '/^FILE_AGE WARNING: /';
|
||||
my $criticalOutput = '/^FILE_AGE CRITICAL: /';
|
||||
my $unknownOutput = '/^FILE_AGE UNKNOWN: /';
|
||||
my $performanceOutput = '/ \| age=[0-9]+s;[0-9]+;[0-9]+ size=[0-9]+B;[0-9]+;[0-9]+;0$/';
|
||||
my $performanceOutput = '/ \| age=[0-9]+s;[0-9:]+;[0-9:]+ size=[0-9]+B;[0-9:]+;[0-9:]+;0$/';
|
||||
|
||||
my $result;
|
||||
my $temp_file = "/tmp/check_file_age.tmp";
|
||||
|
@ -20,64 +20,75 @@ my $temp_link = "/tmp/check_file_age.link.tmp";
|
|||
|
||||
unlink $temp_file, $temp_link;
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age");
|
||||
cmp_ok( $result->return_code, '==', 3, "Missing parameters" );
|
||||
like ( $result->output, $unknownOutput, "Output for unknown correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file");
|
||||
cmp_ok( $result->return_code, '==', 2, "File not exists" );
|
||||
like ( $result->output, $criticalOutput, "Output for file missing correct" );
|
||||
|
||||
write_chars(100);
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file");
|
||||
cmp_ok( $result->return_code, '==', 0, "File is new enough" );
|
||||
like ( $result->output, $successOutput, "Output for success correct" );
|
||||
|
||||
sleep 2;
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file -w 1"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -w 1");
|
||||
cmp_ok( $result->return_code, '==', 1, "Warning for file over 1 second old" );
|
||||
like ( $result->output, $warningOutput, "Output for warning correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file -c 1"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1");
|
||||
cmp_ok( $result->return_code, '==', 2, "Critical for file over 1 second old" );
|
||||
like ( $result->output, $criticalOutput, "Output for critical correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file -c 1000 -W 100"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 100");
|
||||
cmp_ok( $result->return_code, '==', 0, "Checking file size" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file -c 1000 -W 100"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 100");
|
||||
like( $result->output, $performanceOutput, "Checking for performance Output" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f /non/existent --ignore-missing"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 100");
|
||||
like( $result->output, $performanceOutput, "Checking for performance Output from range" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f /non/existent --ignore-missing");
|
||||
cmp_ok( $result->return_code, '==', 0, "Honours --ignore-missing" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file -c 1000 -W 101"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 101");
|
||||
cmp_ok( $result->return_code, '==', 1, "One byte too short" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_file_age -f $temp_file -c 1000 -C 101"
|
||||
);
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -C 101");
|
||||
cmp_ok( $result->return_code, '==', 2, "One byte too short - critical" );
|
||||
|
||||
SKIP: {
|
||||
eval 'use Monitoring::Plugin::Range';
|
||||
skip "Monitoring::Plugin::Range module require", 9 if $@;
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -w 0:1");
|
||||
cmp_ok( $result->return_code, '==', 1, "Warning for file over 1 second old by range" );
|
||||
like ( $result->output, $warningOutput, "Output for warning by range correct" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 0:1");
|
||||
cmp_ok( $result->return_code, '==', 2, "Critical for file over 1 second old by range" );
|
||||
like ( $result->output, $criticalOutput, "Output for critical by range correct" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 0:1000 -W 0:100");
|
||||
cmp_ok( $result->return_code, '==', 0, "Checking file size by range" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 101:");
|
||||
cmp_ok( $result->return_code, '==', 1, "One byte too short by range" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -W 0:99");
|
||||
cmp_ok( $result->return_code, '==', 1, "One byte too long by range" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -C 101:");
|
||||
cmp_ok( $result->return_code, '==', 2, "One byte too short by range - critical" );
|
||||
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_file -c 1000 -C 0:99");
|
||||
cmp_ok( $result->return_code, '==', 2, "One byte too long by range - critical" );
|
||||
};
|
||||
|
||||
symlink $temp_file, $temp_link or die "Cannot create symlink";
|
||||
$result = NPTest->testCmd("./check_file_age -f $temp_link -c 10");
|
||||
cmp_ok( $result->return_code, '==', 0, "Works for symlinks" );
|
||||
|
|
129
plugins-scripts/t/check_uptime.t
Normal file
129
plugins-scripts/t/check_uptime.t
Normal file
|
@ -0,0 +1,129 @@
|
|||
#!/usr/bin/perl -w -I ..
|
||||
#
|
||||
# check_uptime tests
|
||||
#
|
||||
#
|
||||
|
||||
use strict;
|
||||
use Test::More tests => 40;
|
||||
use NPTest;
|
||||
|
||||
my $result;
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Missing parameters" );
|
||||
like ( $result->output, '/^Usage: check_uptime -w/', "Output for missing parameters correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime --help"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Help output requested" );
|
||||
like ( $result->output, '/ABSOLUTELY NO WARRANTY/', "Output for help correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 5 -c 2"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Warning greater than critical" );
|
||||
like ( $result->output, '/^Upper Warning .*cannot be greater than Critical/', "Output for warning greater than critical correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -c 1000 -W 100 2>&1"
|
||||
);
|
||||
like ( $result->output, '/^Unknown option: W/', "Output with wrong parameter is correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -f -w 1 -c 2"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
|
||||
like ( $result->output, '/Running for \d+/', "Output for the f parameter correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -s -w 1 -c 2"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
|
||||
like ( $result->output, '/Running since \d+/', "Output for the s parameter correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 1 -c 2"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 2, "Uptime higher than 2 seconds" );
|
||||
like ( $result->output, '/^CRITICAL: uptime is \d+ seconds/', "Output for uptime higher than 2 seconds correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 1 -c 9999w"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 1, "Uptime lower than 9999 weeks" );
|
||||
like ( $result->output, '/^WARNING: uptime is \d+ seconds/', "Output for uptime lower than 9999 weeks correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 9998w -c 9999w"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 0, "Uptime lower than 9998 weeks" );
|
||||
like ( $result->output, '/^OK: uptime is \d+ seconds/', "Output for uptime lower than 9998 weeks correct" );
|
||||
like ( $result->output, '/\|uptime=[0-9]+s;6046790400;6047395200;/', "Checking for performance output" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 111222d -c 222333d"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 0, "Uptime lower than 111222 days" );
|
||||
like ( $result->output, '/^OK: uptime is \d+ seconds/', "Output for uptime lower than 111222 days correct" );
|
||||
like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
|
||||
|
||||
# Same as before, hopefully uptime is higher than 2 seconds so no warning
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 2:111222d -c 1:222333d"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 0, "Uptime lower than 111222 days, and higher 2 seconds" );
|
||||
like ( $result->output, '/^OK: uptime is \d+ seconds/', "Output for uptime lower than 111222 days, and higher 2 seconds correct" );
|
||||
like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
|
||||
|
||||
# Same as before, now the low warning should trigger
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 111221d:111222d -c 1:222333d"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 1, "Uptime lower than 111221 days raises warning" );
|
||||
like ( $result->output, '/^WARNING: uptime is \d+ seconds/', "Output for uptime lower than 111221 days correct" );
|
||||
like ( $result->output, '/Exceeds lower warn threshold/', "Exceeds text correct" );
|
||||
like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
|
||||
|
||||
# Same as before, now the low critical should trigger
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 111221d:111222d -c 111220d:222333d"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 2, "Uptime lower than 111220 days raises critical" );
|
||||
like ( $result->output, '/^CRITICAL: uptime is \d+ seconds/', "Output for uptime lower than 111220 days correct" );
|
||||
like ( $result->output, '/Exceeds lower crit threshold/', "Exceeds text correct" );
|
||||
like ( $result->output, '/\|uptime=[0-9]+s;9609580800;19209571200;/', "Checking for performance output" );
|
||||
|
||||
|
||||
#
|
||||
# Range values using ":" without two parts ("a:b") is invalid
|
||||
# Strings without two parts are always considered as upper threshold
|
||||
#
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 2: -c 1:4"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
|
||||
like ( $result->output, '/^Upper warning .* is not numeric/', "Output for wrong parameter format correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 2:3 -c 1:"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
|
||||
like ( $result->output, '/^Upper critical .* is not numeric/', "Output for wrong parameter format correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w :3 -c 1:4"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
|
||||
like ( $result->output, '/^Upper warning .* is not numeric/', "Output for wrong parameter format correct" );
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
"./check_uptime -w 2:3 -c :4"
|
||||
);
|
||||
cmp_ok( $result->return_code, '==', 3, "Wrong parameter format raises unknown" );
|
||||
like ( $result->output, '/^Upper critical .* is not numeric/', "Output for wrong parameter format correct" );
|
||||
|
|
@ -10,6 +10,7 @@ use strict;
|
|||
use Test::More;
|
||||
use NPTest;
|
||||
|
||||
use lib ".";
|
||||
use lib "..";
|
||||
use utils;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue