=================================================================== RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v retrieving revision 1.4 retrieving revision 1.14 diff -u -r1.4 -r1.14 --- nagios/check_hw_sensors/check_hw_sensors 2006/05/02 16:54:42 1.4 +++ nagios/check_hw_sensors/check_hw_sensors 2006/05/04 02:30:29 1.14 @@ -1,14 +1,15 @@ -#!/usr/bin/perl -# $RedRiver: check_hw_sensors,v 1.3 2006/05/02 01:39:23 andrew Exp $ +#!/usr/bin/perl -T +# $RedRiver: check_hw_sensors,v 1.13 2006/05/03 22:16:42 andrew Exp $ ######################################################################## # check_hw_sensors *** A nagios check for OpenBSD hw.sensors # # 2006.05.01 #*#*# andrew fresh ######################################################################## # TODO: -# Really need to fix the documentation issue. +# Really need real documentation. # -# I want the ability to just check the "status" entry that is in some output. For example the OK here: +# I want the ability to just check the "status" entry that is in +# some output. For example the OK here: # hw.sensors.1=esm0, CPU 1, OK, temp, 31.00 degC / 87.80 degF ######################################################################## use strict; @@ -16,11 +17,12 @@ #use Data::Dumper; +%ENV = (); + use constant NAGIOS_OUTPUT => 1; use POSIX; use lib "/usr/local/libexec/nagios"; -#use lib $ENV{'HOME'}; use utils qw($TIMEOUT %ERRORS &print_revision &support); use Getopt::Long; @@ -39,8 +41,8 @@ my $sensor; my $warning; my $critical; -my $opt_h ; -my $opt_V ; +my $opt_h; +my $opt_V; my $CHECK_SENSOR = $BASE; my %CHECKS; @@ -65,7 +67,7 @@ } if ($opt_V) { - print_revision($PROGNAME,'$Revision: 1.4 $ '); + print_revision($PROGNAME,'$Revision: 1.14 $ '); exit $ERRORS{'OK'}; } @@ -75,10 +77,10 @@ } unless ( ( - defined $filename || - (defined $sensor && ($warning || $critical)) - ) && - ( (!defined $filename) || (!defined $sensor) ) + defined $filename || + (defined $sensor && ($warning || $critical)) + ) && + ( (!defined $filename) || (!defined $sensor) ) ) { print_help(); exit $ERRORS{'OK'}; @@ -140,7 +142,6 @@ push @{ $states{ $r } }, $check . '=' . $SENSORS{$check}{'output'}; } else { - # XXX Error missing sensor push @{ $states{'UNKNOWN'} }, $check . '=No sensor with this id'; } } @@ -148,17 +149,21 @@ #print Dumper \%states; $state = 'OK'; -if (NAGIOS_OUTPUT) { - print '' . "\n"; +if ($have_results == 0) { + print "No results found\n"; } -foreach my $error (sort { $ERRORS{$a} <=> $ERRORS{$b} } keys %ERRORS) { - if (exists $states{$error}) { - $state = $error; - } -} exit $ERRORS{$state}; @@ -201,38 +201,25 @@ my $type = shift; my $check = shift; - if (defined $check->{'warn'} && $check->{'warn'} =~ /:/) { - if (my ($low, $high) = split /:/, $check->{'warn'}) { - $check->{'warn.low'} = $low; - $check->{'warn.high'} = $high; + foreach my $code ('crit', 'warn') { + if (defined $check->{$code} && $check->{$code} =~ /:/) { + if (my ($low, $high) = split /:/, $check->{$code}) { + $check->{$code . '.low'} = $low; + $check->{$code . '.high'} = $high; + } + delete $check->{$code}; } - delete $check->{'warn'}; - } - if (defined $check->{'crit'} && $check->{'crit'} =~ /:/) { - if (my ($low, $high) = split /:/, $check->{'crit'}) { - $check->{'crit.low'} = $low; - $check->{'crit.high'} = $high; + + foreach my $severity ('low', 'high') { + if (defined $check->{$severity}) { + $check->{ $code . '.' . $severity } = $check->{$severity} + unless defined $check->{ $code . '.' . $severity }; + } } - delete $check->{'crit'}; + no warnings 'uninitialized'; + $check->{$code} = [ split /,\s*/, $check->{$code} ]; } - if (defined $check->{'low'}) { - $check->{'warn.low'} = $check->{'low'} - unless defined $check->{'warn.low'}; - $check->{'crit.low'} = $check->{'low'} - unless defined $check->{'crit.low'}; - } - if (defined $check->{'high'}) { - $check->{'warn.high'} = $check->{'high'} - unless defined $check->{'warn.high'}; - $check->{'crit.high'} = $check->{'high'} - unless defined $check->{'crit.high'}; - } - - no warnings 'uninitialized'; - $check->{'warn'} = [ split /,\s*/, $check->{'warn'} ]; - $check->{'crit'} = [ split /,\s*/, $check->{'crit'} ]; - return $check; } @@ -294,12 +281,12 @@ $result = $errors{$code} if ($c <= $data); } - } elsif (defined $check->{$code}) { + } elsif (@{ $check->{$code} }) { my $matched = 0; foreach my $c (@{ $check->{$code} }) { $c =~ s/[^\d\.]//g; unless (length $c) { - warn "INVALID CHECK (" . $check->{$code} . + warn "INVALID CHECK (" . $c . ") for '$sensor->{'id'}:$code'"; next; } @@ -362,7 +349,7 @@ $result = $errors{$code} if ($c <= $data); } - } elsif (defined $check->{$code}) { + } elsif (@{ $check->{$code} }) { my $matched = 0; foreach my $c (@{ $check->{$code} }) { @@ -377,7 +364,7 @@ $c =~ s/[^\d\.]//g; unless (length $c) { - warn "INVALID CHECK (" . $check->{$code} . + warn "INVALID CHECK (" . $c . ") for '$sensor->{'id'}':$code"; next; } @@ -394,7 +381,7 @@ $sensor->{'type'} eq 'drive' || $sensor->{'type'} eq 'indicator' ) { - if (defined $check->{$code}) { + if (@{ $check->{$code} }) { my $matched = 0; foreach (@{ $check->{$code} }) { if ($_ eq $sensor->{'data'}) { @@ -417,34 +404,55 @@ sub print_help { print <]|(-s -w limit -c limit)) + $PROGNAME (-f []|(-s -w limit -c limit)) Usage: - -f, --filename=FILE - FILE to load checks from (defaults to /etc/sensorsd.conf) - -s, --sensor=ID - ID of a single sensor. "-s 0" means hw.sensors.0. - -w, --warning=RANGE or single ENTRY - Exit with WARNING status if outside of RANGE or if != ENTRY - -c, --critical=INTEGER - Exit with CRITICAL status if outside of RANGE or if != ENTRY + -f, --filename=FILE + FILE to load checks from (defaults to /etc/sensorsd.conf) + -s, --sensor=ID + ID of a single sensor. "-s 0" means hw.sensors.0. + -w, --warning=RANGE or single ENTRY + Exit with WARNING status if outside of RANGE or if != ENTRY + -c, --critical=RANGE or single ENTRY + Exit with CRITICAL status if outside of RANGE or if != ENTRY - -h (--help) usage help + -h (--help) usage help -FILE is in the same format as sensorsd.conf(5). These additional entries in the file are ignored by sensorsd(8). $PROGNAME understands the following entries: - low, high, crit, warn, crit.low, crit.high, warn.low, warn.high +FILE is in the same format as sensorsd.conf(5) plus some additional +entries. These additional entries in the file are ignored by +sensorsd(8). -An ENTRY depends on the type. The descriptions in sensorsd.conf(5) can be used when appropriate, or you can use the following: - volts_dc, fanrpm or raw - Anything that includes digits. Anything that isn't a digit or period is stripped from the entry and the sensor output and they are compared. - temp - Can be as above, but if the entry has an F in it, it compares farenheit, otherwise it uses celcius. - indicator or drive - does a case sensitive match of each entry in the comma separated list and if it does not match any of the entries, it matches the status. +$PROGNAME understands the following entries: -The entries 'crit' or 'warn' (or the -c or -w on the command line) may be a RANGE or a comma separated list of acceptable values. The comma separated list of values contains a list of things that will NOT cause the status. This is possibly counterintuitive, but you are more likely to know good values than bad values. + low, high, crit, warn, crit.low, crit.high, warn.low, warn.high -A RANGE is a low ENTRY and a high ENTRY separated by a colon (:). +An ENTRY depends on the type. The descriptions in sensorsd.conf(5) +can be used when appropriate, or you can use the following: + volts_dc, fanrpm or raw - Anything that includes digits. + Both the value of the check and the value of the sensor + response that are not either a digit or period are stripped + and then the two resultant values are compared. + + temp - Can be as above, but if the entry has an F in it, + it compares farenheit, otherwise it uses celcius. + + indicator or drive - does a case sensitive match of each + entry in the comma separated list and if it does not match + any of the entries, it matches the status. + +The entries 'crit' or 'warn' (or the -c or -w on the command line) +may be a RANGE or a comma separated list of acceptable values. +The comma separated list of values contains a list of things that +will NOT cause the status. This is possibly counterintuitive, but +you are more likely to know good values than bad values. + +A RANGE is a low ENTRY and a high ENTRY separated by a colon (:). +It can also be low: or :high with the other side left blank to only +make the single check.. + EOL - print_revision($PROGNAME, '$Revision: 1.4 $'); + print_revision($PROGNAME, '$Revision: 1.14 $'); }