#!/usr/bin/perl -wT #usr/bin/perl -wT # # $Id: check_rrd_data.pl,v 1.1 2004/08/27 16:19:09 hmann Exp $ # # check_rrd_data plugin for nagios # # usage: # check_rrd rrdfile [ds] warning critical # # Copyright Notice: GPL # # example: /var/local/mrtg/sql_c1n1/cpu.rrd 1 10 20 require '/usr/lib/nagios/plugins/utils.pm'; #makes things work when run without install use lib qw( ../perl-shared/blib/lib ../perl-shared/blib/arch ); # this is for after install use lib qw( /usr/local/rrdtool-1.0.45/lib/perl ../lib/perl ); use RRDs; use strict; # RRD:File and utils.pm don't like this use Getopt::Long; $ENV{'PATH'} = "/bin:/usr/bin"; $ENV{'ENV'} = ""; # if (scalar @ARGV != 4 && scalar @ARGV != 5) { # print STDERR join "' '", @ARGV, "\n"; # my $foo = 'check_rrd_data'; # exit 3; #} my $debug = 0; # original params from check_mrtg # check_mrtg -F log_file -a -v variable -w warning -c critical # [-l label] [-u units] [-e expire_minutes] [-t timeout] [-v] my %cfg; my %rcfg; my %opts; GetOptions(\%opts, 'F=s', 'a=s', 'v=s', 'w=s', 'c=s', 'l=s', 'u=s', 'e=s', 't=s', 'debug'); my $rrd_file; my $maxavg; my $data_source; my $level_warn; my $level_crit; my $label; my $units; my $expire_minutes; my $timeout; # --- checking out params if (defined $opts{F}) { $rrd_file = $opts{F} or die "ERROR: unknown file $opts{F})\n"; } if (defined $opts{s}) { $maxavg = $opts{s} or die "ERROR: unknown AVG|MAX $opts{s})\n"; } if (defined $opts{v}) { $data_source = $opts{v} or die "ERROR: unknown data-source(1|2) $opts{v})\n"; } if (defined $opts{w}) { $level_warn = $opts{w} or die "ERROR: unknown warning value $opts{w})\n"; } if (defined $opts{c}) { $level_crit = $opts{c} or die "ERROR: unknown critical value $opts{c})\n"; } if (defined $opts{l}) { $label = $opts{l} or die "ERROR: unknown value $opts{l})\n"; } if (defined $opts{u}) { $units = $opts{u} or die "ERROR: unknown value $opts{u})\n"; } if (defined $opts{e}) { $expire_minutes = $opts{e} or die "ERROR: unknown value $opts{e})\n"; } if (defined $opts{t}) { $timeout = $opts{t} or die "ERROR: unknown value $opts{t})\n"; } if (defined $opts{debug}) { $debug = $opts{debug}; } #--- map to old variables (could have been better) my $rrdfile=$rrd_file; my $ds = $data_source; $ds =~ s/\$//g; # Sometimes Nagios gives 1$ as the last parameter # compatible to check_mrtg if ($ds==1) { $ds = "ds0"; } elsif ($ds==2) { $ds = "ds1"; } my $warn = $level_warn; if ($debug>0) { print "\$warn = " . $warn . "\n"; } my $crit = $level_crit; if ($debug>0) { print "\$crit = " . $crit . "\n"; } my ($info) = RRDs::info ($rrdfile); my $last = $info->{last_update} - $info->{last_update} % $info->{step}; # my ($last) = RRDs::last ($rrdfile); if ($debug>0) { print "\$last: ","$last", scalar localtime($last), "\n"; } my ($start,$step,$names,$data); ($start,$step,$names,$data) = RRDs::fetch ($rrdfile,"AVERAGE","-s",$last-1,"-e",$last); if ($debug>0) { print "Start: ", scalar localtime($start), " ($start)\n"; print "Step size: $step seconds\n"; print "DS names: ", join (", ", @$names)."\n"; print "Data points: ", $#$data + 1, "\n"; print "Data:\n"; } foreach my $line (@$data) { if ($debug>0) { print " ", scalar localtime($start), " ($start) "; } $start += $step; foreach my $val (@$line) { if ($debug>0) { printf "%12d ", $val; } } if ($debug>0) { print "\n"; } } my $i; my $found_index; for ($i= 0; $i < @$names; $i++) { if ($debug>0) { print "ds:$ds ", "names[$i]=", @$names[$i], "\n"; } if (@$names[$i] eq $ds) { $found_index = $i; last; } } my $value = @$data[0]->[$found_index]; if ($debug>0) { print "DS Index: $found_index value: $value\n"; } # Check for NaN - values if ($value == '') { print "No value returned for $ds\n"; exit 3; } # First check for critical errors if ($value > $crit) { print "$label = $value $units\n"; exit 2; # Critical } # Check for warnings if ($value > $warn) { print "$label = $value $units\n"; exit 1; # Warning } # Normally returns 0 (OK) print "$label = $value $units\n"; exit 0;