=================================================================== RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- nagios/check_hw_sensors/check_hw_sensors 2006/05/04 02:30:29 1.14 +++ nagios/check_hw_sensors/check_hw_sensors 2006/10/25 19:35:59 1.15 @@ -1,5 +1,5 @@ #!/usr/bin/perl -T -# $RedRiver: check_hw_sensors,v 1.13 2006/05/03 22:16:42 andrew Exp $ +# $RedRiver: check_hw_sensors,v 1.14 2006/05/04 01:30:29 andrew Exp $ ######################################################################## # check_hw_sensors *** A nagios check for OpenBSD hw.sensors # @@ -7,19 +7,13 @@ ######################################################################## # TODO: # Really need real documentation. -# -# 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; - %ENV = (); -use constant NAGIOS_OUTPUT => 1; +use constant NAGIOS_OUTPUT => 0; use POSIX; use lib "/usr/local/libexec/nagios"; @@ -38,6 +32,7 @@ my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK my %states; # This stores the count of states; my $filename; +my $ignore_status; my $sensor; my $warning; my $critical; @@ -50,12 +45,12 @@ #Option checking my $status = GetOptions( - "version|V" => \$opt_V, - "help|h" => \$opt_h, - "filename|f:s" => \$filename, - "sensor|s=s" => \$sensor, - "warning|w=s" => \$warning, - "critical|c=s" => \$critical, + "version|V" => \$opt_V, + "filename|f:s" => \$filename, + "ignore-status|i" => \$ignore_status, + "sensor|s=s" => \$sensor, + "warning|w=s" => \$warning, + "critical|c=s" => \$critical, ); # set the default this way so it only happens if someone typed -f or --filename @@ -67,17 +62,14 @@ } if ($opt_V) { - print_revision($PROGNAME,'$Revision: 1.14 $ '); + print_revision($PROGNAME,'$Revision: 1.15 $ '); exit $ERRORS{'OK'}; } -if ($opt_h) { - print_help(); - exit $ERRORS{'OK'}; -} - -unless ( ( +unless ( + ( defined $filename || + (not defined $ignore_status) || (defined $sensor && ($warning || $critical)) ) && ( (!defined $filename) || (!defined $sensor) ) @@ -93,10 +85,9 @@ } $CHECK_SENSOR = $sensor; - $CHECKS{$sensor} = { - 'warn' => $warning, - 'crit' => $critical, - }; + $CHECKS{$sensor}{'warn'} = $warning if defined $warning; + $CHECKS{$sensor}{'crit'} = $critical if defined $critical; + } elsif (defined $filename) { %CHECKS = parse_file($filename); } @@ -136,18 +127,21 @@ $_a <=> $_b; } -foreach my $check (sort as_if_numeric keys %CHECKS) { - if (exists $SENSORS{$check}) { - my $r = check_sensor($CHECKS{$check}, $SENSORS{$check}); - push @{ $states{ $r } }, - $check . '=' . $SENSORS{$check}{'output'}; +foreach my $s (sort as_if_numeric keys %SENSORS) { + my ($r, $data); + if (exists $CHECKS{$s}) { + $r = check_sensor($SENSORS{$s}, $CHECKS{$s}); + $data = $s . '=' . $SENSORS{$s}{'output'}; + } elsif (not $ignore_status) { + $r = check_sensor($SENSORS{$s}); + $data = $s . '=' . $SENSORS{$s}{'output'}; } else { - push @{ $states{'UNKNOWN'} }, $check . '=No sensor with this id'; + # ignore this sensor } + next unless defined $r; + push @{ $states{ $r } }, $data; } -#print Dumper \%states; - $state = 'OK'; my $have_results = 0; foreach my $error (sort { $ERRORS{$a} <=> $ERRORS{$b} } keys %ERRORS) { @@ -162,7 +156,7 @@ print "$error (" . scalar(@{ $states{ $error } }) . ")"; unless ($error eq 'OK') { print '
'; - print map { " - $_
" } @{ $states{ $error } }; + print map {" - $_
"} @{ $states{ $error } }; } } else { print "$error (" . scalar(@{ $states{ $error } }) . "):\n"; @@ -181,15 +175,23 @@ sub parse_file { my $filename = shift; my %contents; + + die "file '$filename' does not exist." unless -e $filename; open my $fh, '-|', $GETCAP, '-a', '-f', $filename or die "Couldn't open FILE '$GETCAP -a -f $filename': $!"; - while (<$fh>) { + LINE: while (<$fh>) { chomp; my ($key, @c) = split /\:/; foreach (@c) { my ($k, $v) = split /\=/; - $contents{$key}{$k} = $v; + if (lc($k) eq 'ignore') { + $contents{$key}{'IGNORE'} = 1; + } elsif (lc($k) eq 'status') { + $contents{$key}{'STATUS'} = 1; + } else { + $contents{$key}{$k} = $v; + } } } close $fh; @@ -201,6 +203,10 @@ my $type = shift; my $check = shift; + return undef unless $check; + return undef if $check->{'STATUS'}; + return 'IGNORE' if $check->{'IGNORE'}; + foreach my $code ('crit', 'warn') { if (defined $check->{$code} && $check->{$code} =~ /:/) { if (my ($low, $high) = split /:/, $check->{$code}) { @@ -224,8 +230,8 @@ } sub check_sensor { - my $check = shift; my $sensor = shift; + my $check = shift; my $result = 'UNKNOWN'; my %errors = ( 'warn' => 'WARNING', @@ -233,12 +239,22 @@ ); return $result unless ref $sensor eq 'HASH'; + $check = parse_check($sensor->{'type'}, $check) if $check; - $check = parse_check($sensor->{'type'}, $check); - #print Dumper $check, $sensor; + unless ($check) { + if ($sensor->{'status'}) { + # It looks like doing this should be safe, from + # src/sbin/sysctl/sysctl.c + $result = $sensor->{'status'} + } else { + return undef; + } + return $result; + } - $result = 'OK'; + return undef if $check eq 'IGNORE'; + $result = 'OK'; foreach my $code ('warn', 'crit') { if ( $sensor->{'type'} eq 'volts_dc' || @@ -291,7 +307,7 @@ next; } - if ($_ eq $data) { + if ($c eq $data) { $matched = 1; last; } @@ -369,7 +385,7 @@ next; } - if ($_ eq $data) { + if ($c eq $data) { $matched = 1; last; } @@ -404,9 +420,12 @@ sub print_help { print <]|(-s -w limit -c limit)) + $PROGNAME [-i] (-f []|(-s [-w limit] [-c limit])) Usage: + -i, --ignore-status + Whether to check the "status" of the sensors that report it. + Normally enabled, pass this -f, --filename=FILE FILE to load checks from (defaults to /etc/sensorsd.conf) -s, --sensor=ID @@ -424,7 +443,8 @@ $PROGNAME understands the following entries: - low, high, crit, warn, crit.low, crit.high, warn.low, warn.high + low, high, crit, warn, crit.low, crit.high, warn.low, warn.high, + ignore, status An ENTRY depends on the type. The descriptions in sensorsd.conf(5) can be used when appropriate, or you can use the following: @@ -451,8 +471,15 @@ It can also be low: or :high with the other side left blank to only make the single check.. +An entry marked "ignore" will cause that sensor to be skipped. +Generally used with state checking of all sensors to ignore sensors you +don't care about or that report incorrectly. + +If you are using --ignore-status, you can still check the status of +individual sensors with a status entry. + EOL - - print_revision($PROGNAME, '$Revision: 1.14 $'); + + print_revision($PROGNAME, '$Revision: 1.15 $'); }