Module: monitoring-plugins
    Branch: master
    Commit: a5983eda69b442a90495909803724901669b50fb
    Author: John C. Frickson <jfrick...@nagios.com>
 Committer: Sven Nierlein <s...@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 

Reply via email to