=================================================================== RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v retrieving revision 1.40 retrieving revision 1.45 diff -u -r1.40 -r1.45 --- nagios/check_hw_sensors/check_hw_sensors 2009/11/11 18:14:40 1.40 +++ nagios/check_hw_sensors/check_hw_sensors 2010/04/27 20:09:11 1.45 @@ -1,5 +1,5 @@ #!/usr/bin/perl -T -# $RedRiver: check_hw_sensors,v 1.39 2009/11/11 18:14:00 andrew Exp $ +# $AFresh1: check_hw_sensors,v 1.41 2009/11/12 18:53:52 andrew Exp $ ######################################################################## # check_hw_sensors *** A nagios check for OpenBSD sysctl hw.sensors # @@ -10,8 +10,15 @@ local %ENV = (); +use POSIX; +use Config; +use Getopt::Long; +use List::Util qw/ first /; + my $NAGIOS_OUTPUT = 1; +our $VERSION = q{$Revision: 1.45 $}; $VERSION =~ s/^\D+([\d\.]+)\D+$/v$1/xms; + my $LICENSE = <<'EOL'; Copyright (c) 2009 Andrew Fresh Permission to use, copy, modify, and distribute this software for any @@ -27,8 +34,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. EOL -use POSIX; -use Config; +my $PROGNAME = 'check_hw_sensors'; +my $SYSCTL = '/sbin/sysctl'; +my $GETCAP = '/usr/bin/getcap'; +my $BASE = 'hw.sensors'; +my $DEFAULT_CONFIG = '/etc/sensorsd.conf'; + my $PREFIX; BEGIN { @@ -39,17 +50,16 @@ use lib $PREFIX . '/libexec/nagios'; use utils qw($TIMEOUT %ERRORS &support); -use Getopt::Long; +$SIG{'ALRM'} = sub { + print "ERROR: $PROGNAME timeout\n"; + exit $ERRORS{'UNKNOWN'}; +}; +alarm $TIMEOUT; + Getopt::Long::Configure('bundling'); -my $PROGNAME = 'check_hw_sensors'; +my $OSVer = $Config{'osvers'} || 0; -my $SYSCTL = '/sbin/sysctl'; -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 $opt_V; my $opt_h; @@ -76,7 +86,7 @@ } if ($opt_V) { - print_revision( $PROGNAME, '$Revision: 1.40 $ ' ); + print_revision( $PROGNAME, $VERSION ); exit $ERRORS{'OK'}; } @@ -86,7 +96,9 @@ } # set the default this way so it only happens if someone typed -f or --filename -$FILENAME = $DEFAULT_CONFIG if ( defined $FILENAME && $FILENAME eq q{} ); +if ( defined $FILENAME && $FILENAME eq q{} ) { + $FILENAME = $DEFAULT_CONFIG; +} # Stuff is output in this file by print_sensor() # http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/sysctl/sysctl.c @@ -116,7 +128,7 @@ regex => qr/\sraw$/xms, }, { type => 'percent', - regex => qr/\s\%$/xms, + regex => qr/\d\%$/xms, }, { type => 'lux', regex => qr/\slx$/xms, @@ -127,6 +139,16 @@ { type => 'timedelta', regex => qr/\ssecs$/xms, }, + # These below are newer than TYPE_MAP is ever used, so really, useless + { type => 'humidity', + regex => qr/\d\%$/xms, + }, + { type => 'frequency', + regex => qr/\s Hz$/xms, + }, + { type => 'angle', + regex => qr/\s degrees$/xms, + }, ); my $CHECK_SENSOR = $BASE; @@ -137,8 +159,8 @@ } $CHECK_SENSOR = $SENSOR; - $CHECKS{$SENSOR}{'warn'} = $WARNING if $WARNING; - $CHECKS{$SENSOR}{'crit'} = $CRITICAL if $CRITICAL; + if ($WARNING) { $CHECKS{$SENSOR}{'warn'} = $WARNING; } + if ($CRITICAL) { $CHECKS{$SENSOR}{'crit'} = $CRITICAL; } } elsif ( defined $FILENAME ) { %CHECKS = read_file($FILENAME); @@ -180,7 +202,7 @@ sub read_sensors { my ($sensor) = @_; my @S; - open my $sysctl, '-|', $SYSCTL, $sensor + open my $sysctl, q{-|}, $SYSCTL, $sensor or die "Couldn't open sysctl: $!\n"; while (<$sysctl>) { chomp; @@ -198,6 +220,7 @@ sub parse_sensor { my ($sensor) = @_; + ## no critic 'literal' my ( $id, $output ) = split /=/xms, $sensor; my @s = split /\./xms, $id; my @o = split /,\s*/xms, $output; @@ -248,9 +271,9 @@ my $filename = shift; my %contents; - die "file '$filename' does not exist.\n" unless -e $filename; + die "file '$filename' does not exist.\n" if !-e $filename; - open my $fh, '-|', $GETCAP, '-a', '-f', $filename + open my $fh, q{-|}, $GETCAP, q{-a}, q{-f}, $filename or die "Couldn't open '$GETCAP -a -f $filename': $!\n"; while (<$fh>) { chomp; @@ -281,7 +304,7 @@ sub parse_check { my $check = shift; - return unless $check; + return if !$check; return 'STATUS' if $check->{'STATUS'}; return 'IGNORE' if $check->{'IGNORE'}; @@ -295,7 +318,7 @@ } foreach my $direction ( 'low', 'high' ) { - my $c = $code . '.' . $direction; + my $c = $code . q{.} . $direction; if ( defined $check->{$direction} ) { $check->{$c} ||= $check->{$direction}; } @@ -329,11 +352,11 @@ my ( $r, $data ); if ( exists $C->{ $sensor->{id} } ) { $r = check_sensor( $sensor, $C->{ $sensor->{id} } ); - $data = $sensor->{id} . '=' . $sensor->{output}; + $data = $sensor->{id} . q{=} . $sensor->{output}; } elsif ( $sensor->{status} && !$O->{IGNORE_STATUS} ) { $r = check_sensor( $sensor, { STATUS => 1 } ); - $data = $sensor->{id} . '=' . $sensor->{output}; + $data = $sensor->{id} . q{=} . $sensor->{output}; } else { @@ -352,7 +375,7 @@ my ( $sensor, $check ) = @_; my $result = 'UNKNOWN'; - return $result unless ref $sensor eq 'HASH'; + return $result if ref $sensor ne 'HASH'; $check = parse_check($check) if $check; if ( !$check ) { return $result; } @@ -365,25 +388,31 @@ elsif ( $check eq 'IGNORE' ) { return; } my $type = $sensor->{'type'}; - if (grep { $type eq $_ } + if (first { $type eq $_ } qw( - fan fanrpm - volt volts_dc - amps watthour amphour - integer raw percent - lux temp timedelta + temp + fan fanrpm + volt acvolt volts_dc + resistance + power watt current amps + watthour amphour + raw + integer percent + illuminance lux + timedelta + humidity frequency angle ) ) { $result = check_sensor_numeric( $sensor->{'data'}, $check ); } - elsif ( grep { $type eq $_ } qw( drive indicator ) ) { + elsif ( first { $type eq $_ } qw( drive indicator ) ) { my $data = $sensor->{'data'}; $data =~ s/^drive\s+//xms; $result = check_sensor_list( $data, $check ); } else { - warn 'Unknown Sensor Type: ', $sensor->{'id'}, '=', $type, "\n"; + warn "Unknown Sensor Type: $sensor->{id} = $type\n"; } return $result; @@ -536,7 +565,7 @@ EOL - print_revision( $PROGNAME, '$Revision: 1.40 $' ); + print_revision( $PROGNAME, $VERSION ); print $LICENSE; @@ -545,7 +574,6 @@ sub print_revision { my ( $prog, $rev ) = @_; - $rev =~ s/^\D+([\d\.]+)\D+$/v$1/xms; print "$prog $rev\n";