=================================================================== RCS file: /cvs/nagios/check_hw_sensors/check_hw_sensors,v retrieving revision 1.4 retrieving revision 1.31 diff -u -r1.4 -r1.31 --- nagios/check_hw_sensors/check_hw_sensors 2006/05/02 16:54:42 1.4 +++ nagios/check_hw_sensors/check_hw_sensors 2009/11/10 18:24:56 1.31 @@ -1,46 +1,57 @@ -#!/usr/bin/perl -# $RedRiver: check_hw_sensors,v 1.3 2006/05/02 01:39:23 andrew Exp $ +#!/usr/bin/perl -T +# $RedRiver: check_hw_sensors,v 1.30 2009/11/09 23:13:04 andrew Exp $ ######################################################################## -# check_hw_sensors *** A nagios check for OpenBSD hw.sensors -# -# 2006.05.01 #*#*# andrew fresh +# check_hw_sensors *** A nagios check for OpenBSD sysctl hw.sensors +# +# 2006.05.01 #*#*# andrew fresh ######################################################################## -# TODO: -# Really need to fix the documentation issue. -# -# 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; +my $License = <<'EOL'; +Copyright (c) 2009 Andrew Fresh +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +EOL + use POSIX; +use Config; use lib "/usr/local/libexec/nagios"; -#use lib $ENV{'HOME'}; -use utils qw($TIMEOUT %ERRORS &print_revision &support); +use utils qw($TIMEOUT %ERRORS &support); use Getopt::Long; Getopt::Long::Configure('bundling'); my $PROGNAME = "check_hw_sensors"; -my $SYSCTL = '/sbin/sysctl'; -my $GETCAP = '/usr/bin/getcap'; -my $BASE = 'hw.sensors'; +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 %states; # This stores the count of states; +my $state = 'UNKNOWN'; # tells whether the it is warning, critical, or OK +my %states; # This stores the count of states; +my $opt_V; +my $opt_h; +my $ignore_status; my $filename; my $sensor; my $warning; my $critical; -my $opt_h ; -my $opt_V ; my $CHECK_SENSOR = $BASE; my %CHECKS; @@ -48,403 +59,541 @@ #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, + "help|h" => \$opt_h, + "ignore-status|i" => \$ignore_status, + "filename|f:s" => \$filename, + "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 -$filename = $DEFAULT_CONFIG if (defined $filename && $filename eq ''); +$filename = $DEFAULT_CONFIG if ( defined $filename && $filename eq '' ); -if ($status == 0) { - print_help() ; - exit $ERRORS{'OK'}; +# 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.4 $ '); - exit $ERRORS{'OK'}; + print_revision( $PROGNAME, '$Revision: 1.31 $ ' ); + exit $ERRORS{'OK'}; } if ($opt_h) { - print_help(); - exit $ERRORS{'OK'}; + print_help(); + exit $ERRORS{'OK'}; } -unless ( ( - defined $filename || - (defined $sensor && ($warning || $critical)) - ) && - ( (!defined $filename) || (!defined $sensor) ) -) { - print_help(); - exit $ERRORS{'OK'}; -} +if ( defined $sensor ) { + if ( $sensor !~ /^$BASE/ ) { + $sensor = $BASE . '.' . $sensor; + } + $CHECK_SENSOR = $sensor; + $CHECKS{$sensor}{'warn'} = $warning if defined $warning; + $CHECKS{$sensor}{'crit'} = $critical if defined $critical; -if (defined $sensor) { - if ($sensor !~ /^$BASE/) { - $sensor = $BASE . '.' . $sensor; - } - $CHECK_SENSOR = $sensor; - - $CHECKS{$sensor} = { - 'warn' => $warning, - 'crit' => $critical, - }; -} elsif (defined $filename) { - %CHECKS = parse_file($filename); } +elsif ( defined $filename ) { + %CHECKS = parse_file($filename); +} -open my $sysctl, "-|", $SYSCTL, $CHECK_SENSOR +open my $sysctl, "-|", $SYSCTL, $CHECK_SENSOR or die "Couldn't open sysctl: $!"; while (<$sysctl>) { -#while (<>) { - chomp; - my ($id, $output) = split /=/; - 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]; + #while (<>) { + chomp; + my ( $id, $output ) = split /=/; + my @s = split /\./, $id; + my @o = split /,\s*/, $output; - $SENSORS{$id} = { - id => $id, - output => $output, - source => $source, - description => $descr, - status => $status, - type => $type, - data => $data, - }; - + my ( $type, $source, $descr, $data, $status ); + + $source = $o[0]; + $descr = $o[1]; + + if ( $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, + source => $source, + description => $descr, + status => $status, + type => $type, + data => $data, + }; + } close $sysctl; sub as_if_numeric { - my $_a = $a; - my $_b = $b; - $_a =~ s/\D//g; - $_b =~ s/\D//g; - $_a <=> $_b; + my $_a = $a; + my $_b = $b; + $_a =~ s/\D//g; + $_b =~ s/\D//g; + $_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'}; - } else { - # XXX Error missing sensor - push @{ $states{'UNKNOWN'} }, $check . '=No sensor with this id'; - } +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 ( !$ignore_status ) { + $r = check_sensor( $SENSORS{$s} ); + $data = $s . '=' . $SENSORS{$s}{'output'}; + } + else { + + # ignore this sensor + } + next unless defined $r; + push @{ $states{$r} }, $data; } -#print Dumper \%states; - $state = 'OK'; -if (NAGIOS_OUTPUT) { - print '
    '; +my $have_results = 0; +foreach my $error ( sort { $ERRORS{$a} <=> $ERRORS{$b} } keys %ERRORS ) { + if ( exists $states{$error} ) { + $have_results++; + $state = $error; + } } -foreach my $error (sort { $ERRORS{$b} <=> $ERRORS{$a} } keys %ERRORS) { - if (exists $states{$error}) { - if (NAGIOS_OUTPUT) { - print "
  • $error (" . scalar(@{ $states{ $error } }) . "):
      "; - foreach (@{ $states{ $error } }) { - print "
    • $_
    • "; - } - print "
  • " - } else { - print "$error (" . scalar(@{ $states{ $error } }) . "):\n"; - foreach (@{ $states{ $error } }) { - print " $_\n"; - } - } - } +foreach my $error ( sort { $ERRORS{$b} <=> $ERRORS{$a} } keys %ERRORS ) { + if ( exists $states{$error} ) { + if (NAGIOS_OUTPUT) { + print "$error (" . scalar( @{ $states{$error} } ) . ")"; + if ( $error ne 'OK' ) { + print '
    '; + print map {" - $_
    "} @{ $states{$error} }; + } + } + else { + print "$error (" . scalar( @{ $states{$error} } ) . "):\n"; + foreach ( @{ $states{$error} } ) { + print " $_\n"; + } + } + } } -if (NAGIOS_OUTPUT) { - print '
' . "\n"; +if ( $have_results == 0 ) { + print "No results found\n"; } -foreach my $error (sort { $ERRORS{$a} <=> $ERRORS{$b} } keys %ERRORS) { - if (exists $states{$error}) { - $state = $error; - } -} exit $ERRORS{$state}; - sub parse_file { - my $filename = shift; - my %contents; + my $filename = shift; + my %contents; - open my $fh, '-|', $GETCAP, '-a', '-f', $filename - or die "Couldn't open FILE '$GETCAP -a -f $filename': $!"; - while (<$fh>) { - chomp; - my ($key, @c) = split /\:/; - foreach (@c) { - my ($k, $v) = split /\=/; - $contents{$key}{$k} = $v; - } - } - close $fh; + die "file '$filename' does not exist." unless -e $filename; - return %contents; + open my $fh, '-|', $GETCAP, '-a', '-f', $filename + or die "Couldn't open FILE '$GETCAP -a -f $filename': $!"; + while (<$fh>) { + chomp; + my ( $key, @c ) = split /\:/; + foreach (@c) { + my ( $k, $v ) = split /\=/; + 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; + + return %contents; } sub parse_check { - my $type = shift; - my $check = shift; + my $check = shift; - if (defined $check->{'warn'} && $check->{'warn'} =~ /:/) { - if (my ($low, $high) = split /:/, $check->{'warn'}) { - $check->{'warn.low'} = $low; - $check->{'warn.high'} = $high; - } - delete $check->{'warn'}; - } - if (defined $check->{'crit'} && $check->{'crit'} =~ /:/) { - if (my ($low, $high) = split /:/, $check->{'crit'}) { - $check->{'crit.low'} = $low; - $check->{'crit.high'} = $high; - } - delete $check->{'crit'}; - } + return unless $check; + return if $check->{'STATUS'}; + return 'IGNORE' if $check->{'IGNORE'}; - if (defined $check->{'low'}) { - $check->{'warn.low'} = $check->{'low'} - unless defined $check->{'warn.low'}; - $check->{'crit.low'} = $check->{'low'} - unless defined $check->{'crit.low'}; - } - if (defined $check->{'high'}) { - $check->{'warn.high'} = $check->{'high'} - unless defined $check->{'warn.high'}; - $check->{'crit.high'} = $check->{'high'} - unless defined $check->{'crit.high'}; - } + foreach my $code ( 'crit', 'warn' ) { + if ( defined $check->{$code} && $check->{$code} =~ /:/ ) { + if ( my ( $low, $high ) = split /:/, $check->{$code} ) { + $check->{ $code . '.low' } = $low if length $low; + $check->{ $code . '.high' } = $high if length $high; + } + delete $check->{$code}; + } - no warnings 'uninitialized'; - $check->{'warn'} = [ split /,\s*/, $check->{'warn'} ]; - $check->{'crit'} = [ split /,\s*/, $check->{'crit'} ]; + foreach my $severity ( 'low', 'high' ) { + if ( defined $check->{$severity} ) { + $check->{ $code . '.' . $severity } = $check->{$severity} + if !defined $check->{ $code . '.' . $severity }; + } + } + no warnings 'uninitialized'; + $check->{$code} = [ split /,\s*/, $check->{$code} ]; + } - return $check; + return $check; } sub check_sensor { - my $check = shift; - my $sensor = shift; - my $result = 'UNKNOWN'; - my %errors = ( - 'warn' => 'WARNING', - 'crit' => 'CRITICAL', - ); + my $sensor = shift; + my $check = shift; + my $result = 'UNKNOWN'; + my %errors = ( + 'warn' => 'WARNING', + 'crit' => 'CRITICAL', + ); - return $result unless ref $sensor eq 'HASH'; + return $result unless ref $sensor eq 'HASH'; + $check = parse_check($check) if $check; - $check = parse_check($sensor->{'type'}, $check); - #print Dumper $check, $sensor; + if ( !$check ) { - $result = 'OK'; + # It looks like doing this should be safe, from + # src/sbin/sysctl/sysctl.c + return $sensor->{'status'} if $sensor->{'status'}; - foreach my $code ('warn', 'crit') { - if ( - $sensor->{'type'} eq 'volts_dc' || - $sensor->{'type'} eq 'fanrpm' || - $sensor->{'type'} eq 'raw' - ) { - my $data = $sensor->{'data'}; - $data =~ s/[^\d\.]//g; - unless (length $data) { - warn "INVALID DATA ($sensor->{'data'}) for '$sensor->{'id'}'"; - next; - } + return; + } + elsif ( $check eq 'IGNORE' ) { + return; + } - if ( - defined $check->{$code . ".low"} || - defined $check->{$code . ".high"} - ) { - if (defined $check->{$code . ".low"}) { - my $c = $check->{$code . ".low"}; - $c =~ s/[^\d\.]//g; - - unless (length $c) { - warn "INVALID CHECK (" . $check->{$code . ".low"} . - ") for '$sensor->{'id'}:$code.low'"; - next; - } + $result = 'OK'; + foreach my $code ( 'warn', 'crit' ) { + if ( $sensor->{'type'} eq 'fan' + || $sensor->{'type'} eq 'fanrpm' + || $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; + if ( !length $data ) { + warn + "INVALID DATA ($sensor->{'data'}) for '$sensor->{'id'}'\n"; + next; + } - $result = $errors{$code} - if ($c >= $data); - } - if (defined $check->{$code . ".high"}) { - my $c = $check->{$code . ".high"}; - $c =~ s/[^\d\.]//g; - unless (length $c) { - warn "INVALID CHECK (" . $check->{$code . ".high"} . - ") for '$sensor->{'id'}:$code.high'"; - next; - } + if ( defined $check->{ $code . ".low" } + || defined $check->{ $code . ".high" } ) + { + if ( defined $check->{ $code . ".low" } ) { + my $c = $check->{ $code . ".low" }; + $c =~ s/[^\d\.]//g; - $result = $errors{$code} - if ($c <= $data); - } - } elsif (defined $check->{$code}) { - my $matched = 0; - foreach my $c (@{ $check->{$code} }) { - $c =~ s/[^\d\.]//g; - unless (length $c) { - warn "INVALID CHECK (" . $check->{$code} . - ") for '$sensor->{'id'}:$code'"; - next; - } + if ( !length $c ) { + warn "INVALID CHECK (" + . $check->{ $code . ".low" } + . ") for '$sensor->{'id'}:$code.low'\n"; + next; + } - if ($_ eq $data) { - $matched = 1; - last; - } - } - $result = $errors{$code} unless $matched; - } + $result = $errors{$code} + if ( $c >= $data ); + } + if ( defined $check->{ $code . ".high" } ) { + my $c = $check->{ $code . ".high" }; + $c =~ s/[^\d\.]//g; + if ( !length $c ) { + warn "INVALID CHECK (" + . $check->{ $code . ".high" } + . ") for '$sensor->{'id'}:$code.high'\n"; + next; + } - } elsif ($sensor->{'type'} eq 'temp') { - my ($degC, $degF) = split /\//, $sensor->{'data'}; - $degC =~ s/[^\d\.]//g; - $degF =~ s/[^\d\.]//g; - if ( - defined $check->{$code . ".low"} || - defined $check->{$code . ".high"} - ) { - if (defined $check->{$code . ".low"}) { - my $c = $check->{$code . ".low"}; - my $data = $degC; + $result = $errors{$code} + if ( $c <= $data ); + } + } + elsif ( @{ $check->{$code} } ) { + my $matched = 0; + foreach ( @{ $check->{$code} } ) { + my $c = $_; + $c =~ s/[^\d\.]//g; + if ( !length $c ) { + warn "INVALID CHECK (" . $_ + . ") for '$sensor->{'id'}:$code'\n"; + next; + } - $data = $degF if ($c =~ /F/i); - unless (length $data) { - warn "INVALID DATA (" . $sensor->{'data'} . - ") for '$sensor->{'id'}'"; - next; - } + if ( $c eq $data ) { + $matched = 1; + last; + } + } + $result = $errors{$code} unless $matched; + } - $c =~ s/[^\d\.]//g; - unless (length $c) { - warn "INVALID CHECK (" . $check->{$code . ".low"} . - ") for '$sensor->{'id'}':$code.low"; - next; - } + } + 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" } + || defined $check->{ $code . ".high" } ) + { + if ( defined $check->{ $code . ".low" } ) { + my $c = $check->{ $code . ".low" }; + my $data = $degC; - $result = $errors{$code} - if ($c >= $data); - } - if (defined $check->{$code . ".high"}) { - my $c = $check->{$code . ".high"}; + $data = $degF if ( $c =~ /F/i ); + if ( !length $data ) { + warn "INVALID DATA (" + . $sensor->{'data'} + . ") for '$sensor->{'id'}'\n"; + next; + } - my $data = $degC; - $data = $degF if ($c =~ /F/i); - unless (length $data) { - warn "INVALID DATA (" . $sensor->{'data'} . - ") for '$sensor->{'id'}'"; - next; - } + $c =~ s/[^\d\.]//g; + if ( !length $c ) { + warn "INVALID CHECK (" + . $check->{ $code . ".low" } + . ") for '$sensor->{'id'}':$code.low\n"; + next; + } - $c =~ s/[^\d\.]//g; - unless (length $c) { - warn "INVALID CHECK (" . $check->{$code . ".high"} . - ") for '$sensor->{'id'}:$code.high'"; - next; - } + $result = $errors{$code} + if ( $c >= $data ); + } + if ( defined $check->{ $code . ".high" } ) { + my $c = $check->{ $code . ".high" }; - $result = $errors{$code} - if ($c <= $data); - } - } elsif (defined $check->{$code}) { + my $data = $degC; + $data = $degF if ( $c =~ /F/i ); + if ( !length $data ) { + warn "INVALID DATA (" + . $sensor->{'data'} + . ") for '$sensor->{'id'}'\n"; + next; + } - my $matched = 0; - foreach my $c (@{ $check->{$code} }) { - my $data = $degC; + $c =~ s/[^\d\.]//g; + if ( !length $c ) { + warn "INVALID CHECK (" + . $check->{ $code . ".high" } + . ") for '$sensor->{'id'}:$code.high'\n"; + next; + } - $data = $degF if ($c =~ /F/i); - unless (length $data) { - warn "INVALID DATA (" . $sensor->{'data'} . - ") for '$sensor->{'id'}'"; - next; - } + $result = $errors{$code} + if ( $c <= $data ); + } + } + elsif ( @{ $check->{$code} } ) { - $c =~ s/[^\d\.]//g; - unless (length $c) { - warn "INVALID CHECK (" . $check->{$code} . - ") for '$sensor->{'id'}':$code"; - next; - } + my $matched = 0; + foreach ( @{ $check->{$code} } ) { + my $c = $_; + my $data = $degC; - if ($_ eq $data) { - $matched = 1; - last; - } - } - $result = $errors{$code} unless $matched; - } + $data = $degF if ( $c =~ /F/i ); + if ( !length $data ) { + warn "INVALID DATA (" + . $sensor->{'data'} + . ") for '$sensor->{'id'}'\n"; + next; + } - } elsif ( - $sensor->{'type'} eq 'drive' || - $sensor->{'type'} eq 'indicator' - ) { - if (defined $check->{$code}) { - my $matched = 0; - foreach (@{ $check->{$code} }) { - if ($_ eq $sensor->{'data'}) { - $matched = 1; - last; - } - } - $result = $errors{$code} unless $matched; - } + $c =~ s/[^\d\.]//g; + if ( !length $c ) { + warn "INVALID CHECK (" . $_ + . ") for '$sensor->{'id'}':$code\n"; + next; + } - } else { - $result = 'UNKNOWN'; - } + if ( $c eq $data ) { + $matched = 1; + last; + } + } + $result = $errors{$code} unless $matched; + } + } + elsif ($sensor->{'type'} eq 'drive' + || $sensor->{'type'} eq 'indicator' ) + { + $sensor->{'data'} =~ s/^drive\s+//; + if ( @{ $check->{$code} } ) { + my $matched = 0; + foreach ( @{ $check->{$code} } ) { + if ( $_ eq $sensor->{'data'} ) { + $matched = 1; + last; + } + } + $result = $errors{$code} unless $matched; + } - } + } + else { + warn 'Unknown Sensor Type: ', + $sensor->{'id'}, + '=', + $sensor->{'type'}, + "\n"; + $result = 'UNKNOWN'; + } - return $result; + } + + return $result; } sub print_help { - print <]|(-s -w limit -c limit)) + print <<"EOL"; +$PROGNAME - monitors sysctl hw.sensors on OpenBSD + $PROGNAME [-i] [-f []|(-s [-w limit] [-c limit])] Usage: - -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 - Exit with CRITICAL status if outside of RANGE or if != ENTRY + -i, --ignore-status + Don't automatically check the status of sensors that report it. + -f, --filename=FILE + FILE to load checks from (defaults to /etc/sensorsd.conf) + -s, --sensor=ID + ID of a single sensor. "-s kate0.temp0" means hw.sensors.kate0.temp0 + Overrides --filename. + -w, --warning=RANGE or single ENTRY + Exit with WARNING status if outside of RANGE or if != ENTRY + -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) this means you can use the same config file for $PROGNAME +as well as sensorsd(8). -FILE is in the same format as sensorsd.conf(5). 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 +$PROGNAME understands the following entries: -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. Anything that isn't a digit or period is stripped from the entry and the sensor output and they 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. + low, high, crit, warn, crit.low, crit.high, warn.low, warn.high, + ignore, 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. The comma separated list of values contains a list of things that will NOT cause the status. This is possibly counterintuitive, but you are more likely to know good values than bad values. +An ENTRY depends on the type. The descriptions in sensorsd.conf(5) +can be used when appropriate, or you can use the following: -A RANGE is a low ENTRY and a high ENTRY separated by a colon (:). + 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 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. +The comma separated list of values contains a list of things that +will NOT cause the status. This is possibly counterintuitive, but +you are more likely to know good values than bad values. + +A RANGE is a low ENTRY and a high ENTRY separated by a colon (:). +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.4 $'); + + print_revision( $PROGNAME, '$Revision: 1.31 $' ); + + print $License; +} + +sub print_revision { + my ( $prog, $rev ) = @_; + $rev =~ s/^\D+([\d\.]+)\D+$/v$1/xms; + + print "$prog $rev\n"; }