/****************************************************************************************** * * 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 [-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 [-l label] [-s scale] [-lower]\n",argv[0]); printf("\n"); printf("Options:\n"); printf(" = Temperature necessary to result in a WARNING state\n"); printf(" = 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