Code

Add Brian Lane's Digitemp (1-wire temp sensor) plugin
authorEthan Galstad <egalstad@users.sourceforge.net>
Thu, 1 Aug 2002 04:46:01 +0000 (04:46 +0000)
committerEthan Galstad <egalstad@users.sourceforge.net>
Thu, 1 Aug 2002 04:46:01 +0000 (04:46 +0000)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@66 f882894a-f735-0410-b71e-b25c423dba1c

contrib/check_digitemp.pl [new file with mode: 0755]

diff --git a/contrib/check_digitemp.pl b/contrib/check_digitemp.pl
new file mode 100755 (executable)
index 0000000..d2b40a1
--- /dev/null
@@ -0,0 +1,252 @@
+#!/usr/bin/perl -w
+
+# check_digitemp.pl Copyright (C) 2002 by Brian C. Lane <bcl@brianlane.com>
+#
+# 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( <DIGITEMP> )
+{
+#  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 <bcl\@brianlane.com>\n";
+  print "See source for License\n";
+  print "usage:\n";
+  print " check_digitemp.pl -t <sensor> -f <config file> -w <warnlevel> -c <critlevel>\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'}; 
+}