[monitoring-plugins] check_users not correctly detecting thresholds
Sven Nierlein
git at monitoring-plugins.org
Mon Nov 7 22:00:15 CET 2016
Module: monitoring-plugins
Branch: master
Commit: a5983eda69b442a90495909803724901669b50fb
Author: John C. Frickson <jfrickson at nagios.com>
Committer: Sven Nierlein <sven at nierlein.de>
Date: Mon Nov 7 13:06:05 2016 -0600
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=a5983ed
check_users not correctly detecting thresholds
Fix for issue https://github.com/nagios-plugins/nagios-plugins/issues/81
check_users now uses the standard warning and critical ranges parser and
a standard perdata output routine.
---
NEWS | 1 +
plugins/check_users.c | 60 +++++++++++++++++++--------------------------------
plugins/utils.c | 41 +++++++++++++++++++++++++++++++++++
plugins/utils.h | 34 ++++++++++-------------------
4 files changed, 75 insertions(+), 61 deletions(-)
diff --git a/NEWS b/NEWS
index 2a9ea62..dd229a9 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,7 @@ This file documents the major additions and syntax changes between releases.
to force TLSv1.1 and TLSv1.2 connections, respectively
The check_http -S/--ssl option now allows for specifying the desired
protocol with a "+" suffix to also accept newer versions
+ check_users: add support for range thresholds (John C. Frickson)
FIXES
Let check_real terminate lines with CRLF when talking to the server, as
diff --git a/plugins/check_users.c b/plugins/check_users.c
index 54415a4..a10249c 100644
--- a/plugins/check_users.c
+++ b/plugins/check_users.c
@@ -54,15 +54,15 @@ int process_arguments (int, char **);
void print_help (void);
void print_usage (void);
-int wusers = -1;
-int cusers = -1;
+char *warning_range = NULL;
+char *critical_range = NULL;
+thresholds *thlds = NULL;
int
main (int argc, char **argv)
{
int users = -1;
int result = STATE_UNKNOWN;
- char *perf;
#if HAVE_WTSAPI32_H
WTS_SESSION_INFO *wtsinfo;
DWORD wtscount;
@@ -77,8 +77,6 @@ main (int argc, char **argv)
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- perf = strdup ("");
-
/* Parse extra opts if any */
argv = np_extra_opts (&argc, argv, progname);
@@ -160,23 +158,15 @@ main (int argc, char **argv)
#endif
/* check the user count against warning and critical thresholds */
- if (users > cusers)
- result = STATE_CRITICAL;
- else if (users > wusers)
- result = STATE_WARNING;
- else if (users >= 0)
- result = STATE_OK;
+ result = get_status((double)users, thlds);
if (result == STATE_UNKNOWN)
printf ("%s\n", _("Unable to read output"));
else {
- xasprintf (&perf, "%s", perfdata ("users", users, "",
- TRUE, wusers,
- TRUE, cusers,
- TRUE, 0,
- FALSE, 0));
- printf (_("USERS %s - %d users currently logged in |%s\n"), state_text (result),
- users, perf);
+ printf (_("USERS %s - %d users currently logged in |%s\n"),
+ state_text(result), users,
+ sperfdata_int("users", users, "", warning_range,
+ critical_range, TRUE, 0, FALSE, 0));
}
return result;
@@ -215,33 +205,27 @@ process_arguments (int argc, char **argv)
print_revision (progname, NP_VERSION);
exit (STATE_UNKNOWN);
case 'c': /* critical */
- if (!is_intnonneg (optarg))
- usage4 (_("Critical threshold must be a positive integer"));
- else
- cusers = atoi (optarg);
+ critical_range = optarg;
break;
case 'w': /* warning */
- if (!is_intnonneg (optarg))
- usage4 (_("Warning threshold must be a positive integer"));
- else
- wusers = atoi (optarg);
+ warning_range = optarg;
break;
}
}
c = optind;
- if (wusers == -1 && argc > c) {
- if (is_intnonneg (argv[c]) == FALSE)
- usage4 (_("Warning threshold must be a positive integer"));
- else
- wusers = atoi (argv[c++]);
- }
- if (cusers == -1 && argc > c) {
- if (is_intnonneg (argv[c]) == FALSE)
- usage4 (_("Warning threshold must be a positive integer"));
- else
- cusers = atoi (argv[c]);
- }
+ if (warning_range == NULL && argc > c)
+ warning_range = argv[c++];
+ if (critical_range == NULL && argc > c)
+ critical_range = argv[c++];
+
+ /* this will abort in case of invalid ranges */
+ set_thresholds (&thlds, warning_range, critical_range);
+
+ if (thlds->warning->end <= 0)
+ usage4 (_("Warning threshold must be a positive integer"));
+ if (thlds->critical->end <= 0)
+ usage4 (_("Critical threshold must be a positive integer"));
return OK;
}
diff --git a/plugins/utils.c b/plugins/utils.c
index a864e4a..231af92 100644
--- a/plugins/utils.c
+++ b/plugins/utils.c
@@ -668,3 +668,44 @@ char *sperfdata (const char *label,
return data;
}
+
+char *sperfdata_int (const char *label,
+ int val,
+ const char *uom,
+ char *warn,
+ char *crit,
+ int minp,
+ int minv,
+ int maxp,
+ int maxv)
+{
+ char *data = NULL;
+ if (strpbrk (label, "'= "))
+ xasprintf (&data, "'%s'=", label);
+ else
+ xasprintf (&data, "%s=", label);
+
+ xasprintf (&data, "%s%d", data, val);
+ xasprintf (&data, "%s%s;", data, uom);
+
+ if (warn!=NULL)
+ xasprintf (&data, "%s%s", data, warn);
+
+ xasprintf (&data, "%s;", data);
+
+ if (crit!=NULL)
+ xasprintf (&data, "%s%s", data, crit);
+
+ xasprintf (&data, "%s;", data);
+
+ if (minp)
+ xasprintf (&data, "%s%d", data, minv);
+
+ if (maxp) {
+ xasprintf (&data, "%s;", data);
+ xasprintf (&data, "%s%d", data, maxv);
+ }
+
+ return data;
+}
+
diff --git a/plugins/utils.h b/plugins/utils.h
index 4c4aacc..a436e1c 100644
--- a/plugins/utils.h
+++ b/plugins/utils.h
@@ -94,29 +94,17 @@ const char *state_text (int);
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)<(b))?(a):(b))
-char *perfdata (const char *,
- long int,
- const char *,
- int,
- long int,
- int,
- long int,
- int,
- long int,
- int,
- long int);
-
-char *fperfdata (const char *,
- double,
- const char *,
- int,
- double,
- int,
- double,
- int,
- double,
- int,
- double);
+char *perfdata (const char *, long int, const char *, int, long int,
+ int, long int, int, long int, int, long int);
+
+char *fperfdata (const char *, double, const char *, int, double,
+ int, double, int, double, int, double);
+
+char *sperfdata (const char *, double, const char *, char *, char *,
+ int, double, int, double);
+
+char *sperfdata_int (const char *, int, const char *, char *, char *,
+ int, int, int, int);
/* The idea here is that, although not every plugin will use all of these,
most will or should. Therefore, for consistency, these very common
More information about the Commits
mailing list