=================================================================== RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v retrieving revision 1.2 retrieving revision 1.11 diff -u -r1.2 -r1.11 --- nagios/check_hw_sensors/check_hw_sensors 2006/05/02 02:29:33 1.2 +++ nagios/check_hw_sensors/check_hw_sensors 2006/05/03 21:01:09 1.11 @@ -1,18 +1,25 @@ #!/usr/bin/perl -# $RedRiver: check_sensors,v 1.1 2006/05/01 18:11:23 andrew Exp $ +# $RedRiver: check_hw_sensors,v 1.10 2006/05/03 03:31:22 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. +# +# 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; use warnings; -#use Data::Dumper; +use Data::Dumper; +use constant NAGIOS_OUTPUT => 0; + use POSIX; -#use lib "/usr/local/libexec/nagios"; -use lib $ENV{'HOME'}; +use lib "/usr/local/libexec/nagios"; use utils qw($TIMEOUT %ERRORS &print_revision &support); use Getopt::Long; @@ -20,28 +27,28 @@ my $PROGNAME = "check_hw_sensors"; -my $SYSCTL = 'sysctl'; -my $GETCAP = 'getcap'; +my $SYSCTL = '/sbin/sysctl'; +my $GETCAP = '/usr/bin/getcap'; my $BASE = 'hw.sensors'; +my $DEFAULT_CONFIG = '/etc/sensorsd.conf'; -my $CHECK_SENSOR = $BASE; -my %CHECKS; -my %SENSORS; - my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK my %states; # This stores the count of states; my $filename; my $sensor; my $warning; my $critical; -my $opt_h ; -my $opt_V ; +my $opt_h; +my $opt_V; +my $CHECK_SENSOR = $BASE; +my %CHECKS; +my %SENSORS; #Option checking my $status = GetOptions( - "V" => \$opt_V, "version" => \$opt_V, - "h" => \$opt_h, "help" => \$opt_h, + "version|V" => \$opt_V, + "help|h" => \$opt_h, "filename|f:s" => \$filename, "sensor|s=s" => \$sensor, "warning|w=s" => \$warning, @@ -49,7 +56,7 @@ ); # set the default this way so it only happens if someone typed -f or --filename -$filename = '/etc/sensorsd.conf' if (defined $filename && $filename eq ''); +$filename = $DEFAULT_CONFIG if (defined $filename && $filename eq ''); if ($status == 0) { print_help() ; @@ -57,7 +64,7 @@ } if ($opt_V) { - print_revision($PROGNAME,'$Revision: 1.2 $ '); + print_revision($PROGNAME,'$Revision: 1.11 $ '); exit $ERRORS{'OK'}; } @@ -67,10 +74,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'}; @@ -84,8 +91,8 @@ $CHECK_SENSOR = $sensor; $CHECKS{$sensor} = { - 'warning' => $warning, - 'critical' => $critical, + 'warn' => $warning, + 'crit' => $critical, }; } elsif (defined $filename) { %CHECKS = parse_file($filename); @@ -132,7 +139,6 @@ push @{ $states{ $r } }, $check . '=' . $SENSORS{$check}{'output'}; } else { - # XXX Error missing sensor push @{ $states{'UNKNOWN'} }, $check . '=No sensor with this id'; } } @@ -140,15 +146,32 @@ #print Dumper \%states; $state = 'OK'; +my $have_results = 0; foreach my $error (sort { $ERRORS{$a} <=> $ERRORS{$b} } keys %ERRORS) { if (exists $states{$error}) { + $have_results++; $state = $error; - print "$error (" . scalar(@{ $states{ $error } }) . "):\n"; - foreach (@{ $states{ $error } }) { - print " $_\n"; + } +} +foreach my $error (sort { $ERRORS{$b} <=> $ERRORS{$a} } keys %ERRORS) { + if (exists $states{$error}) { + if (NAGIOS_OUTPUT) { + print "$error (" . scalar(@{ $states{ $error } }) . ")"; + unless ($error eq 'OK') { + print '
'; + print map { " - $_
" } @{ $states{ $error } }; + } + } else { + print "$error (" . scalar(@{ $states{ $error } }) . "):\n"; + foreach (@{ $states{ $error } }) { + print " $_\n"; + } } } } +if ($have_results == 0) { + print "No results found\n"; +} exit $ERRORS{$state}; @@ -175,41 +198,25 @@ my $type = shift; my $check = shift; - $check->{'warn'} = $check->{'warning'} if (!defined $check->{'warn'}); - $check->{'crit'} = $check->{'critical'} if (!defined $check->{'crit'}); + 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}; + } - if (defined $check->{'warn'} && $check->{'warn'} =~ /:/) { - if (my ($low, $high) = split /:/, $check->{'warn'}) { - $check->{'warn.low'} = $low; - $check->{'warn.high'} = $high; + foreach my $severity ('low', 'high') { + if (defined $check->{$severity}) { + $check->{ $code . '.' . $severity } = $check->{$severity} + unless defined $check->{ $code . '.' . $severity }; + } } - delete $check->{'warn'}; + no warnings 'uninitialized'; + $check->{$code} = [ split /,\s*/, $check->{$code} ]; } - if (defined $check->{'crit'} && $check->{'crit'} =~ /:/) { - if (my ($low, $high) = split /:/, $check->{'crit'}) { - $check->{'crit.low'} = $low; - $check->{'crit.high'} = $high; - } - delete $check->{'crit'}; - } - 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; } @@ -271,12 +278,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; } @@ -339,7 +346,7 @@ $result = $errors{$code} if ($c <= $data); } - } elsif (defined $check->{$code}) { + } elsif (@{ $check->{$code} }) { my $matched = 0; foreach my $c (@{ $check->{$code} }) { @@ -354,7 +361,7 @@ $c =~ s/[^\d\.]//g; unless (length $c) { - warn "INVALID CHECK (" . $check->{$code} . + warn "INVALID CHECK (" . $c . ") for '$sensor->{'id'}':$code"; next; } @@ -371,7 +378,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'}) { @@ -412,16 +419,16 @@ low, high, crit, warn, crit.low, crit.high, warn.low, warn.high 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. + 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 (:). +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.2 $'); + print_revision($PROGNAME, '$Revision: 1.11 $'); }