aboutsummaryrefslogtreecommitdiff
path: root/check_nrpe_cluster
diff options
context:
space:
mode:
Diffstat (limited to 'check_nrpe_cluster')
-rwxr-xr-xcheck_nrpe_cluster108
1 files changed, 108 insertions, 0 deletions
diff --git a/check_nrpe_cluster b/check_nrpe_cluster
new file mode 100755
index 0000000..67ce1f6
--- /dev/null
+++ b/check_nrpe_cluster
@@ -0,0 +1,108 @@
+#!/usr/bin/env perl
+
+#
+# Run two or more NRPE checks and return a status based on their aggregated
+# results, similar to check_cluster. fork(3)s ahoy!
+#
+# Author: Tom Ryder <tom@sanctum.geek.nz>
+# Copyright: 2015
+#
+# $Id$
+#
+package Nagios::Plugin::NRPE::Cluster;
+
+# Force me to write this properly
+use strict;
+use warnings;
+use utf8;
+use autodie qw(:all);
+
+# Require at least Perl 5.10
+use 5.010;
+
+# Decree package version
+our $VERSION = 1.0;
+
+# Import required modules
+use English qw(-no_match_vars); # dpkg: perl-core
+use IPC::Run3; # dpkg: libipc-run3-perl
+use Nagios::Plugin; # dpkg: libnagios-plugin-perl
+
+# Find path to Nagios' plugins
+my $plugins_dir =
+ exists $ENV{NAGIOS_PLUGINS_DIR}
+ ? $ENV{NAGIOS_PLUGINS_DIR}
+ : '/usr/local/nagios/libexec';
+
+# Build Nagios::Plugin object
+my $np = Nagios::Plugin->new(
+ usage => 'Usage: %s [-w THRESHOLD] [-c THRESHOLD] '
+ . 'HOSTNAME1:CHECK1,HOSTNAME2:CHECK2[,HOSTNAME3:CHECK3...]',
+ version => $VERSION,
+);
+
+# Add warning and critical options
+$np->add_arg(
+ spec => 'warning|w=s',
+ help => "-w, --warning=THRESHOLD\n"
+ . ' Warning threshold for the number of OK checks',
+);
+$np->add_arg(
+ spec => 'critical|c=s',
+ help => "-c, --critical=THRESHOLD\n"
+ . ' Critical threshold for the number of OK checks',
+);
+
+# Read options
+$np->getopts();
+
+# Need one of --warning or --critical
+if ( !$np->opts->warning && !$np->opts->critical ) {
+ $np->nagios_die(q{Need one/both of --warning or --critical});
+}
+
+# Verify we have at least two host:check pairs
+my @pairs;
+if (@ARGV) {
+ @pairs = split m{,}msx, $ARGV[0];
+}
+if ( @pairs < 2 ) {
+ $np->nagios_die(q{Need at least two HOSTNAME:CHECK definitions});
+}
+
+# Verify all of the arguments are in the expected format
+my @invalids = grep { !m{[^:]+:[^:]+}msx } @ARGV;
+if (@invalids) {
+ $np->nagios_die( q{Argument(s) %s are not in HOSTNAME:CHECK format},
+ join q{,}, @invalids );
+}
+
+# Start counting down to timeout
+alarm $np->opts->timeout;
+
+# Run the checks and collect a list of successes and failures
+my ( @pass, @fail );
+foreach my $pair (@pairs) {
+ my ( $hostname, $command ) = split m{:}msx, $pair;
+ my $cmd = [ $plugins_dir . '/check_nrpe', '-H', $hostname, '-c', $command ];
+ run3 $cmd, \undef, \undef, \undef;
+ if ( $CHILD_ERROR == 0 ) {
+ push @pass, $pair;
+ }
+ else {
+ push @fail, $pair;
+ }
+}
+
+# Compare the check results to the failures
+my $code = $np->check_threshold(
+ check => scalar @pass,
+ warning => $np->opts->warning,
+ critical => $np->opts->critical,
+);
+$np->nagios_exit( $code, sprintf 'All checks run, %u passes, %u failures',
+ scalar @pass, scalar @fail );
+
+# This should never happen, but if it does we may as well be explicit about it
+$np->nagios_die(q{Couldn't work out how to aggregate checks});
+