X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Futils.c;h=45373909560552b462ccbb11ecdcc51c1a7a2ca8;hb=6b6051606175d870bb45bbe67866c1643d4d964a;hp=a455f225cc15a0ff4223dbdde888146ddeebd61d;hpb=f9394308c9c372bcf419a311c61ba420247ae613;p=nagiosplug.git diff --git a/plugins/utils.c b/plugins/utils.c index a455f22..4537390 100644 --- a/plugins/utils.c +++ b/plugins/utils.c @@ -1,21 +1,32 @@ /***************************************************************************** - * - * utils.c - * - * Library of useful functions for plugins - * - * Copyright (c) 2000 Karl DeBisschop (karl@debisschop.net) - * Copyright (c) 2006 Nagios Plugin Development Team - * License: GPL - * - * $Revision$ - * $Date$ - ****************************************************************************/ +* +* Library of useful functions for plugins +* +* License: GPL +* Copyright (c) 2000 Karl DeBisschop (karl@debisschop.net) +* Copyright (c) 2002-2007 Nagios Plugin Development Team +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* +*****************************************************************************/ #define LOCAL_TIMEOUT_ALARM_HANDLER #include "common.h" #include "utils.h" +#include "utils_base.h" #include #include @@ -52,6 +63,33 @@ max_state (int a, int b) return max (a, b); } +/* ************************************************************************** + * max_state_alt(STATE_x, STATE_y) + * compares STATE_x to STATE_y and returns result based on the following + * STATE_OK < STATE_DEPENDENT < STATE_UNKNOWN < STATE_WARNING < STATE_CRITICAL + * + * The main difference between max_state_alt and max_state it that it doesn't + * allow setting a default to UNKNOWN. It will instead prioritixe any valid + * non-OK state. + ****************************************************************************/ + +int +max_state_alt (int a, int b) +{ + if (a == STATE_CRITICAL || b == STATE_CRITICAL) + return STATE_CRITICAL; + else if (a == STATE_WARNING || b == STATE_WARNING) + return STATE_WARNING; + else if (a == STATE_UNKNOWN || b == STATE_UNKNOWN) + return STATE_UNKNOWN; + else if (a == STATE_DEPENDENT || b == STATE_DEPENDENT) + return STATE_DEPENDENT; + else if (a == STATE_OK || b == STATE_OK) + return STATE_OK; + else + return max (a, b); +} + void usage (const char *msg) { printf ("%s\n", msg); @@ -93,25 +131,20 @@ usage4 (const char *msg) exit (STATE_UNKNOWN); } -char * -clean_revstring (const char *revstring) +void +usage5 (void) { - char plugin_revision[STRLEN]; - if (sscanf (revstring,"$Revision: %[0-9.]",plugin_revision) == 1) - return strscpy (NULL, plugin_revision); - else - return strscpy (NULL, "N/A"); + print_usage(); + exit (STATE_UNKNOWN); } void -print_revision (const char *command_name, const char *revision_string) +print_revision (const char *command_name, const char *revision) { char plugin_revision[STRLEN]; - if (sscanf (revision_string, "$Revision: %[0-9.]", plugin_revision) != 1) - strncpy (plugin_revision, "N/A", STRLEN); - printf ("%s (%s %s) %s\n", - command_name, PACKAGE, VERSION, plugin_revision); + printf ("%s v%s (%s %s)\n", + command_name, revision, PACKAGE, VERSION); } const char * @@ -131,23 +164,13 @@ state_text (int result) } } -void -die (int result, const char *fmt, ...) -{ - va_list ap; - va_start (ap, fmt); - vprintf (fmt, ap); - va_end (ap); - exit (result); -} - void timeout_alarm_handler (int signo) { if (signo == SIGALRM) { - printf (_("CRITICAL - Plugin timed out after %d seconds\n"), - timeout_interval); - exit (STATE_CRITICAL); + printf (_("%s - Plugin timed out after %d seconds\n"), + state_text(timeout_state), timeout_interval); + exit (timeout_state); } } @@ -266,156 +289,6 @@ is_option (char *str) return FALSE; } -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) { - /* 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) @@ -640,33 +513,6 @@ strpcat (char *dest, const char *src, const char *str) return dest; } -#ifndef HAVE_BASENAME -/* function modified from coreutils base_name function - see ACKNOWLEDGEMENTS */ -char *basename(const char *path) { - char const *base = path; - char const *p; - for (p = base; *p; p++) { - if (*p == '/') { - /* Treat multiple adjacent slashes like single slash */ - do p++; - while (*p == '/'); - - /* If filename ends in slash, use trailing slash - as basename if no non-slashes found */ - if (! *p) { - if (*base == '/') - base = p - 1; - break; - } - - /* *p is non-slash preceded by slash */ - base = p; - } - } - return (char *) base; -} -#endif - /****************************************************************************** * * Print perfdata in a standard format @@ -754,33 +600,3 @@ char *fperfdata (const char *label, return data; } - -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; -}