From: Ethan Galstad Date: Thu, 1 Aug 2002 04:46:01 +0000 (+0000) Subject: Add Brian Lane's Digitemp (1-wire temp sensor) plugin X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=2bc0368fec41fe7617a3099087fda1f0beddaa7c;p=nagiosplug.git Add Brian Lane's Digitemp (1-wire temp sensor) plugin git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@66 f882894a-f735-0410-b71e-b25c423dba1c --- diff --git a/contrib/check_digitemp.pl b/contrib/check_digitemp.pl new file mode 100755 index 0000000..d2b40a1 --- /dev/null +++ b/contrib/check_digitemp.pl @@ -0,0 +1,252 @@ +#!/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'}; +}