Parcourir la source

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.
Sebastian Harl il y a 13 ans
Parent
commit
42f40c7c2b
1 fichiers modifiés avec 74 ajouts et 0 suppressions
  1. 74 0
      plugin_wrapper.pl

+ 74 - 0
plugin_wrapper.pl

@@ -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;
+}
+