[BACK]Return to check_hw_sensors CVS log [TXT][DIR] Up to [local] / nagios / check_hw_sensors

Diff for /nagios/check_hw_sensors/check_hw_sensors between version 1.15 and 1.25

version 1.15, 2006/10/25 19:35:59 version 1.25, 2008/03/10 17:21:53
Line 1 
Line 1 
 #!/usr/bin/perl -T  #!/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.24 2007/02/14 21:59:10 andrew Exp $
 ########################################################################  ########################################################################
 # check_hw_sensors *** A nagios check for OpenBSD hw.sensors  # check_hw_sensors *** A nagios check for OpenBSD hw.sensors
 #  #
Line 7 
Line 7 
 ########################################################################  ########################################################################
 # TODO:  # TODO:
 #   Really need real documentation.  #   Really need real documentation.
   #   allow checking of hw.sensors on a remote host with ssh somehow
 ########################################################################  ########################################################################
 use strict;  use strict;
 use warnings;  use warnings;
   
 %ENV = ();  %ENV = ();
   
 use constant NAGIOS_OUTPUT => 0;  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);
   
Line 28 
Line 30 
 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;
Line 52 
Line 55 
         "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'};
Line 98 
Line 154 
 #while (<>) {  #while (<>) {
         chomp;          chomp;
         my ($id, $output) = split /=/;          my ($id, $output) = split /=/;
           my @s = split /\./, $id;
         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.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} = {          $SENSORS{$id} = {
                 id          => $id,                  id          => $id,
                 output      => $output,                  output      => $output,
Line 241 
Line 321 
         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 'fan'      ||
                         $sensor->{'type'} eq 'fanrpm'   ||                          $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'};                          my $data = $sensor->{'data'};
                         $data =~ s/[^\d\.]//g;                          $data =~ s/[^\d\.]//g;
Line 318 
Line 400 
                 } 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"} ||
Line 397 
Line 480 
                         $sensor->{'type'} eq 'drive' ||                          $sensor->{'type'} eq 'drive' ||
                         $sensor->{'type'} eq 'indicator'                          $sensor->{'type'} eq 'indicator'
                 ) {                  ) {
                           $sensor->{'data'} =~ s/^drive\s+//;
                         if (@{ $check->{$code} }) {                          if (@{ $check->{$code} }) {
                                 my $matched = 0;                                  my $matched = 0;
                                 foreach (@{ $check->{$code} }) {                                  foreach (@{ $check->{$code} }) {
Line 409 
Line 493 
                         }                          }
   
                 } else {                  } else {
                           print STDERR 'Unknown Sensor Type: ',
                               $sensor->{'id'},
                               '=',
                               $sensor->{'type'},
                               "\n";
                         $result = 'UNKNOWN';                          $result = 'UNKNOWN';
                 }                  }
   
Line 424 
Line 513 
   
 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
Line 435 
Line 523 
     -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).
Line 449 
Line 535 
 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.

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.25

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>