aboutsummaryrefslogtreecommitdiff
path: root/plugins/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/utils.c')
-rw-r--r--plugins/utils.c133
1 files changed, 113 insertions, 20 deletions
diff --git a/plugins/utils.c b/plugins/utils.c
index dbb25202..685a638a 100644
--- a/plugins/utils.c
+++ b/plugins/utils.c
@@ -265,44 +265,44 @@ is_option (char *str)
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 @@ threshold
}
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)