/******************************************************************************************
 *
 * 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);
	        }
        }