diff options
Diffstat (limited to 'contrib/check_rrd_data.pl')
-rw-r--r-- | contrib/check_rrd_data.pl | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/contrib/check_rrd_data.pl b/contrib/check_rrd_data.pl new file mode 100644 index 00000000..0ff8750b --- /dev/null +++ b/contrib/check_rrd_data.pl @@ -0,0 +1,129 @@ +#!/usr/bin/perl -wT + +# check_rrd_data plugin for nagios +# +# usage: +# check_rrd machine_id perlexp_warn perlexp_crit perlexp_default [ds] +# +# Checks data from a RRD file. machine_id is normally an IP address, that has +# to be mapped to a RRD file, by means of the config file (by default +# /var/spool/nagios/rrd-files, a file with pairs of (machine_id,rrd_file), +# separated by whitespace). It can be a RRD file, too. +# +# The Perl expressions are expressions to be evaluated in the following cases: +# +# - perlexp_crit. The first one, to check if there is a critical situation. If +# it returns other than "", it will be a critical message. +# - perlexp_warn. The second one to be evaluated. If returns other than "", a +# warning will be issued to Nagios. +# - perlexp_default. If both of the above return "", it will be evaluated, and +# wathever returns this expression will be returned by the script. NOTE that +# this is different from the other two cases, to allow the user issue a +# warning or critical failure even if the other two don't return it. +# +# Use these hosts.cfg entries as examples +# +# command[check_ping]=$USER1$/check_rrd_data.pl $HOSTADDRESS$ \ +# 'return "CHECK_CRICKET_PING: Warning\n" if ($value > 10);' 'return \ +# "CHECK_CRICKET_PING: Critical\n" if ($value > 100);' 'printf \ +# "PING OK - RTA = %.2fms\n", $value; return 0;' 1 +# service[machine]=PING;0;24x7;3;5;1;router-admins;240;24x7;1;1;1;;check_ping +# +# initial version: 28 Nov 2000 by Esteban Manchado Velázquez +# current status: 0.1 +# +# Copyright Notice: GPL +# + +# Doesn't work! Why? +# BEGIN { + # my $runtimedir = substr($0,0,rindex($0,'/')); + # require "$runtimedir/utils.pm"; +# } + +require '/usr/libexec/nagios/plugins/utils.pm'; +use RRD::File; +# use strict; # RRD:File and utils.pm don't like this + +my $configfilepath = "/var/spool/nagios/rrd-files"; # Change if needed +my %hostfile; # For storing config +my $rrdfile; # RRD file to open + +$ENV{'PATH'} = "/bin:/usr/bin"; +$ENV{'ENV'} = ""; + +if (scalar @ARGV != 4 && scalar @ARGV != 5) { + print STDERR join "' '", @ARGV, "\n"; + my $foo = 'check_rrd_data'; + print STDERR $foo, " <file.rrd> <perl_exp_warn> <perl_exp_crit> <perl_exp_default> [<ds>]\n\n"; + print STDERR "<perl_exp_*> is an expression that gets evaluated with \$_ at the current\n"; + print STDERR "value of the data source. If it returns something other than \"\", there\n"; + print STDERR "will be a warning or a critical failure. Else, the expression\n"; + print STDERR "<perl_exp_default> will be evaluated\n"; + exit; +} + +# Check configuration file +open F, $configfilepath or do { + print "Can't open config file $configfilepath\n"; + return $ERRORS{'UNKNOWN'}; +}; +while (<F>) { + next unless /(.+)\s+(.+)/; + $hostfile{$1} = $2; +} +close F; + +# Default +my $ds = defined $ARGV[4]?$ARGV[4]:0; + # print "\$ds = " . $ds . ":"; + # print "\$ARGV[4] = " . $ARGV[4] . ":"; +$ds =~ s/\$//g; # Sometimes Nagios gives 1$ as the last parameter + +# Guess which RRD file have to be opened +$rrdfile = $ARGV[0] if (-r $ARGV[0]); # First the parameter +$rrdfile = $hostfile{$ARGV[0]} unless $rrdfile; # Second, the config file + # print "$ARGV[0]:"; + +if (! $rrdfile) { + print "Can't open data file for $ARGV[0]\n"; # Aaaargh! + return $ERRORS{'UNKNOWN'}; # Unknown +} + + # print "Opening file $rrdfile:"; +my $rrd = new RRD::File ( -file => $rrdfile ); +$rrd->open(); +if (! $rrd->loadHeader()) { + print "Couldn't read header from $rrdfile\n"; + exit $ERRORS{'UNKNOWN'}; # Unknown +} +my $value = $rrd->getDSCurrentValue($ds); +$rrd->close(); + +# Perl expressions to evaluate +my ($perl_exp_warn, $perl_exp_crit, $perl_exp_default) = + ($ARGV[1], $ARGV[2], $ARGV[3]); +my $result; # Result of the expressions (will be printed) +my @data; # Special data reserved for the expressions, to pass data + +# First check for critical errors +$perl_exp_crit =~ /(.*)/; +$perl_exp_crit = $1; +$result = eval $perl_exp_crit; +if ($result) { + print $result; + exit 2; # Critical +} + +# Check for warnings +$perl_exp_warn =~ /(.*)/; +$perl_exp_warn = $1; +$result = eval $perl_exp_warn; +if ($result) { + print $result; + exit 1; # Warning +} + +$perl_exp_default =~ /(.*)/; +$perl_exp_default = $1; +eval $perl_exp_default; # Normally returns 0 (OK) |