Logo Search packages:      
Sourcecode: nagios-plugins version File versions

check_hltherm.c

/******************************************************************************************
 *
 * CHECK_HLTHERM.C
 *
 * Program: Hot Little Therm temperature plugin for Nagios
 * License: GPL
 * Copyright (c) 1999-2002 Ethan Galstad (nagios@nagios.org)
 *
 * Last Modified: 02-28-2002
 *
 * Command line: check_hltherm <probe> <wtemp> <ctemp> [-l label] [-s scale] [-lower]
 *
 * Description:
 *
 * This plugin checks the temperature of a given temperature probe on a
 * Hot Little Therm digital thermometer.  The plugin uses the 'therm' utility
 * that is included with the HLT software to check the probe temperature.  Both
 * the HLT digital thermometer and software are produced by Spiderplant. See
 * their website at http://www.spiderplant.com/hlt for more information.
 *
 *****************************************************************************************/

#include "config.h"
#include "common.h"
#include "popen.h"

#define DEFAULT_TIMEOUT         10  /* default timeout in seconds */

#define HLTHERM_COMMAND          "/usr/local/bin/therm"     /* this should be moved out to the configure script */


static void timeout_alarm_handler(int); /* author must provide */
int process_arguments(int, char **);

int timeout_interval=DEFAULT_TIMEOUT;

double wtemp=0.0L;
double ctemp=0.0L;

int check_lower_temps=FALSE;

char probe[MAX_INPUT_BUFFER]="";
char label[MAX_INPUT_BUFFER]="Temperature";
char scale[MAX_INPUT_BUFFER]="Degrees";

FILE *fp;


int main(int argc, char **argv){
      int result=STATE_OK;
      char command[MAX_INPUT_BUFFER];
      double temp=0.0L;
      char input_buffer[MAX_INPUT_BUFFER];
      int found=0;

      /* process command line arguments */
      result=process_arguments(argc,argv);

      /* display usage if there was a problem */
      if(result==ERROR){
            printf("Incorrect arguments supplied\n");
            printf("\n");
            printf("Hot Little Therm temperature plugin for Nagios\n");
            printf("Copyright (c) 1999-2002 Ethan Galstad (nagios@nagios.org)\n");
            printf("Last Modified: 02-28-2002\n");
            printf("License: GPL\n");
            printf("\n");
            printf("Usage: %s <probe> <wtemp> <ctemp> [-l label] [-s scale] [-lower]\n",argv[0]);
            printf("\n");
            printf("Options:\n");
            printf(" <wtemp>  = Temperature necessary to result in a WARNING state\n");
            printf(" <ctemp>  = Temperature necessary to result in a CRITICAL state\n");
            printf(" [label]  = A descriptive label for the probe.  Example: \"Outside Temp\"\n");
            printf(" [scale]  = A descriptive label for the temperature scale.  Example: \"Celsius\"\n");
            printf(" [-lower] = Evaluate temperatures with lower values being more critical\n");
            printf("\n");
            printf("This plugin checks the temperature of a given temperature probe on a\n");
            printf("Hot Little Therm digital thermometer.  The plugin uses the 'therm' utility\n");
            printf("included with the HLT software to check the probe temperature.  Both the\n");
            printf("HLT digital thermometer and software are produced by Spiderplant. See\n");
            printf("their website at http://www.spiderplant.com/hlt for more information.\n");
            printf("\n");
            return STATE_UNKNOWN;
              }


      result=STATE_OK;

      /* Set signal handling and alarm */
      if(signal(SIGALRM,timeout_alarm_handler)==SIG_ERR){
            printf("Cannot catch SIGALRM");
            return STATE_UNKNOWN;
              }

      /* handle timeouts gracefully */
      alarm(timeout_interval);

      /* create the command line we're going to use */
      snprintf(command,sizeof(command),"%s %s",HLTHERM_COMMAND,probe);
      command[sizeof(command)-1]='\x0';

      /* run the command to check the temperature on the probe */
      fp=spopen(command);
      if(fp==NULL){
            printf("Could not open pipe: %s\n",command);
            return STATE_UNKNOWN;
              }

      if(fgets(input_buffer,MAX_INPUT_BUFFER-1,fp)){
            found=1;
            temp=(double)atof(input_buffer);
              }

      /* close the pipe */
      spclose(fp);

      if(result==STATE_OK){

            if(found==0){
                  printf("Therm problem - Could not read program output\n");
                  result=STATE_CRITICAL;
                    }
            else{
                  if(check_lower_temps==TRUE){
                        if(temp<=ctemp)
                              result=STATE_CRITICAL;
                        else if(temp<=wtemp)
                               result=STATE_WARNING;
                          }
                  else{
                        if(temp>=ctemp)
                              result=STATE_CRITICAL;
                        else if(temp>=wtemp)
                              result=STATE_WARNING;
                          }

                  printf("Therm %s: %s = %2.1f %s\n",(result==STATE_OK)?"ok":"problem",label,temp,scale);
                    }
              }

      return result;
        }


/* process command-line arguments */
int process_arguments(int argc, char **argv){
      int x;

      /* not enough options were supplied */
      if(argc<4)
            return ERROR;

      /* first option is always the probe name */
      strncpy(probe,argv[1],sizeof(probe)-1);
      probe[sizeof(probe)-1]='\x0';

      /* 2nd and 3rd options are temperature thresholds */
      wtemp=(double)atof(argv[2]);
      ctemp=(double)atof(argv[3]);

      /* process all remaining arguments */
      for(x=5;x<=argc;x++){

            /* we got the lower temperature option */
            if(!strcmp(argv[x-1],"-lower"))
                  check_lower_temps=TRUE;

            /* we got the label */
            else if(!strcmp(argv[x-1],"-l")){
                  if(x<argc){
                        strncpy(label,argv[x],sizeof(label));
                        label[sizeof(label)-1]='\x0';
                        x++;
                          }
                  else
                        return ERROR;
                    }

            /* we got the scale */
            else if(!strcmp(argv[x-1],"-s")){
                  if(x<argc){
                        strncpy(scale,argv[x],sizeof(scale));
                        scale[sizeof(scale)-1]='\x0';
                        x++;
                          }
                  else
                        return ERROR;
                    }

            /* else we got something else... */
            else
                  return ERROR;
              }

      return OK;
        }



/* handle timeouts gracefully... */
static void timeout_alarm_handler(int signo){

      if(signo==SIGALRM){
    
            kill(childpid[fileno(fp)],SIGKILL);
            printf("Therm problem - Check timed out after %d seconds\n",timeout_interval);
            exit(STATE_CRITICAL);
              }
        }

Generated by  Doxygen 1.6.0   Back to index