Code

Attempt at fixing check_snmp multiline output:
[nagiosplug.git] / plugins / check_snmp.c
index 03c2a174a132c69702d9c6f99147337e18affee9..19f78d03987c9d1a911dc2193cc9091117fcac62 100644 (file)
@@ -53,33 +53,14 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
 #define CRIT_PRESENT 1
 #define CRIT_STRING 2
 #define CRIT_REGEX 4
-#define CRIT_GT 8
-#define CRIT_LT 16
-#define CRIT_GE 32
-#define CRIT_LE 64
-#define CRIT_EQ 128
-#define CRIT_NE 256
-#define CRIT_RANGE 512
-#define WARN_PRESENT 1024
-#define WARN_STRING 2048
-#define WARN_REGEX 4096
-#define WARN_GT 8192
-#define WARN_LT 16384
-#define WARN_GE 32768
-#define WARN_LE 65536
-#define WARN_EQ 131072
-#define WARN_NE 262144
-#define WARN_RANGE 524288
+#define WARN_PRESENT 8
+#define WARN_STRING 16
+#define WARN_REGEX 32
 
 #define MAX_OIDS 8
-#define MAX_DELIM_LENGTH 8
 
 int process_arguments (int, char **);
 int validate_arguments (void);
-char *clarify_message (char *);
-int check_num (int);
-int llu_getll (unsigned long long *, char *);
-int llu_getul (unsigned long long *, char *);
 char *thisarg (char *str);
 char *nextarg (char *str);
 void print_usage (void);
@@ -89,7 +70,6 @@ void print_help (void);
 char regex_expect[MAX_INPUT_BUFFER] = "";
 regex_t preg;
 regmatch_t pmatch[10];
-char timestamp[10] = "";
 char errbuf[MAX_INPUT_BUFFER] = "";
 char perfstr[MAX_INPUT_BUFFER] = "| ";
 int cflags = REG_EXTENDED | REG_NOSUB | REG_NEWLINE;
@@ -106,7 +86,7 @@ char *authproto = NULL;
 char *privproto = NULL;
 char *authpasswd = NULL;
 char *privpasswd = NULL;
-char **oids = NULL; 
+char **oids = NULL;
 char *label;
 char *units;
 char *port;
@@ -120,17 +100,14 @@ size_t nunits = 0;
 size_t unitv_size = 8;
 int numoids = 0;
 int numauthpriv = 0;
-int verbose = FALSE;
+int verbose = 0;
 int usesnmpgetnext = FALSE;
-unsigned long long lower_warn_lim[MAX_OIDS];
-unsigned long long upper_warn_lim[MAX_OIDS];
-unsigned long long lower_crit_lim[MAX_OIDS];
-unsigned long long upper_crit_lim[MAX_OIDS];
-unsigned long long response_value[MAX_OIDS];
-int check_warning_value = FALSE;
-int check_critical_value = FALSE;
+char *warning_thresholds = NULL;
+char *critical_thresholds = NULL;
+thresholds *thlds[MAX_OIDS];
+double response_value[MAX_OIDS];
 int retries = 0;
-unsigned long long eval_method[MAX_OIDS];
+int eval_method[MAX_OIDS];
 char *delimiter;
 char *output_delim;
 char *miblist = NULL;
@@ -140,7 +117,7 @@ int needmibs = FALSE;
 int
 main (int argc, char **argv)
 {
-       int i = 0;
+       int i, len, line;
        int iresult = STATE_UNKNOWN;
        int result = STATE_UNKNOWN;
        int return_code = 0;
@@ -149,9 +126,12 @@ main (int argc, char **argv)
        char *cl_hidden_auth = NULL;
        char *oidname = NULL;
        char *response = NULL;
+       char *mult_resp = NULL;
        char *outbuff;
        char *ptr = NULL;
        char *show = NULL;
+       char *th_warn=NULL;
+       char *th_crit=NULL;
        char type[8] = "";
        output chld_out, chld_err;
 
@@ -163,7 +143,6 @@ main (int argc, char **argv)
        unitv = malloc (unitv_size);
        for (i = 0; i < MAX_OIDS; i++)
                eval_method[i] = CHECK_UNDEF;
-       i = 0;
 
        label = strdup ("SNMP");
        units = strdup ("");
@@ -171,7 +150,6 @@ main (int argc, char **argv)
        outbuff = strdup ("");
        delimiter = strdup (" = ");
        output_delim = strdup (DEFAULT_OUTPUT_DELIMITER);
-       /* miblist = strdup (DEFAULT_MIBLIST); */
        timeout_interval = DEFAULT_TIMEOUT;
        retries = DEFAULT_RETRIES;
 
@@ -181,14 +159,36 @@ main (int argc, char **argv)
        if (process_arguments (argc, argv) == ERROR)
                usage4 (_("Could not parse arguments"));
 
+       /* Populate the thresholds */
+       th_warn=warning_thresholds;
+       th_crit=critical_thresholds;
+       for (i=0; i<numoids; i++) {
+               char *w = th_warn ? strndup(th_warn, strcspn(th_warn, ",")) : NULL;
+               char *c = th_crit ? strndup(th_crit, strcspn(th_crit, ",")) : NULL;
+               /* Skip empty thresholds, while avoiding segfault */
+               set_thresholds(&thlds[i],
+                              w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL,
+                              c ? strpbrk(c, NP_THRESHOLDS_CHARS) : NULL);
+               if (w) {
+                       th_warn=strchr(th_warn, ',');
+                       if (th_warn) th_warn++;
+                       free(w);
+               }
+               if (c) {
+                       th_crit=strchr(th_crit, ',');
+                       if (th_crit) th_crit++;
+                       free(c);
+               }
+       }
+
        /* Create the command array to execute */
        if(usesnmpgetnext == TRUE) {
                snmpcmd = strdup (PATH_TO_SNMPGETNEXT);
        }else{
                snmpcmd = strdup (PATH_TO_SNMPGET);
-       } 
-       
-        /* 9 arguments to pass before authpriv options + 1 for host and numoids. Add one for terminating NULL */
+       }
+
+       /* 9 arguments to pass before authpriv options + 1 for host and numoids. Add one for terminating NULL */
        command_line = calloc (9 + numauthpriv + 1 + numoids + 1, sizeof (char *));
        command_line[0] = snmpcmd;
        command_line[1] = strdup ("-t");
@@ -206,9 +206,9 @@ main (int argc, char **argv)
 
        asprintf (&command_line[9 + numauthpriv], "%s:%s", server_address, port);
 
-        /* This is just for display purposes, so it can remain a string */
+       /* This is just for display purposes, so it can remain a string */
        asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s",
-               snmpcmd, timeout_interval, retries, miblist, proto, "[authpriv]",
+               snmpcmd, timeout_interval, retries, strlen(miblist) ? miblist : "''", proto, "[authpriv]",
                server_address, port);
 
        for (i = 0; i < numoids; i++) {
@@ -224,10 +224,10 @@ main (int argc, char **argv)
        /* Run the command */
        return_code = cmd_run_array (command_line, &chld_out, &chld_err, 0);
 
-       /* Due to net-snmp sometimes showing stderr messages with poorly formed MIBs, 
+       /* Due to net-snmp sometimes showing stderr messages with poorly formed MIBs,
           only return state unknown if return code is non zero or there is no stdout.
           Do this way so that if there is stderr, will get added to output, which helps problem diagnosis
-       /*
+       */
        if (return_code != 0)
                external_error=1;
        if (chld_out.lines == 0)
@@ -250,16 +250,23 @@ main (int argc, char **argv)
                }
        }
 
-       for (i = 0; i < chld_out.lines; i++) {
-               ptr = chld_out.line[i];
-               oidname = strpcpy (oidname, ptr, delimiter); 
+       for (line=0, i=0; line < chld_out.lines; line++, i++) {
+               const char *conv = "%.0f";
+
+               ptr = chld_out.line[line];
+               oidname = strpcpy (oidname, ptr, delimiter);
                response = strstr (ptr, delimiter);
+               if (response == NULL)
+                       break;
 
-               /* We strip out the datatype indicator for PHBs */
+               if (verbose > 2) {
+                       printf("Processing line %i\n  oidname: %s\n  response: %s\n", i+1, oidname, response);
+               }
 
                /* Clean up type array - Sol10 does not necessarily zero it out */
                bzero(type, sizeof(type));
 
+               /* We strip out the datatype indicator for PHBs */
                if (strstr (response, "Gauge: "))
                        show = strstr (response, "Gauge: ") + 7;
                else if (strstr (response, "Gauge32: "))
@@ -274,32 +281,37 @@ main (int argc, char **argv)
                }
                else if (strstr (response, "INTEGER: "))
                        show = strstr (response, "INTEGER: ") + 9;
-               else if (strstr (response, "STRING: "))
+               else if (strstr (response, "STRING: ")) {
                        show = strstr (response, "STRING: ") + 8;
+                       conv = "%.10g";
+                       /* Get the rest of the string on multi-line strings */
+                       if (show[0] == '"' && (response[strlen(response)-1] != '\"' || response[strlen(response)-2] != '\\')) {
+                               /* Strip out unmatched double-quote */
+                               if (show[0] == '"') show++;
+                               if (!mult_resp) mult_resp = strdup("");
+                               asprintf (&mult_resp, "%s%s:\n%s\n", mult_resp, oids[i], strstr (response, "STRING: ") + 8);
+                               for (line++; line < chld_out.lines; line++) {
+                                       asprintf (&mult_resp, "%s%s\n", mult_resp, chld_out.line[line]);
+                                       if (mult_resp[strlen(mult_resp)-2] == '"' && response[strlen(response)-2] != '\\') break;
+                               }
+                       }
+
+               }
+               else if (strstr (response, "Timeticks: "))
+                       show = strstr (response, "Timeticks: ");
                else
                        show = response;
 
                iresult = STATE_DEPENDENT;
 
                /* Process this block for integer comparisons */
-               if (eval_method[i] & CRIT_GT ||
-                   eval_method[i] & CRIT_LT ||
-                   eval_method[i] & CRIT_GE ||
-                   eval_method[i] & CRIT_LE ||
-                   eval_method[i] & CRIT_EQ ||
-                   eval_method[i] & CRIT_NE ||
-                   eval_method[i] & WARN_GT ||
-                   eval_method[i] & WARN_LT ||
-                   eval_method[i] & WARN_GE ||
-                   eval_method[i] & WARN_LE ||
-                   eval_method[i] & WARN_EQ ||
-                   eval_method[i] & WARN_NE) {
+               if (thlds[i]->warning || thlds[i]->critical) {
                        ptr = strpbrk (show, "0123456789");
                        if (ptr == NULL)
                                die (STATE_UNKNOWN,_("No valid data returned"));
-                       response_value[i] = strtoul (ptr, NULL, 10);
-                       iresult = check_num (i);
-                       asprintf (&show, "%llu", response_value[i]);
+                       response_value[i] = strtod (ptr, NULL);
+                       iresult = get_status(response_value[i], thlds[i]);
+                       asprintf (&show, conv, response_value[i]);
                }
 
                /* Process this block for string matching */
@@ -352,10 +364,14 @@ main (int argc, char **argv)
                if (nunits > (size_t)0 && (size_t)i < nunits && unitv[i] != NULL)
                        asprintf (&outbuff, "%s %s", outbuff, unitv[i]);
 
-               if (is_numeric(show)) {
+               /* Write perfdata with whatever can be parsed by strtod, if possible */
+               ptr = NULL;
+               strtod(show, &ptr);
+               if (ptr > show) {
                        strncat(perfstr, oidname, sizeof(perfstr)-strlen(perfstr)-1);
                        strncat(perfstr, "=", sizeof(perfstr)-strlen(perfstr)-1);
-                       strncat(perfstr, show, sizeof(perfstr)-strlen(perfstr)-1);
+                       len = sizeof(perfstr)-strlen(perfstr)-1;
+                       strncat(perfstr, show, len>ptr-show ? ptr-show : len);
 
                        if (type)
                                strncat(perfstr, type, sizeof(perfstr)-strlen(perfstr)-1);
@@ -363,10 +379,8 @@ main (int argc, char **argv)
                }
        }
 
-/*     if (nunits == 1 || i == 1) */
-/*             printf ("%s %s -%s %s\n", label, state_text (result), outbuff, units); */
-/*     else */
        printf ("%s %s -%s %s \n", label, state_text (result), outbuff, perfstr);
+       if (mult_resp) printf ("%s", mult_resp);
 
        return result;
 }
@@ -440,7 +454,7 @@ process_arguments (int argc, char **argv)
                        print_revision (progname, NP_VERSION);
                        exit (STATE_OK);
                case 'v': /* verbose */
-                       verbose = TRUE;
+                       verbose++;
                        break;
 
        /* Connection info */
@@ -453,7 +467,7 @@ process_arguments (int argc, char **argv)
                case 'p':       /* TCP port number */
                        port = optarg;
                        break;
-               case 'm':       /* List of MIBS  */
+               case 'm':       /* List of MIBS */
                        miblist = optarg;
                        break;
                case 'n':       /* usesnmpgetnext */
@@ -488,27 +502,11 @@ process_arguments (int argc, char **argv)
                        break;
 
        /* Test parameters */
-               case 'c':                                                                       /* critical time threshold */
-                       if (strspn (optarg, "0123456789:,") < strlen (optarg))
-                               usage2 (_("Invalid critical threshold"), optarg);
-                       for (ptr = optarg; ptr && jj < MAX_OIDS; jj++) {
-                               if (llu_getll (&lower_crit_lim[jj], ptr) == 1)
-                                       eval_method[jj] |= CRIT_LT;
-                               if (llu_getul (&upper_crit_lim[jj], ptr) == 1)
-                                       eval_method[jj] |= CRIT_GT;
-                               (ptr = index (ptr, ',')) ? ptr++ : ptr;
-                       }
+               case 'c':                                                                       /* critical threshold */
+                       critical_thresholds = optarg;
                        break;
-               case 'w':                                                                       /* warning time threshold */
-                       if (strspn (optarg, "0123456789:,") < strlen (optarg))
-                               usage2 (_("Invalid warning threshold"), optarg);
-                       for (ptr = optarg; ptr && ii < MAX_OIDS; ii++) {
-                               if (llu_getll (&lower_warn_lim[ii], ptr) == 1)
-                                       eval_method[ii] |= WARN_LT;
-                               if (llu_getul (&upper_warn_lim[ii], ptr) == 1)
-                                       eval_method[ii] |= WARN_GT;
-                               (ptr = index (ptr, ',')) ? ptr++ : ptr;
-                       }
+               case 'w':                                                                       /* warning threshold */
+                       warning_thresholds = optarg;
                        break;
                case 'e': /* PRELIMINARY - may change */
                case 'E': /* PRELIMINARY - may change */
@@ -526,10 +524,9 @@ process_arguments (int argc, char **argv)
                                         */
                                        needmibs = TRUE;
                        }
-                       oids = calloc(MAX_OIDS, sizeof (char *));
-                       for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", ")) {
+                       if (!oids) oids = calloc(MAX_OIDS, sizeof (char *));
+                       for (ptr = strtok(optarg, ", "); ptr != NULL && j < MAX_OIDS; ptr = strtok(NULL, ", "), j++) {
                                oids[j] = strdup(ptr);
-                               j++;
                        }
                        numoids = j;
                        if (c == 'E' || c == 'e') {
@@ -667,10 +664,10 @@ validate_arguments ()
 {
        /* check whether to load locally installed MIBS (CPU/disk intensive) */
        if (miblist == NULL) {
-               if ( needmibs  == TRUE ) {
+               if ( needmibs == TRUE ) {
                        miblist = strdup (DEFAULT_MIBLIST);
                }else{
-                       miblist = "''";                 /* don't read any mib files for numeric oids */
+                       miblist = "";                   /* don't read any mib files for numeric oids */
                }
        }
 
@@ -759,117 +756,6 @@ validate_arguments ()
 
 
 
-char *
-clarify_message (char *msg)
-{
-       int i = 0;
-       int foo;
-       char tmpmsg_c[MAX_INPUT_BUFFER];
-       char *tmpmsg = (char *) &tmpmsg_c;
-       tmpmsg = strcpy (tmpmsg, msg);
-       if (!strncmp (tmpmsg, " Hex:", 5)) {
-               tmpmsg = strtok (tmpmsg, ":");
-               while ((tmpmsg = strtok (NULL, " "))) {
-                       foo = strtol (tmpmsg, NULL, 16);
-                       /* Translate chars that are not the same value in the printers
-                        * character set.
-                        */
-                       switch (foo) {
-                       case 208:
-                               {
-                                       foo = 197;
-                                       break;
-                               }
-                       case 216:
-                               {
-                                       foo = 196;
-                                       break;
-                               }
-                       }
-                       msg[i] = foo;
-                       i++;
-               }
-               msg[i] = 0;
-       }
-       return (msg);
-}
-
-
-
-int
-check_num (int i)
-{
-       int result;
-       result = STATE_OK;
-       if (eval_method[i] & WARN_GT && eval_method[i] & WARN_LT &&
-                       lower_warn_lim[i] > upper_warn_lim[i]) {
-               if (response_value[i] <= lower_warn_lim[i] &&
-                               response_value[i] >= upper_warn_lim[i]) {
-                       result = STATE_WARNING;
-               }
-       }
-       else if
-               ((eval_method[i] & WARN_GT && response_value[i] > upper_warn_lim[i]) ||
-                (eval_method[i] & WARN_GE && response_value[i] >= upper_warn_lim[i]) ||
-                (eval_method[i] & WARN_LT && response_value[i] < lower_warn_lim[i]) ||
-                (eval_method[i] & WARN_LE && response_value[i] <= lower_warn_lim[i]) ||
-                (eval_method[i] & WARN_EQ && response_value[i] == upper_warn_lim[i]) ||
-                (eval_method[i] & WARN_NE && response_value[i] != upper_warn_lim[i])) {
-               result = STATE_WARNING;
-       }
-
-       if (eval_method[i] & CRIT_GT && eval_method[i] & CRIT_LT &&
-                       lower_crit_lim[i] > upper_crit_lim[i]) {
-               if (response_value[i] <= lower_crit_lim[i] &&
-                               response_value[i] >= upper_crit_lim[i]) {
-                       result = STATE_CRITICAL;
-               }
-       }
-       else if
-               ((eval_method[i] & CRIT_GT && response_value[i] > upper_crit_lim[i]) ||
-                (eval_method[i] & CRIT_GE && response_value[i] >= upper_crit_lim[i]) ||
-                (eval_method[i] & CRIT_LT && response_value[i] < lower_crit_lim[i]) ||
-                (eval_method[i] & CRIT_LE && response_value[i] <= lower_crit_lim[i]) ||
-                (eval_method[i] & CRIT_EQ && response_value[i] == upper_crit_lim[i]) ||
-                (eval_method[i] & CRIT_NE && response_value[i] != upper_crit_lim[i])) {
-               result = STATE_CRITICAL;
-       }
-
-       return result;
-}
-
-
-
-int
-llu_getll (unsigned long long *ll, char *str)
-{
-       char tmp[100];
-       if (strchr (str, ':') == NULL)
-               return 0;
-       if (strchr (str, ',') != NULL && (strchr (str, ',') < strchr (str, ':')))
-               return 0;
-       if (sscanf (str, "%llu%[:]", ll, tmp) == 2)
-               return 1;
-       return 0;
-}
-
-
-
-int
-llu_getul (unsigned long long *ul, char *str)
-{
-       char tmp[100];
-       if (sscanf (str, "%llu%[^,]", ul, tmp) == 1)
-               return 1;
-       if (sscanf (str, ":%llu%[^,]", ul, tmp) == 1)
-               return 1;
-       if (sscanf (str, "%*u:%llu%[^,]", ul, tmp) == 1)
-               return 1;
-       return 0;
-}
-
-
-
 /* trim leading whitespace
         if there is a leading quote, make sure it balances */
 
@@ -930,106 +816,98 @@ print_help (void)
 
        printf ("%s\n", _("Check status of remote machines and obtain system information via SNMP"));
 
-  printf ("\n\n");
+       printf ("\n\n");
 
        print_usage ();
 
-       printf (_(UT_HELP_VRSN));
-       printf (_(UT_EXTRA_OPTS));
+       printf (UT_HELP_VRSN);
+       printf (UT_EXTRA_OPTS);
 
-       printf (_(UT_HOST_PORT), 'p', DEFAULT_PORT);
+       printf (UT_HOST_PORT, 'p', DEFAULT_PORT);
 
        /* SNMP and Authentication Protocol */
        printf (" %s\n", "-n, --next");
-  printf ("    %s\n", _("Use SNMP GETNEXT instead of SNMP GET"));
-  printf (" %s\n", "-P, --protocol=[1|2c|3]");
-  printf ("    %s\n", _("SNMP protocol version"));
-  printf (" %s\n", "-L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]");
-  printf ("    %s\n", _("SNMPv3 securityLevel"));
-  printf (" %s\n", "-a, --authproto=[MD5|SHA]");
-  printf ("    %s\n", _("SNMPv3 auth proto"));
-  printf (" %s\n", "-x, --privproto=[DES|AES]");
-  printf ("    %s\n", _("SNMPv3 priv proto (default DES)"));
+       printf ("    %s\n", _("Use SNMP GETNEXT instead of SNMP GET"));
+       printf (" %s\n", "-P, --protocol=[1|2c|3]");
+       printf ("    %s\n", _("SNMP protocol version"));
+       printf (" %s\n", "-L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]");
+       printf ("    %s\n", _("SNMPv3 securityLevel"));
+       printf (" %s\n", "-a, --authproto=[MD5|SHA]");
+       printf ("    %s\n", _("SNMPv3 auth proto"));
+       printf (" %s\n", "-x, --privproto=[DES|AES]");
+       printf ("    %s\n", _("SNMPv3 priv proto (default DES)"));
 
        /* Authentication Tokens*/
        printf (" %s\n", "-C, --community=STRING");
-  printf ("    %s ", _("Optional community string for SNMP communication"));
-  printf ("(%s \"%s\")\n", _("default is") ,DEFAULT_COMMUNITY);
-  printf (" %s\n", "-U, --secname=USERNAME");
-  printf ("    %s\n", _("SNMPv3 username"));
-  printf (" %s\n", "-A, --authpassword=PASSWORD");
-  printf ("    %s\n", _("SNMPv3 authentication password"));
-  printf (" %s\n", "-X, --privpasswd=PASSWORD");
-  printf ("    %s\n", _("SNMPv3 privacy password"));
+       printf ("    %s ", _("Optional community string for SNMP communication"));
+       printf ("(%s \"%s\")\n", _("default is") ,DEFAULT_COMMUNITY);
+       printf (" %s\n", "-U, --secname=USERNAME");
+       printf ("    %s\n", _("SNMPv3 username"));
+       printf (" %s\n", "-A, --authpassword=PASSWORD");
+       printf ("    %s\n", _("SNMPv3 authentication password"));
+       printf (" %s\n", "-X, --privpasswd=PASSWORD");
+       printf ("    %s\n", _("SNMPv3 privacy password"));
 
        /* OID Stuff */
        printf (" %s\n", "-o, --oid=OID(s)");
-  printf ("    %s\n", _("Object identifier(s) or SNMP variables whose value you wish to query"));
-  printf (" %s\n", "-m, --miblist=STRING");
-  printf ("    %s\n", _("List of MIBS to be loaded (default = none if using numeric OIDs or 'ALL'"));
-  printf ("    %s\n", _("for symbolic OIDs.)"));
-  printf (" %s\n", "-d, --delimiter=STRING");
-  printf (_("    Delimiter to use when parsing returned data. Default is \"%s\""), DEFAULT_DELIMITER);
-  printf ("    %s\n", _("Any data on the right hand side of the delimiter is considered"));
-  printf ("    %s\n", _("to be the data that should be used in the evaluation."));
+       printf ("    %s\n", _("Object identifier(s) or SNMP variables whose value you wish to query"));
+       printf (" %s\n", "-m, --miblist=STRING");
+       printf ("    %s\n", _("List of MIBS to be loaded (default = none if using numeric OIDs or 'ALL'"));
+       printf ("    %s\n", _("for symbolic OIDs.)"));
+       printf (" %s\n", "-d, --delimiter=STRING");
+       printf ("    %s \"%s\"\n", _("Delimiter to use when parsing returned data. Default is"), DEFAULT_DELIMITER);
+       printf ("    %s\n", _("Any data on the right hand side of the delimiter is considered"));
+       printf ("    %s\n", _("to be the data that should be used in the evaluation."));
 
        /* Tests Against Integers */
-       printf (" %s\n", "-w, --warning=INTEGER_RANGE(s)");
-  printf ("    %s\n", _("Range(s) which will not result in a WARNING status"));
-  printf (" %s\n", "-c, --critical=INTEGER_RANGE(s)");
-  printf ("    %s\n", _("Range(s) which will not result in a CRITICAL status"));
+       printf (" %s\n", "-w, --warning=THRESHOLD(s)");
+       printf ("    %s\n", _("Warning threshold range(s)"));
+       printf (" %s\n", "-c, --critical=THRESHOLD(s)");
+       printf ("    %s\n", _("Critical threshold range(s)"));
 
        /* Tests Against Strings */
        printf (" %s\n", "-s, --string=STRING");
-  printf ("    %s\n", _("Return OK state (for that OID) if STRING is an exact match"));
-  printf (" %s\n", "-r, --ereg=REGEX");
-  printf ("    %s\n", _("Return OK state (for that OID) if extended regular expression REGEX matches"));
-  printf (" %s\n", "-R, --eregi=REGEX");
-  printf ("    %s\n", _("Return OK state (for that OID) if case-insensitive extended REGEX matches"));
-  printf (" %s\n", "-l, --label=STRING");
-  printf ("    %s\n", _("Prefix label for output from plugin (default -s 'SNMP')"));
+       printf ("    %s\n", _("Return OK state (for that OID) if STRING is an exact match"));
+       printf (" %s\n", "-r, --ereg=REGEX");
+       printf ("    %s\n", _("Return OK state (for that OID) if extended regular expression REGEX matches"));
+       printf (" %s\n", "-R, --eregi=REGEX");
+       printf ("    %s\n", _("Return OK state (for that OID) if case-insensitive extended REGEX matches"));
+       printf (" %s\n", "-l, --label=STRING");
+       printf ("    %s\n", _("Prefix label for output from plugin (default -s 'SNMP')"));
 
        /* Output Formatting */
        printf (" %s\n", "-u, --units=STRING");
-  printf ("    %s\n", _("Units label(s) for output data (e.g., 'sec.')."));
-  printf (" %s\n", "-D, --output-delimiter=STRING");
-  printf ("    %s\n", _("Separates output on multiple OID requests"));
+       printf ("    %s\n", _("Units label(s) for output data (e.g., 'sec.')."));
+       printf (" %s\n", "-D, --output-delimiter=STRING");
+       printf ("    %s\n", _("Separates output on multiple OID requests"));
 
-       printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
+       printf (UT_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
        printf (" %s\n", "-e, --retries=INTEGER");
        printf ("    %s\n", _("Number of retries to be used in the requests"));
 
-       printf (_(UT_VERBOSE));
-
-  printf ("\n");
-  printf ("%s\n", _("This plugin uses the 'snmpget' command included with the NET-SNMP package."));
-  printf ("%s\n", _("if you don't have the package installed, you will need to download it from"));
-  printf ("%s\n", _("http://net-snmp.sourceforge.net before you can use this plugin."));
+       printf (UT_VERBOSE);
 
-  printf ("\n");
-  printf ("%s\n", _("Notes:"));
-  printf (" %s\n", _("- Multiple OIDs may be indicated by a comma- or space-delimited list (lists with"));
-  printf ("   %s\n", _("internal spaces must be quoted) [max 8 OIDs]"));
+       printf ("\n");
+       printf ("%s\n", _("This plugin uses the 'snmpget' command included with the NET-SNMP package."));
+       printf ("%s\n", _("if you don't have the package installed, you will need to download it from"));
+       printf ("%s\n", _("http://net-snmp.sourceforge.net before you can use this plugin."));
 
-  printf (" %s\n", _("- Ranges are inclusive and are indicated with colons. When specified as"));
-  printf ("   %s\n", _("'min:max' a STATE_OK will be returned if the result is within the indicated"));
-  printf ("   %s\n", _("range or is equal to the upper or lower bound. A non-OK state will be"));
-  printf ("   %s\n", _("returned if the result is outside the specified range."));
+       printf ("\n");
+       printf ("%s\n", _("Notes:"));
+       printf (" %s\n", _("- Multiple OIDs may be indicated by a comma- or space-delimited list (lists with"));
+       printf ("   %s\n", _("internal spaces must be quoted) [max 8 OIDs]"));
 
-  printf (" %s\n", _("- If specified in the order 'max:min' a non-OK state will be returned if the"));
-  printf ("   %s\n", _("result is within the (inclusive) range."));
+       printf(" -%s", UT_THRESHOLDS_NOTES);
 
-  printf (" %s\n", _("- Upper or lower bounds may be omitted to skip checking the respective limit."));
-  printf (" %s\n", _("- Bare integers are interpreted as upper limits."));
-  printf (" %s\n", _("- When checking multiple OIDs, separate ranges by commas like '-w 1:10,1:,:20'"));
-  printf (" %s\n", _("- Note that only one string and one regex may be checked at present"));
-  printf (" %s\n", _("- All evaluation methods other than PR, STR, and SUBSTR expect that the value"));
-  printf ("   %s\n", _("returned from the SNMP query is an unsigned integer."));
+       printf (" %s\n", _("- When checking multiple OIDs, separate ranges by commas like '-w 1:10,1:,:20'"));
+       printf (" %s\n", _("- Note that only one string and one regex may be checked at present"));
+       printf (" %s\n", _("- All evaluation methods other than PR, STR, and SUBSTR expect that the value"));
+       printf ("   %s\n", _("returned from the SNMP query is an unsigned integer."));
 #ifdef NP_EXTRA_OPTS
-  printf (" -%s", _(UT_EXTRA_OPTS_NOTES));
+       printf (" -%s", UT_EXTRA_OPTS_NOTES);
 #endif
 
-       printf (_(UT_SUPPORT));
+       printf (UT_SUPPORT);
 }
 
 
@@ -1037,10 +915,10 @@ print_help (void)
 void
 print_usage (void)
 {
-  printf (_("Usage:"));
+       printf (_("Usage:"));
        printf ("%s -H <ip_address> -o <OID> [-w warn_range] [-c crit_range]\n",progname);
-  printf ("[-C community] [-s string] [-r regex] [-R regexi] [-t timeout] [-e retries]\n");
-  printf ("[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]\n");
-  printf ("[-m miblist] [-P snmp version] [-L seclevel] [-U secname] [-a authproto]\n");
-  printf ("[-A authpasswd] [-x privproto] [-X privpasswd]\n");
+       printf ("[-C community] [-s string] [-r regex] [-R regexi] [-t timeout] [-e retries]\n");
+       printf ("[-l label] [-u units] [-p port-number] [-d delimiter] [-D output-delimiter]\n");
+       printf ("[-m miblist] [-P snmp version] [-L seclevel] [-U secname] [-a authproto]\n");
+       printf ("[-A authpasswd] [-x privproto] [-X privpasswd]\n");
 }