Added plugin_wrapper.pl.

This is a small wrapper to execute plugins, catching any errors, signals, etc.
returned by the script. This is primarily meant for Perl, Python, etc. scripts
to catch execution errors.
This commit is contained in:
Sebastian Harl 2012-04-30 10:39:42 +02:00
parent 1cfdcd3667
commit 42f40c7c2b

74
plugin_wrapper.pl Executable file
View file

@ -0,0 +1,74 @@
#! /usr/bin/perl
#####################################################################
# (c) 2012 Sebastian "tokkee" Harl <sh@teamix.net> #
# and team(ix) GmbH, Nuernberg, Germany #
# #
# This file is part of "team(ix) Monitoring Plugins" #
# URL: http://oss.teamix.org/projects/monitoringplugins/ #
# #
# This file 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 file 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 file. If not, see <http://www.gnu.org/licenses/>. #
#####################################################################
use strict;
use warnings;
my $p_script = shift;
my @p_args = @ARGV;
if (! $p_script) {
exit_usage(1);
}
my $p_stdout;
my $p_pid = open($p_stdout, '-|', "$p_script @p_args 2>&1");
if (! defined($p_pid)) {
print "CRITICAL: Failed to execute plugin ($p_script): $!\n";
print "Commandline: $p_script @p_args\n";
exit 2;
}
my @p_output = <$p_stdout>;
if (waitpid($p_pid, 0) != $p_pid) {
print "UNKNOWN: Lost track of plugin process\n";
exit 3;
}
my $p_rc = $?;
my $p_sig = $p_rc & 127;
my $p_cd = $p_rc & 128; # core dumped?
$p_rc >>= 8;
close $p_stdout;
if ($p_sig || $p_cd) {
print "CRITICAL: Plugin died with signal $p_sig (exit code: $p_rc)"
. ($p_cd ? " (core dumped)" : "") . "\n";
$p_rc = 2;
}
if ($p_rc == 255) {
print "CRITICAL: Plugin died with status 255 "
. "(see details for more info)\n";
print "Commandline: $p_script @p_args\n";
}
my $p_output = join('', @p_output);
print $p_output;
exit $p_rc;
sub exit_usage {
my $status = shift || 0;
print STDERR "Usage: $0 <plugin> [<args>]\n";
exit $status;
}