[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