#!/usr/bin/perl -w # check_digitemp.pl Copyright (C) 2002 by Brian C. Lane # # This is a NetSaint plugin script to check the temperature on a local # machine. Remote usage may be possible with SSH # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. # # =========================================================================== # Howto Install in NetSaint (tested with v0.0.7) # # 1. Copy this script to /usr/local/netsaint/libexec/ or wherever you have # placed your NetSaint plugins # # 2. Create a digitemp config file in /usr/local/netsaint/etc/ # eg. digitemp -i -s/dev/ttyS0 -c /usr/local/netsaint/etc/digitemp.conf # # 3. Make sure that the webserver user has permission to access the serial # port being used. # # 4. Add a command to /usr/local/netsaint/etc/commands.cfg like this: # command[check-temp]=$USER1$/check_digitemp.pl -w $ARG1$ -c $ARG2$ \ # -t $ARG3$ -f $ARG4$ # (fold into one line) # # 5. Tell NetSaint to monitor the temperature by adding a service line like # this to your hosts.cfg file: # service[kermit]=Temperature;0;24x7;3;5;1;home-admins;120;24x7;1;1;1;; \ # check-temp!65!75!1!/usr/local/netsaint/etc/digitemp.conf # (fold into one line) # 65 is the warning temperature # 75 is the critical temperature # 1 is the sensor # (as reported by digitemp -a) to monitor # digitemp.conf is the path to the config file # # 6. If you use Centigrade instead of Fahrenheit, change the commands.cfg # line to include the -C argument. You can then pass temperature limits in # Centigrade in the service line. # # =========================================================================== # Howto Install in Nagios (tested with v1.0b4) # # 1. Copy this script to /usr/local/nagios/libexec/ or wherever you have # placed your Nagios plugins # # 2. Create a digitemp config file in /usr/local/nagios/etc/ # eg. digitemp -i -s/dev/ttyS0 -c /usr/local/nagios/etc/digitemp.conf # # 3. Make sure that the webserver user has permission to access the serial # port being used. # # 4. Add a command to /usr/local/nagios/etc/checkcommands.cfg like this: # # #DigiTemp temperature check command # define command{ # command_name check_temperature # command_line $USER1$/check_digitemp.pl -w $ARG1$ -c $ARG2$ \ # -t $ARG3$ -f $ARG4$ # (fold above into one line) # } # # 5. Tell NetSaint to monitor the temperature by adding a service line like # this to your service.cfg file: # # #DigiTemp Temperature check Service definition # define service{ # use generic-service # host_name kermit # service_description Temperature # is_volatile 0 # check_period 24x7 # max_check_attempts 3 # normal_check_interval 5 # retry_check_interval 2 # contact_groups home-admins # notification_interval 240 # notification_period 24x7 # notification_options w,u,c,r # check_command check_temperature!65!75!1! \ # /usr/local/nagios/etc/digitemp.conf # (fold into one line) # } # # 65 is the warning temperature # 75 is the critical temperature # 1 is the sensor # (as reported by digitemp -a) to monitor # digitemp.conf is the path to the config file # # 6. If you use Centigrade instead of Fahrenheit, change the checkcommands.cfg # line to include the -C argument. You can then pass temperature limits in # Centigrade in the service line. # # =========================================================================== # Modules to use use strict; use Getopt::Std; # Define all our variable usage use vars qw($opt_c $opt_f $opt_t $opt_w $opt_F $opt_C $temperature $conf_file $sensor $temp_fmt $crit_level $warn_level $null %exit_codes $percent $fmt_pct $verb_err $command_line); # Predefined exit codes for NetSaint %exit_codes = ('UNKNOWN' ,-1, 'OK' , 0, 'WARNING' , 1, 'CRITICAL', 2,); # Default to Fahrenheit input and result (use -C to change this) $temp_fmt = 3; # Get the options if ($#ARGV le 0) { &usage; } else { getopts('f:t:FCc:w:'); } # Shortcircuit the switches if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0) { print "*** You must define WARN and CRITICAL levels!"; &usage; } # Check if levels are sane if ($opt_w >= $opt_c) { print "*** WARN level must not be greater than CRITICAL when checking temperature!"; &usage; } $warn_level = $opt_w; $crit_level = $opt_c; # Default sensor to read is #0 if(!$opt_t) { $sensor = 0; } else { $sensor = $opt_t; } # Default config file is /etc/digitemp.conf if(!$opt_f) { $conf_file = "/etc/digitemp.conf"; } else { $conf_file = $opt_f; } # Check for config file if( !-f $conf_file ) { print "*** You must have a digitemp.conf file\n"; &usage; } if($opt_C) { $temp_fmt = 2; } # Read the output from digitemp # Output in form 0\troom\tattic\tdrink open( DIGITEMP, "/usr/local/bin/digitemp -c $conf_file -t $sensor -q -o $temp_fmt |" ); # Process the output from the command while( ) { # print "$_\n"; chomp; if( $_ =~ /^nanosleep/i ) { print "Error reading sensor #$sensor\n"; close(DIGITEMP); exit $exit_codes{'UNKNOWN'}; } else { # Check for an error from digitemp, and report it instead if( $_ =~ /^Error.*/i ) { print $_; close(DIGITEMP); exit $exit_codes{'UNKNOWN'}; } else { ($null,$temperature) = split(/\t/); } } } close( DIGITEMP ); if( $temperature and $temperature >= $crit_level ) { print "Temperature CRITICAL - Sensor #$sensor = $temperature "; if( $temp_fmt == 3 ) { print "F\n"; } else { print "C\n"; } exit $exit_codes{'CRITICAL'}; } elsif ($temperature and $temperature >= $warn_level ) { print "Temperature WARNING - Sensor #$sensor = $temperature "; if( $temp_fmt == 3 ) { print "F\n"; } else { print "C\n"; } exit $exit_codes{'WARNING'}; } elsif( $temperature ) { print "Temperature OK - Sensor #$sensor = $temperature "; if( $temp_fmt == 3 ) { print "F\n"; } else { print "C\n"; } exit $exit_codes{'OK'}; } else { print "Error parsing result for sensor #$sensor\n"; exit $exit_codes{'UNKNOWN'}; } # Show usage sub usage() { print "\ncheck_digitemp.pl v1.0 - NetSaint Plugin\n"; print "Copyright 2002 by Brian C. Lane \n"; print "See source for License\n"; print "usage:\n"; print " check_digitemp.pl -t -f -w -c \n\n"; print "options:\n"; print " -f DigiTemp Config File\n"; print " -t DigiTemp Sensor #\n"; print " -F Temperature in Fahrenheit\n"; print " -C Temperature in Centigrade\n"; print " -w temperature temperature >= to warn\n"; print " -c temperature temperature >= when critical\n"; exit $exit_codes{'UNKNOWN'}; }