[Nagiosplug-checkins] nagiosplug/plugins utils.c,1.43,1.44 utils.h,1.25,1.26

Ton Voon tonvoon at users.sourceforge.net
Mon Jan 30 14:25:03 CET 2006


Update of /cvsroot/nagiosplug/nagiosplug/plugins
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19257/plugins

Modified Files:
	utils.c utils.h 
Log Message:
Clearly defined thresholds & ranges in docs. Added get_status routine. Added
set_thresholds routine. Tests enhanced to check new routines


Index: utils.c
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/utils.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- utils.c	30 Jan 2006 16:10:50 -0000	1.43
+++ utils.c	30 Jan 2006 22:24:31 -0000	1.44
@@ -265,44 +265,44 @@
 		return FALSE;
 }
 
-void set_threshold_start (threshold *this, double value) {
+void set_range_start (range *this, double value) {
 	this->start = value;
 	this->start_infinity = FALSE;
 }
 
-void set_threshold_end (threshold *this, double value) {
+void set_range_end (range *this, double value) {
 	this->end = value;
 	this->end_infinity = FALSE;
 }
 
-threshold
-*parse_threshold (char *str) {
-	threshold *temp_threshold;
+range
+*parse_range_string (char *str) {
+	range *temp_range;
 	double start;
 	double end;
 	char *end_str;
 
-	temp_threshold = (threshold *) malloc(sizeof(threshold));
+	temp_range = (range *) malloc(sizeof(range));
 
 	/* Set defaults */
-	temp_threshold->start = 0;
-	temp_threshold->start_infinity = FALSE;
-	temp_threshold->end = 0;
-	temp_threshold->end_infinity = TRUE;
-	temp_threshold->alert_on = OUTSIDE;
+	temp_range->start = 0;
+	temp_range->start_infinity = FALSE;
+	temp_range->end = 0;
+	temp_range->end_infinity = TRUE;
+	temp_range->alert_on = OUTSIDE;
 
 	if (str[0] == '@') {
-		temp_threshold->alert_on = INSIDE;
+		temp_range->alert_on = INSIDE;
 		str++;
 	}
 
 	end_str = index(str, ':');
 	if (end_str != NULL) {
 		if (str[0] == '~') {
-			temp_threshold->start_infinity = TRUE;
+			temp_range->start_infinity = TRUE;
 		} else {
 			start = strtod(str, NULL);	/* Will stop at the ':' */
-			set_threshold_start(temp_threshold, start);
+			set_range_start(temp_range, start);
 		}
 		end_str++;		/* Move past the ':' */
 	} else {
@@ -310,18 +310,111 @@
 	}
 	end = strtod(end_str, NULL);
 	if (strcmp(end_str, "") != 0) {
-		set_threshold_end(temp_threshold, end);
+		set_range_end(temp_range, end);
 	}
 
-	if (temp_threshold->start_infinity == TRUE || 
-		temp_threshold->end_infinity == TRUE ||
-		temp_threshold->start <= temp_threshold->end) {
-		return temp_threshold;
+	if (temp_range->start_infinity == TRUE || 
+		temp_range->end_infinity == TRUE ||
+		temp_range->start <= temp_range->end) {
+		return temp_range;
 	}
-	free(temp_threshold);
+	free(temp_range);
 	return NULL;
 }
 
+/* returns 0 if okay, otherwise 1 */
+int
+_set_thresholds(thresholds **my_thresholds, char *warn_string, char *critical_string)
+{
+	thresholds *temp_thresholds = NULL;
+
+	temp_thresholds = malloc(sizeof(temp_thresholds));
+
+	temp_thresholds->warning = NULL;
+	temp_thresholds->critical = NULL;
+
+	if (warn_string != NULL) {
+		if ((temp_thresholds->warning = parse_range_string(warn_string)) == NULL) {
+			return 1;
+		}
+	}
+	if (critical_string != NULL) {
+		if ((temp_thresholds->critical = parse_range_string(critical_string)) == NULL) {
+			return 1;
+		}
+	}
+
+	if (*my_thresholds != 0) {
+		/* printf("Freeing here: %d\n", *my_thresholds); */
+		free(*my_thresholds);
+	}
+	*my_thresholds = temp_thresholds;
+
+	return 0;
+}
+
+void
+set_thresholds(thresholds **my_thresholds, char *warn_string, char *critical_string)
+{
+	if (_set_thresholds(my_thresholds, warn_string, critical_string) == 0) {
+		return;
+	} else {
+		usage("Range format incorrect");
+	}
+}
+
+/* Returns TRUE if alert should be raised based on the range */
+int
+check_range(double value, range *my_range)
+{
+	int false = FALSE;
+	int true = TRUE;
+	
+	if (my_range->alert_on == INSIDE) {
+		false = TRUE;
+		true = FALSE;
+	}
+
+	if (my_range->end_infinity == FALSE && my_range->start_infinity == FALSE) {
+		if ((my_range->start <= value) && (value <= my_range->end)) {
+			return false;
+		} else {
+			return true;
+		}
+	} else if (my_range->start_infinity == FALSE && my_range->end_infinity == TRUE) {
+		if (my_range->start <= value) {
+			return false;
+		} else {
+			return true;
+		}
+	} else if (my_range->start_infinity == TRUE && my_range->end_infinity == FALSE) {
+		if (value <= my_range->end) {
+			return false;
+		} else {
+			return true;
+		}
+	} else {
+		return false;
+	}
+}
+
+/* Returns status */
+int
+get_status(double value, thresholds *my_thresholds)
+{
+	if (my_thresholds->critical != NULL) {
+		if (check_range(value, my_thresholds->critical) == TRUE) {
+			return STATE_CRITICAL;
+		}
+	}
+	if (my_thresholds->warning != NULL) {
+		if (check_range(value, my_thresholds->warning) == TRUE) {
+			return STATE_WARNING;
+		}
+	}
+	return STATE_OK;
+}
+
 #ifdef NEED_GETTIMEOFDAY
 int
 gettimeofday (struct timeval *tv, struct timezone *tz)

Index: utils.h
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/utils.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- utils.h	30 Jan 2006 16:10:50 -0000	1.25
+++ utils.h	30 Jan 2006 22:24:31 -0000	1.26
@@ -61,15 +61,24 @@
 #define OUTSIDE 0
 #define INSIDE  1
 
-typedef struct threshold_struct {
+typedef struct range_struct {
 	double	start;
 	int	start_infinity;		/* FALSE (default) or TRUE */
 	double	end;
 	int	end_infinity;
 	int	alert_on;		/* OUTSIDE (default) or INSIDE */
-	} threshold;
+	} range;
 
-threshold *parse_threshold (char *);
+typedef struct thresholds_struct {
+	range	*warning;
+	range	*critical;
+	} thresholds;
+
+range *parse_range_string (char *);
+int _set_thresholds(thresholds **, char *, char *);
+void set_thresholds(thresholds **, char *, char *);
+int check_range(double, range *);
+int get_status(double, thresholds *);
 
 #ifndef HAVE_GETTIMEOFDAY
 int gettimeofday(struct timeval *, struct timezone *);





More information about the Commits mailing list