version 1.16, 2006/10/25 19:36:46 |
version 1.20, 2006/12/05 00:17:47 |
|
|
#!/usr/bin/perl -T |
#!/usr/bin/perl -T |
# $RedRiver: check_hw_sensors,v 1.15 2006/10/25 18:35:59 andrew Exp $ |
# $RedRiver: check_hw_sensors,v 1.19 2006/12/04 23:33:53 andrew Exp $ |
######################################################################## |
######################################################################## |
# check_hw_sensors *** A nagios check for OpenBSD hw.sensors |
# check_hw_sensors *** A nagios check for OpenBSD hw.sensors |
# |
# |
|
|
use constant NAGIOS_OUTPUT => 1; |
use constant NAGIOS_OUTPUT => 1; |
|
|
use POSIX; |
use POSIX; |
|
use Config; |
use lib "/usr/local/libexec/nagios"; |
use lib "/usr/local/libexec/nagios"; |
use utils qw($TIMEOUT %ERRORS &print_revision &support); |
use utils qw($TIMEOUT %ERRORS &print_revision &support); |
|
|
|
|
my $GETCAP = '/usr/bin/getcap'; |
my $GETCAP = '/usr/bin/getcap'; |
my $BASE = 'hw.sensors'; |
my $BASE = 'hw.sensors'; |
my $DEFAULT_CONFIG = '/etc/sensorsd.conf'; |
my $DEFAULT_CONFIG = '/etc/sensorsd.conf'; |
|
my $OSVer = $Config{'osvers'} || 0; |
|
|
my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK |
my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK |
my %states; # This stores the count of states; |
my %states; # This stores the count of states; |
|
|
"warning|w=s" => \$warning, |
"warning|w=s" => \$warning, |
"critical|c=s" => \$critical, |
"critical|c=s" => \$critical, |
); |
); |
|
|
# set the default this way so it only happens if someone typed -f or --filename |
# set the default this way so it only happens if someone typed -f or --filename |
$filename = $DEFAULT_CONFIG if (defined $filename && $filename eq ''); |
$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) { |
if ($status == 0) { |
print_help() ; |
print_help() ; |
exit $ERRORS{'OK'}; |
exit $ERRORS{'OK'}; |
|
|
my ($id, $output) = split /=/; |
my ($id, $output) = split /=/; |
my @o = split /,\s*/, $output; |
my @o = split /,\s*/, $output; |
|
|
my $source = $o[0]; |
my ($type, $source, $descr, $data, $status); |
my $descr = $o[1]; |
|
my $status = $o[2] if @o == 5; |
|
my $type = $o[-2]; |
|
my $data = $o[-1]; |
|
|
|
|
$source = $o[0]; |
|
$descr = $o[1]; |
|
|
|
if ($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} = { |
$SENSORS{$id} = { |
id => $id, |
id => $id, |
output => $output, |
output => $output, |
|
|
return $result unless ref $sensor eq 'HASH'; |
return $result unless ref $sensor eq 'HASH'; |
$check = parse_check($sensor->{'type'}, $check) if $check; |
$check = parse_check($sensor->{'type'}, $check) if $check; |
|
|
unless ($check) { |
# It looks like doing this should be safe, from |
if ($sensor->{'status'}) { |
# src/sbin/sysctl/sysctl.c |
# It looks like doing this should be safe, from |
return $sensor->{'status'} unless $check; |
# src/sbin/sysctl/sysctl.c |
|
$result = $sensor->{'status'} |
|
} else { |
|
return undef; |
|
} |
|
return $result; |
|
} |
|
|
|
return undef if $check eq 'IGNORE'; |
return undef if $check eq 'IGNORE'; |
|
|
$result = 'OK'; |
$result = 'OK'; |
foreach my $code ('warn', 'crit') { |
foreach my $code ('warn', 'crit') { |
if ( |
if ( |
$sensor->{'type'} eq 'volts_dc' || |
|
$sensor->{'type'} eq 'fanrpm' || |
$sensor->{'type'} eq 'fanrpm' || |
$sensor->{'type'} eq 'raw' |
$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'}; |
my $data = $sensor->{'data'}; |
$data =~ s/[^\d\.]//g; |
$data =~ s/[^\d\.]//g; |
|
|
} elsif ($sensor->{'type'} eq 'temp') { |
} elsif ($sensor->{'type'} eq 'temp') { |
my ($degC, $degF) = split /\//, $sensor->{'data'}; |
my ($degC, $degF) = split /\//, $sensor->{'data'}; |
$degC =~ s/[^\d\.]//g; |
$degC =~ s/[^\d\.]//g; |
|
$degF ||= $degC * 9 / 5 + 32; |
$degF =~ s/[^\d\.]//g; |
$degF =~ s/[^\d\.]//g; |
if ( |
if ( |
defined $check->{$code . ".low"} || |
defined $check->{$code . ".low"} || |
|
|
$sensor->{'type'} eq 'drive' || |
$sensor->{'type'} eq 'drive' || |
$sensor->{'type'} eq 'indicator' |
$sensor->{'type'} eq 'indicator' |
) { |
) { |
|
$sensor->{'type'} =~ s/^drive\s+//; |
if (@{ $check->{$code} }) { |
if (@{ $check->{$code} }) { |
my $matched = 0; |
my $matched = 0; |
foreach (@{ $check->{$code} }) { |
foreach (@{ $check->{$code} }) { |
|
|
} |
} |
|
|
} else { |
} else { |
|
print STDERR 'Unknown Sensor Type: ', |
|
$sensor->{'id'}, |
|
'=', |
|
$sensor->{'type'}, |
|
"\n"; |
$result = 'UNKNOWN'; |
$result = 'UNKNOWN'; |
} |
} |
|
|
|
|
|
|
Usage: |
Usage: |
-i, --ignore-status |
-i, --ignore-status |
Whether to check the "status" of the sensors that report it. |
Don't check the status of sensors that report it. |
Normally enabled, pass this |
|
-f, --filename=FILE |
-f, --filename=FILE |
FILE to load checks from (defaults to /etc/sensorsd.conf) |
FILE to load checks from (defaults to /etc/sensorsd.conf) |
-s, --sensor=ID |
-s, --sensor=ID |
|
|
-c, --critical=RANGE or single ENTRY |
-c, --critical=RANGE or single ENTRY |
Exit with CRITICAL status if outside of RANGE or if != 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 |
FILE is in the same format as sensorsd.conf(5) plus some additional |
entries. These additional entries in the file are ignored by |
entries. These additional entries in the file are ignored by |
sensorsd(8). |
sensorsd(8). |
|
|
An ENTRY depends on the type. The descriptions in sensorsd.conf(5) |
An ENTRY depends on the type. The descriptions in sensorsd.conf(5) |
can be used when appropriate, or you can use the following: |
can be used when appropriate, or you can use the following: |
|
|
volts_dc, fanrpm or raw - Anything that includes digits. |
fanrpm, volts_dc, amps, watthour, amphour, integer (raw), percent, |
Both the value of the check and the value of the sensor |
lux or timedelta - Anything that includes digits. Both the value of |
response that are not either a digit or period are stripped |
the check and the value of the sensor response that are not either a |
and then the two resultant values are compared. |
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, |
temp - Can be as above, but if the entry has an F in it, |
it compares farenheit, otherwise it uses celcius. |
it compares farenheit, otherwise it uses celcius. |
|
|
indicator or drive - does a case sensitive match of each |
indicator or drive - does a case sensitive match of each |
entry in the comma separated list and if it does not match |
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) |
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. |
may be a RANGE or a comma separated list of acceptable values. |