aboutsummaryrefslogtreecommitdiff
path: root/contrib/check_nwstat.pl
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/check_nwstat.pl')
-rw-r--r--contrib/check_nwstat.pl188
1 files changed, 188 insertions, 0 deletions
diff --git a/contrib/check_nwstat.pl b/contrib/check_nwstat.pl
new file mode 100644
index 00000000..2194640e
--- /dev/null
+++ b/contrib/check_nwstat.pl
@@ -0,0 +1,188 @@
+#!/usr/bin/perl
+#
+# check_nwstat.pl: Nagios plugin that uses Jim Drews' nwstat.pl for
+# MRTG instead of emulating it. For use particularly with Cliff
+# Woolley's mrtgext.pl Unix companion to Drews' MRTGEXT.NLM, where
+# mrtgext.pl can contain custom commands that check_nwstat won't recognize,
+# though this also does its best to perfectly emulate the C version
+# of check_nwstat.
+#
+
+
+######################################################################
+# Configuration
+######################################################################
+
+$nwstatcmd = "/apps/mrtg/helpers/nwstat.pl";
+
+use Getopt::Long;
+
+$::host = shift || &usage(%ERROR);
+$::opt_v = undef;
+$::opt_wv = undef;
+$::opt_cv = undef;
+$::opt_to = 10;
+$::opt_url = undef;
+
+GetOptions (qw(v=s wv=i cv=i to=i url=s)) || &usage(%ERROR);
+
+my $cmd1 = "";
+my $cmd2 = "ZERO";
+my $backward = 0;
+my $desc = "";
+my $okstr = "OK";
+my $probstr = "Problem";
+my $result = "";
+my @CMD;
+my %ERROR = ("UNKNOWN" => -1,
+ "OK" => 0,
+ "WARNING" => 1,
+ "CRITICAL" => 2);
+my $status = $ERROR{"OK"};
+
+
+######################################################################
+# Main program
+######################################################################
+
+$SIG{'ALRM'} = sub {
+ print "Connection timed out\n";
+ exit $ERROR{"CRITICAL"};
+};
+
+# translate table for compatability with
+# check_nwstat (C version)
+SWITCH: for ($::opt_v) {
+ /^LOAD(1|5|15)$/
+ && do { $desc = "Load <status> - Up <cmd2>, ".
+ "$1-min load average = <cmd0>%";
+ $cmd1 = "UTIL$1"; last; };
+ /^CONNS$/ && do { $desc = "Conns <status>: ".
+ "<cmd0> current connections";
+ $cmd1 = "CONNECT"; last; };
+ /^CDBUFF$/ && do { $desc = "Dirty cache buffers = <cmd0>";
+ $cmd1 = "S3"; last; };
+ /^LTCH$/ && do { $desc = "Long term cache hits = <cmd0>%";
+ $cmd1 = "S1";
+ $backward = 1; last; };
+ /^CBUFF$/ && do { $desc = "Total cache buffers = <cmd0>";
+ $cmd1 = "S2";
+ $backward = 1; last; };
+ /^LRUM$/ && do { $desc = "LRU sitting time = <cmd0> minutes";
+ $cmd1 = "S5";
+ $backward = 1; last; };
+ /^VPF(.*)$/ && do { $desc = "<status><int(cmd0/1024)> MB ".
+ "(<result>%) free on volume $1";
+ $okstr = ""; $probstr = "Only ";
+ $cmd1 = "VKF$1";
+ $cmd2 = "VKS$1";
+ $backward = 1; last; };
+ /^VKF/ && do { $desc = "<status><cmd0> KB free on volume $1";
+ $okstr = ""; $probstr = "Only ";
+ $cmd1 = "$::opt_v";
+ $backward = 1; last; };
+ /^$/ && die "Nothing to check!";
+ $desc = "<status>: <cmd0>";
+ $cmd1 = "$::opt_v";
+ }
+
+
+# begin timeout period, run the check
+alarm($::opt_to);
+open ( CMD, "$nwstatcmd $host $cmd1 $cmd2|" ) || die "Couldn't execute nwstat";
+@CMD = <CMD>;
+close ( CMD );
+alarm(0);
+
+for (@CMD) { chomp; }
+
+# for any variables that manipulate the results instead of
+# just using <cmd0> directly, do that manipulation here into <result>
+SWITCH: for ($::opt_v) {
+ /^VPF/ && do { $result=int(("$CMD[0]"/"$CMD[1]")*100); last; };
+ $result = "$CMD[0]";
+ }
+
+if ("$result" == -1) {
+ $status = $ERROR{"UNKNOWN"};
+ $desc = "Server returned \"variable unknown\"";
+} elsif ("$result" == -2) {
+ $status = $ERROR{"CRITICAL"};
+ $desc = "Connection failed";
+}
+
+if (defined($::opt_cv) && $status == $ERROR{"OK"}) {
+ if ($backward) {
+ ("$result" <= "$::opt_cv") && ( $status = $ERROR{"CRITICAL"} );
+ } else {
+ ("$result" >= "$::opt_cv") && ( $status = $ERROR{"CRITICAL"} );
+ }
+}
+if (defined($::opt_wv) && $status == $ERROR{"OK"}) {
+ if ($backward) {
+ ("$result" <= "$::opt_wv") && ( $status = $ERROR{"WARNING"} );
+ } else {
+ ("$result" >= "$::opt_wv") && ( $status = $ERROR{"WARNING"} );
+ }
+}
+
+$desc =~ s/<status>/($status == $ERROR{"OK"})?"$okstr":"$probstr"/eg;
+$desc =~ s/<([^>]*)cmd([0-3])([^>]*)>/eval("$1\"$CMD[$2]\"$3")/eg;
+$desc =~ s/<result>/"$result"/eg;
+
+if (defined($::opt_url)) {
+ print "<A HREF=\"$::opt_url\">$desc</A>\n";
+} else {
+ print "$desc\n";
+}
+exit $status;
+
+
+######################################################################
+# Subroutines
+######################################################################
+
+sub usage {
+
+ %ERROR = shift;
+
+ print <<EOF
+check_nwstat.pl plugin for Nagios
+by Cliff Woolley, (c) 2000
+
+Usage: ./check_nwstat.pl <host_address> [-v variable] [-wv warn_value] [-cv crit_value] [-to to_sec] [-url url_value]
+
+Options:
+ [variable] = Variable to check. Valid variables include:
+ LOAD1 = 1 minute average CPU load
+ LOAD5 = 5 minute average CPU load
+ LOAD15 = 15 minute average CPU load
+ CONNS = number of currently licensed connections
+ VPF<vol> = percent free space on volume <vol>
+ VKF<vol> = KB of free space on volume <vol>
+ LTCH = percent long term cache hits
+ CBUFF = current number of cache buffers
+ CDBUFF = current number of dirty cache buffers
+ LRUM = LRU sitting time in minutes
+ [warn_value] = Threshold for value necessary to result in a warning status
+ [crit_value] = Threshold for value necessary to result in a critical status
+ [to_sec] = Number of secs before connection times out - default is 10 sec
+ [url_value] = URL to use in output as a hyperlink. Useful to link to a page
+ with more details or history for this variable (ie an MRTG page)
+
+This plugin attempts to contact the MRTGEXT NLM running on a Novell server
+to gather the requested system information.
+
+Notes:
+ - This plugin requres that the MRTGEXT.NLM file distributed with
+ James Drews' MRTG extension for NetWare (available from
+ http://www.engr.wisc.edu/~drews/mrtg/) be loaded on the Novell
+ servers you wish to check.
+ - Critical thresholds should be lower than warning thresholds when
+ the following variables are checked: VPF, VKF, LTCH, CBUFF, and LRUM.
+EOF
+;
+
+ exit $ERROR{"UNKNOWN"};
+}
+