aboutsummaryrefslogtreecommitdiff
path: root/lib/utils_base.c
diff options
context:
space:
mode:
authorGravatar Ton Voon <tonvoon@users.sourceforge.net> 2006-07-13 23:58:00 +0000
committerGravatar Ton Voon <tonvoon@users.sourceforge.net> 2006-07-13 23:58:00 +0000
commit5912398b9723545ecd061650667cbb238be85743 (patch)
treee5d8353cc8d8c278bfc22bd926f613da63f5e83f /lib/utils_base.c
parent548083b2ea865474915fc8a9ddd361e997585a02 (diff)
downloadmonitoring-plugins-5912398b9723545ecd061650667cbb238be85743.tar.gz
Major fixes to check_disk. Now should return same data as df
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1452 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'lib/utils_base.c')
-rw-r--r--lib/utils_base.c225
1 files changed, 225 insertions, 0 deletions
diff --git a/lib/utils_base.c b/lib/utils_base.c
new file mode 100644
index 00000000..5a45f84a
--- /dev/null
+++ b/lib/utils_base.c
@@ -0,0 +1,225 @@
+/*****************************************************************************
+ *
+ * utils_base.c
+ *
+ * Library of useful functions for plugins
+ * These functions are tested with libtap. See tests/ directory
+ *
+ * Copyright (c) 2006 Nagios Plugin Development Team
+ * License: GPL
+ *
+ * $Revision$
+ * $Date$
+ ****************************************************************************/
+
+#include "common.h"
+#include "utils_base.h"
+
+void
+die (int result, const char *fmt, ...)
+{
+ va_list ap;
+ va_start (ap, fmt);
+ vprintf (fmt, ap);
+ va_end (ap);
+ exit (result);
+}
+
+void set_range_start (range *this, double value) {
+ this->start = value;
+ this->start_infinity = FALSE;
+}
+
+void set_range_end (range *this, double value) {
+ this->end = value;
+ this->end_infinity = FALSE;
+}
+
+range
+*parse_range_string (char *str) {
+ range *temp_range;
+ double start;
+ double end;
+ char *end_str;
+
+ temp_range = (range *) malloc(sizeof(range));
+
+ /* Set defaults */
+ 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_range->alert_on = INSIDE;
+ str++;
+ }
+
+ end_str = index(str, ':');
+ if (end_str != NULL) {
+ if (str[0] == '~') {
+ temp_range->start_infinity = TRUE;
+ } else {
+ start = strtod(str, NULL); /* Will stop at the ':' */
+ set_range_start(temp_range, start);
+ }
+ end_str++; /* Move past the ':' */
+ } else {
+ end_str = str;
+ }
+ end = strtod(end_str, NULL);
+ if (strcmp(end_str, "") != 0) {
+ set_range_end(temp_range, end);
+ }
+
+ if (temp_range->start_infinity == TRUE ||
+ temp_range->end_infinity == TRUE ||
+ temp_range->start <= temp_range->end) {
+ return temp_range;
+ }
+ 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) { /* Not sure why, but sometimes could be -1 */
+ /* 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 {
+ die(STATE_UNKNOWN, _("Range format incorrect"));
+ }
+}
+
+void print_thresholds(const char *threshold_name, thresholds *my_threshold) {
+ printf("%s - ", threshold_name);
+ if (! my_threshold) {
+ printf("Threshold not set");
+ } else {
+ if (my_threshold->warning) {
+ printf("Warning: start=%g end=%g; ", my_threshold->warning->start, my_threshold->warning->end);
+ } else {
+ printf("Warning not set; ");
+ }
+ if (my_threshold->critical) {
+ printf("Critical: start=%g end=%g", my_threshold->critical->start, my_threshold->critical->end);
+ } else {
+ printf("Critical not set");
+ }
+ }
+ printf("\n");
+}
+
+/* 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;
+}
+
+char *np_escaped_string (const char *string) {
+ char *data;
+ int i, j=0;
+ data = strdup(string);
+ for (i=0; data[i]; i++) {
+ if (data[i] == '\\') {
+ switch(data[++i]) {
+ case 'n':
+ data[j++] = '\n';
+ break;
+ case 'r':
+ data[j++] = '\r';
+ break;
+ case 't':
+ data[j++] = '\t';
+ break;
+ case '\\':
+ data[j++] = '\\';
+ break;
+ default:
+ data[j++] = data[i];
+ }
+ } else {
+ data[j++] = data[i];
+ }
+ }
+ data[j] = '\0';
+ return data;
+}