=================================================================== RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v retrieving revision 1.15 retrieving revision 1.23 diff -u -r1.15 -r1.23 --- nagios/check_hw_sensors/check_hw_sensors 2006/10/25 19:35:59 1.15 +++ nagios/check_hw_sensors/check_hw_sensors 2007/01/22 02:38:35 1.23 @@ -1,5 +1,5 @@ #!/usr/bin/perl -T -# $RedRiver: check_hw_sensors,v 1.14 2006/05/04 01:30:29 andrew Exp $ +# $RedRiver: check_hw_sensors,v 1.22 2007/01/06 03:16:41 andrew Exp $ ######################################################################## # check_hw_sensors *** A nagios check for OpenBSD hw.sensors # @@ -16,6 +16,7 @@ use constant NAGIOS_OUTPUT => 0; use POSIX; +use Config; use lib "/usr/local/libexec/nagios"; use utils qw($TIMEOUT %ERRORS &print_revision &support); @@ -28,6 +29,7 @@ my $GETCAP = '/usr/bin/getcap'; my $BASE = 'hw.sensors'; my $DEFAULT_CONFIG = '/etc/sensorsd.conf'; +my $OSVer = $Config{'osvers'} || 0; my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK my %states; # This stores the count of states; @@ -52,17 +54,70 @@ "warning|w=s" => \$warning, "critical|c=s" => \$critical, ); - + # set the default this way so it only happens if someone typed -f or --filename $filename = $DEFAULT_CONFIG if (defined $filename && $filename eq ''); +# Stuff is output in this file by print_sensor() +# http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/sysctl/sysctl.c +my @Type_Map = ( + { + type => 'temp', + regex => qr/\sdegC$/, + }, + { + type => 'fanrpm', + regex => qr/\sRPM$/, + }, + { + type => 'volts_dc', + regex => qr/\sV\sDC$/, + }, + { + type => 'amps', + regex => qr/\sA$/, + }, + { + type => 'watthour', + regex => qr/\sWh$/, + }, + { + type => 'amphour', + regex => qr/\sAh$/, + }, + { + type => 'indicator', + regex => qr/^(On|Off)$/, + }, + { + type => 'integer', + regex => qr/\sraw$/, + }, + { + type => 'percent', + regex => qr/\s\%$/, + }, + { + type => 'lux', + regex => qr/\slx$/, + }, + { + type => 'drive', + regex => qr/^drive\s/, + }, + { + type => 'timedelta', + regex => qr/\ssecs$/, + }, +); + if ($status == 0) { print_help() ; exit $ERRORS{'OK'}; } if ($opt_V) { - print_revision($PROGNAME,'$Revision: 1.15 $ '); + print_revision($PROGNAME,'$Revision: 1.23 $ '); exit $ERRORS{'OK'}; } @@ -98,14 +153,38 @@ #while (<>) { chomp; my ($id, $output) = split /=/; + my @s = split /\./, $id; my @o = split /,\s*/, $output; - my $source = $o[0]; - my $descr = $o[1]; - my $status = $o[2] if @o == 5; - my $type = $o[-2]; - my $data = $o[-1]; + my ($type, $source, $descr, $data, $status); + $source = $o[0]; + $descr = $o[1]; + + if (@s == 4) { # XXX This mebbe needs to end up $OSVer >= 4.1 + $data = $o[0]; + if ($data =~ s/\s+\((.*)\).*$//) { + $descr = $1; + } + $status = $o[1]; + ($source, $type) = $id =~ /([^\.]+)\.([^\.]+)\d+$/; + } elsif ($OSVer >= 4.0) { + $data = $o[2]; + $status = $o[3]; + foreach my $t (@Type_Map) { + if ($data =~ /$t->{'regex'}/) { + $type = $t->{'type'}; + last; + } + } + } else { + $data = $o[-1]; + $status = $o[2] if @o == 5; + $type = $o[-2]; + } + + $type ||= 'unknown'; + $SENSORS{$id} = { id => $id, output => $output, @@ -241,25 +320,27 @@ return $result unless ref $sensor eq 'HASH'; $check = parse_check($sensor->{'type'}, $check) if $check; - 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; - } + # It looks like doing this should be safe, from + # src/sbin/sysctl/sysctl.c + return $sensor->{'status'} unless $check; return undef if $check eq 'IGNORE'; $result = 'OK'; foreach my $code ('warn', 'crit') { if ( - $sensor->{'type'} eq 'volts_dc' || + $sensor->{'type'} eq 'fan' || $sensor->{'type'} eq 'fanrpm' || - $sensor->{'type'} eq 'raw' + $sensor->{'type'} eq 'volt' || + $sensor->{'type'} eq 'volts_dc' || + $sensor->{'type'} eq 'amps' || + $sensor->{'type'} eq 'watthour' || + $sensor->{'type'} eq 'amphour' || + $sensor->{'type'} eq 'integer' || + $sensor->{'type'} eq 'raw' || + $sensor->{'type'} eq 'percent' || + $sensor->{'type'} eq 'lux' || + $sensor->{'type'} eq 'timedelta' ) { my $data = $sensor->{'data'}; $data =~ s/[^\d\.]//g; @@ -318,6 +399,7 @@ } elsif ($sensor->{'type'} eq 'temp') { my ($degC, $degF) = split /\//, $sensor->{'data'}; $degC =~ s/[^\d\.]//g; + $degF ||= $degC * 9 / 5 + 32; $degF =~ s/[^\d\.]//g; if ( defined $check->{$code . ".low"} || @@ -397,6 +479,7 @@ $sensor->{'type'} eq 'drive' || $sensor->{'type'} eq 'indicator' ) { + $sensor->{'data'} =~ s/^drive\s+//; if (@{ $check->{$code} }) { my $matched = 0; foreach (@{ $check->{$code} }) { @@ -409,6 +492,11 @@ } } else { + print STDERR 'Unknown Sensor Type: ', + $sensor->{'id'}, + '=', + $sensor->{'type'}, + "\n"; $result = 'UNKNOWN'; } @@ -424,8 +512,7 @@ Usage: -i, --ignore-status - Whether to check the "status" of the sensors that report it. - Normally enabled, pass this + Don't check the status of sensors that report it. -f, --filename=FILE FILE to load checks from (defaults to /etc/sensorsd.conf) -s, --sensor=ID @@ -435,8 +522,6 @@ -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) plus some additional entries. These additional entries in the file are ignored by sensorsd(8). @@ -449,17 +534,18 @@ 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. + fanrpm, volts_dc, amps, watthour, amphour, integer (raw), percent, + lux or timedelta - 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. + any of the entries, it sets 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. @@ -480,6 +566,6 @@ EOL - print_revision($PROGNAME, '$Revision: 1.15 $'); + print_revision($PROGNAME, '$Revision: 1.23 $'); }