Module: monitoring-plugins
    Branch: master
    Commit: a1f328900049852d9a2b4c810c28b49e2101e337
    Author: Ken D <kdobb...@op5.com>
 Committer: Lorenz Kästle <lorenz.kaes...@netways.de>
      Date: Mon Jun 19 14:06:05 2017 -0500
       URL: 
https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=a1f3289

Added option for null zero length string exit codes

When using a large distributed network with the same group of checks used 
against a large number of devices, occationally there are missing cards in a 
few devices that are present in other devices. Rather than having a large 
number of unknown results, disable active checking on those large number of 
result or having to create a unique check configuration for those devices.

This option allows you to select an OK, WARNING, CRITICAL or UNKNOWN status 
while still retaining the default behavior when not present. This also allows a 
for the check to immediately start checks as intended should the hardware be 
added that the check is looking for.

---

 plugins/check_snmp.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index abe54cf..66d761c 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -113,6 +113,7 @@ char *authproto = NULL;
 char *privproto = NULL;
 char *authpasswd = NULL;
 char *privpasswd = NULL;
+int nulloid = 3;
 char **oids = NULL;
 size_t oids_size = 0;
 char *label;
@@ -472,8 +473,16 @@ main (int argc, char **argv)
                                print_thresholds("  thresholds", thlds[i]);
                        }
                        ptr = strpbrk (show, "-0123456789");
-                       if (ptr == NULL)
-                               die (STATE_UNKNOWN,_("No valid data returned 
(%s)\n"), show);
+                       if (ptr == NULL){
+                               if (nulloid == 3)
+                                       die (STATE_UNKNOWN,_("No valid data 
returned (%s)\n"), show);
+                               else if (nulloid == 0)
+                                       die (STATE_OK,_("No valid data returned 
(%s)\n"), show);
+                               else if (nulloid == 1)
+                                       die (STATE_WARNING,_("No valid data 
returned (%s)\n"), show);
+                               else if (nulloid == 2)
+                                       die (STATE_CRITICAL,_("No valid data 
returned (%s)\n"), show);
+                       }
                        while (i >= response_size) {
                                response_size += OID_COUNT_STEP;
                                response_value = realloc(response_value, 
response_size * sizeof(*response_value));
@@ -661,6 +670,7 @@ process_arguments (int argc, char **argv)
                {"oid", required_argument, 0, 'o'},
                {"object", required_argument, 0, 'o'},
                {"delimiter", required_argument, 0, 'd'},
+               {"nulloid", required_argument, 0, 'z'},
                {"output-delimiter", required_argument, 0, 'D'},
                {"string", required_argument, 0, 's'},
                {"timeout", required_argument, 0, 't'},
@@ -705,7 +715,7 @@ process_arguments (int argc, char **argv)
        }
 
        while (1) {
-               c = getopt_long (argc, argv, 
"nhvVO46t:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:N:L:U:a:x:A:X:",
+               c = getopt_long (argc, argv, 
"nhvVO46t:c:w:H:C:o:e:E:d:D:s:t:R:r:l:u:p:m:P:N:L:U:a:x:A:X:z:",
                                                                         
longopts, &option);
 
                if (c == -1 || c == EOF)
@@ -816,6 +826,12 @@ process_arguments (int argc, char **argv)
                                        eval_method[j+1] |= CRIT_PRESENT;
                        }
                        break;
+               case 'z':       /* Null OID Return Check */
+                       if (!is_integer (optarg))
+                               usage2 (_("Exit status must be a positive 
integer"), optarg);
+                       else
+                               nulloid = atoi(optarg);
+                       break;
                case 's':                                                       
                /* string or substring */
                        strncpy (string_value, optarg, sizeof (string_value) - 
1);
                        string_value[sizeof (string_value) - 1] = 0;
@@ -1181,6 +1197,14 @@ print_help (void)
        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."));
+       printf (" %s\n", "-z, --nulloid=#");
+       printf ("    %s\n", _("If the check returns a 0 length string or NULL 
value"));
+       printf ("    %s\n", _("This option allows you to choose what status you 
want it to exit"));
+       printf ("    %s\n", _("Excluding this option renders the default exit 
of 3(STATE_UNKNOWN)"));
+       printf ("    %s\n", _("0 = OK"));
+       printf ("    %s\n", _("1 = WARNING"));
+       printf ("    %s\n", _("2 = CRITICAL"));
+       printf ("    %s\n", _("3 = UNKNOWN"));
 
        /* Tests Against Integers */
        printf (" %s\n", "-w, --warning=THRESHOLD(s)");

Reply via email to