===================================================================
RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v
retrieving revision 1.12
retrieving revision 1.16
diff -u -r1.12 -r1.16
--- nagios/check_hw_sensors/check_hw_sensors 2006/05/03 22:54:43 1.12
+++ nagios/check_hw_sensors/check_hw_sensors 2006/10/25 19:36:46 1.16
@@ -1,5 +1,5 @@
-#!/usr/bin/perl
-# $RedRiver: check_hw_sensors,v 1.11 2006/05/03 20:01:09 holligan Exp $
+#!/usr/bin/perl -T
+# $RedRiver: check_hw_sensors,v 1.15 2006/10/25 18:35:59 andrew Exp $
########################################################################
# check_hw_sensors *** A nagios check for OpenBSD hw.sensors
#
@@ -7,15 +7,11 @@
########################################################################
# 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;
@@ -36,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;
@@ -48,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
@@ -65,17 +62,14 @@
}
if ($opt_V) {
- print_revision($PROGNAME,'$Revision: 1.12 $ ');
+ print_revision($PROGNAME,'$Revision: 1.16 $ ');
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) )
@@ -91,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);
}
@@ -134,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) {
@@ -160,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";
@@ -179,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;
@@ -199,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}) {
@@ -222,8 +230,8 @@
}
sub check_sensor {
- my $check = shift;
my $sensor = shift;
+ my $check = shift;
my $result = 'UNKNOWN';
my %errors = (
'warn' => 'WARNING',
@@ -231,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' ||
@@ -289,7 +307,7 @@
next;
}
- if ($_ eq $data) {
+ if ($c eq $data) {
$matched = 1;
last;
}
@@ -367,7 +385,7 @@
next;
}
- if ($_ eq $data) {
+ if ($c eq $data) {
$matched = 1;
last;
}
@@ -402,26 +420,31 @@
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
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
+ -c, --critical=RANGE or single ENTRY
Exit with CRITICAL status if outside of RANGE or if != ENTRY
-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).
+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).
$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:
@@ -448,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.12 $');
+
+ print_revision($PROGNAME, '$Revision: 1.16 $');
}