diff options
Diffstat (limited to 'contrib/check_hltherm.c')
-rw-r--r-- | contrib/check_hltherm.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/contrib/check_hltherm.c b/contrib/check_hltherm.c new file mode 100644 index 00000000..85c989f5 --- /dev/null +++ b/contrib/check_hltherm.c @@ -0,0 +1,209 @@ +/****************************************************************************************** + * + * 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); + } + } |