diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/check_disk.c | 21 | ||||
| -rw-r--r-- | plugins/check_snmp.c | 94 | ||||
| -rw-r--r-- | plugins/t/check_snmp.t | 293 | ||||
| -rw-r--r-- | plugins/t/check_tcp.t | 2 |
4 files changed, 242 insertions, 168 deletions
diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 4ea03935..47dc0adc 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c | |||
| @@ -138,6 +138,7 @@ int verbose = 0; | |||
| 138 | int erronly = FALSE; | 138 | int erronly = FALSE; |
| 139 | int display_mntp = FALSE; | 139 | int display_mntp = FALSE; |
| 140 | int exact_match = FALSE; | 140 | int exact_match = FALSE; |
| 141 | int freespace_ignore_reserved = FALSE; | ||
| 141 | char *warn_freespace_units = NULL; | 142 | char *warn_freespace_units = NULL; |
| 142 | char *crit_freespace_units = NULL; | 143 | char *crit_freespace_units = NULL; |
| 143 | char *warn_freespace_percent = NULL; | 144 | char *warn_freespace_percent = NULL; |
| @@ -431,6 +432,7 @@ process_arguments (int argc, char **argv) | |||
| 431 | {"eregi-partition", required_argument, 0, 'R'}, | 432 | {"eregi-partition", required_argument, 0, 'R'}, |
| 432 | {"ereg-path", required_argument, 0, 'r'}, | 433 | {"ereg-path", required_argument, 0, 'r'}, |
| 433 | {"ereg-partition", required_argument, 0, 'r'}, | 434 | {"ereg-partition", required_argument, 0, 'r'}, |
| 435 | {"freespace-ignore-reserved", no_argument, 0, 'f'}, | ||
| 434 | {"ignore-ereg-path", required_argument, 0, 'i'}, | 436 | {"ignore-ereg-path", required_argument, 0, 'i'}, |
| 435 | {"ignore-ereg-partition", required_argument, 0, 'i'}, | 437 | {"ignore-ereg-partition", required_argument, 0, 'i'}, |
| 436 | {"ignore-eregi-path", required_argument, 0, 'I'}, | 438 | {"ignore-eregi-path", required_argument, 0, 'I'}, |
| @@ -459,7 +461,7 @@ process_arguments (int argc, char **argv) | |||
| 459 | strcpy (argv[c], "-t"); | 461 | strcpy (argv[c], "-t"); |
| 460 | 462 | ||
| 461 | while (1) { | 463 | while (1) { |
| 462 | c = getopt_long (argc, argv, "+?VqhveCt:c:w:K:W:u:p:x:X:N:mklLg:R:r:i:I:MEA", longopts, &option); | 464 | c = getopt_long (argc, argv, "+?VqhvefCt:c:w:K:W:u:p:x:X:N:mklLg:R:r:i:I:MEA", longopts, &option); |
| 463 | 465 | ||
| 464 | if (c == -1 || c == EOF) | 466 | if (c == -1 || c == EOF) |
| 465 | break; | 467 | break; |
| @@ -616,6 +618,9 @@ process_arguments (int argc, char **argv) | |||
| 616 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n")); | 618 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set -E before selecting paths\n")); |
| 617 | exact_match = TRUE; | 619 | exact_match = TRUE; |
| 618 | break; | 620 | break; |
| 621 | case 'f': | ||
| 622 | freespace_ignore_reserved = TRUE; | ||
| 623 | break; | ||
| 619 | case 'g': | 624 | case 'g': |
| 620 | if (path_selected) | 625 | if (path_selected) |
| 621 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting paths\n")); | 626 | die (STATE_UNKNOWN, "DISK %s: %s", _("UNKNOWN"), _("Must set group value before selecting paths\n")); |
| @@ -881,6 +886,8 @@ print_help (void) | |||
| 881 | printf (" %s\n", _("For paths or partitions specified with -p, only check for exact paths")); | 886 | printf (" %s\n", _("For paths or partitions specified with -p, only check for exact paths")); |
| 882 | printf (" %s\n", "-e, --errors-only"); | 887 | printf (" %s\n", "-e, --errors-only"); |
| 883 | printf (" %s\n", _("Display only devices/mountpoints with errors")); | 888 | printf (" %s\n", _("Display only devices/mountpoints with errors")); |
| 889 | printf (" %s\n", "-f, --freespace-ignore-reserved"); | ||
| 890 | printf (" %s\n", _("Don't account root-reserved blocks into freespace in perfdata")); | ||
| 884 | printf (" %s\n", "-g, --group=NAME"); | 891 | printf (" %s\n", "-g, --group=NAME"); |
| 885 | printf (" %s\n", _("Group paths. Thresholds apply to (free-)space of all partitions together")); | 892 | printf (" %s\n", _("Group paths. Thresholds apply to (free-)space of all partitions together")); |
| 886 | printf (" %s\n", "-k, --kilobytes"); | 893 | printf (" %s\n", "-k, --kilobytes"); |
| @@ -933,7 +940,7 @@ print_usage (void) | |||
| 933 | { | 940 | { |
| 934 | printf ("%s\n", _("Usage:")); | 941 | printf ("%s\n", _("Usage:")); |
| 935 | printf (" %s -w limit -c limit [-W limit] [-K limit] {-p path | -x device}\n", progname); | 942 | printf (" %s -w limit -c limit [-W limit] [-K limit] {-p path | -x device}\n", progname); |
| 936 | printf ("[-C] [-E] [-e] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n"); | 943 | printf ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n"); |
| 937 | printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n"); | 944 | printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n"); |
| 938 | } | 945 | } |
| 939 | 946 | ||
| @@ -1006,13 +1013,19 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) { | |||
| 1006 | 1013 | ||
| 1007 | void | 1014 | void |
| 1008 | get_path_stats (struct parameter_list *p, struct fs_usage *fsp) { | 1015 | get_path_stats (struct parameter_list *p, struct fs_usage *fsp) { |
| 1009 | p->total = fsp->fsu_blocks; | ||
| 1010 | /* 2007-12-08 - Workaround for Gnulib reporting insanely high available | 1016 | /* 2007-12-08 - Workaround for Gnulib reporting insanely high available |
| 1011 | * space on BSD (the actual value should be negative but fsp->fsu_bavail | 1017 | * space on BSD (the actual value should be negative but fsp->fsu_bavail |
| 1012 | * is unsigned) */ | 1018 | * is unsigned) */ |
| 1013 | p->available = fsp->fsu_bavail > fsp->fsu_bfree ? 0 : fsp->fsu_bavail; | 1019 | p->available = fsp->fsu_bavail > fsp->fsu_bfree ? 0 : fsp->fsu_bavail; |
| 1014 | p->available_to_root = fsp->fsu_bfree; | 1020 | p->available_to_root = fsp->fsu_bfree; |
| 1015 | p->used = p->total - p->available_to_root; | 1021 | p->used = fsp->fsu_blocks - fsp->fsu_bfree; |
| 1022 | if (freespace_ignore_reserved) { | ||
| 1023 | /* option activated : we substract the root-reserved space from the total */ | ||
| 1024 | p->total = fsp->fsu_blocks - p->available_to_root + p->available; | ||
| 1025 | } else { | ||
| 1026 | /* default behaviour : take all the blocks into account */ | ||
| 1027 | p->total = fsp->fsu_blocks; | ||
| 1028 | } | ||
| 1016 | 1029 | ||
| 1017 | p->dused_units = p->used*fsp->fsu_blocksize/mult; | 1030 | p->dused_units = p->used*fsp->fsu_blocksize/mult; |
| 1018 | p->dfree_units = p->available*fsp->fsu_blocksize/mult; | 1031 | p->dfree_units = p->available*fsp->fsu_blocksize/mult; |
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c index 7c3bc4b9..bae38300 100644 --- a/plugins/check_snmp.c +++ b/plugins/check_snmp.c | |||
| @@ -57,7 +57,7 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
| 57 | #define WARN_STRING 16 | 57 | #define WARN_STRING 16 |
| 58 | #define WARN_REGEX 32 | 58 | #define WARN_REGEX 32 |
| 59 | 59 | ||
| 60 | #define MAX_OIDS 8 | 60 | #define OID_COUNT_STEP 8 |
| 61 | 61 | ||
| 62 | /* Longopts only arguments */ | 62 | /* Longopts only arguments */ |
| 63 | #define L_CALCULATE_RATE CHAR_MAX+1 | 63 | #define L_CALCULATE_RATE CHAR_MAX+1 |
| @@ -112,6 +112,7 @@ char *privproto = NULL; | |||
| 112 | char *authpasswd = NULL; | 112 | char *authpasswd = NULL; |
| 113 | char *privpasswd = NULL; | 113 | char *privpasswd = NULL; |
| 114 | char **oids = NULL; | 114 | char **oids = NULL; |
| 115 | size_t oids_size = NULL; | ||
| 115 | char *label; | 116 | char *label; |
| 116 | char *units; | 117 | char *units; |
| 117 | char *port; | 118 | char *port; |
| @@ -121,19 +122,22 @@ int invert_search=0; | |||
| 121 | char **labels = NULL; | 122 | char **labels = NULL; |
| 122 | char **unitv = NULL; | 123 | char **unitv = NULL; |
| 123 | size_t nlabels = 0; | 124 | size_t nlabels = 0; |
| 124 | size_t labels_size = 8; | 125 | size_t labels_size = OID_COUNT_STEP; |
| 125 | size_t nunits = 0; | 126 | size_t nunits = 0; |
| 126 | size_t unitv_size = 8; | 127 | size_t unitv_size = OID_COUNT_STEP; |
| 127 | int numoids = 0; | 128 | int numoids = 0; |
| 128 | int numauthpriv = 0; | 129 | int numauthpriv = 0; |
| 129 | int verbose = 0; | 130 | int verbose = 0; |
| 130 | int usesnmpgetnext = FALSE; | 131 | int usesnmpgetnext = FALSE; |
| 131 | char *warning_thresholds = NULL; | 132 | char *warning_thresholds = NULL; |
| 132 | char *critical_thresholds = NULL; | 133 | char *critical_thresholds = NULL; |
| 133 | thresholds *thlds[MAX_OIDS]; | 134 | thresholds **thlds; |
| 134 | double response_value[MAX_OIDS]; | 135 | size_t thlds_size = OID_COUNT_STEP; |
| 136 | double *response_value; | ||
| 137 | size_t response_size = OID_COUNT_STEP; | ||
| 135 | int retries = 0; | 138 | int retries = 0; |
| 136 | int eval_method[MAX_OIDS]; | 139 | int *eval_method; |
| 140 | size_t eval_size = OID_COUNT_STEP; | ||
| 137 | char *delimiter; | 141 | char *delimiter; |
| 138 | char *output_delim; | 142 | char *output_delim; |
| 139 | char *miblist = NULL; | 143 | char *miblist = NULL; |
| @@ -142,7 +146,8 @@ int calculate_rate = 0; | |||
| 142 | double offset = 0.0; | 146 | double offset = 0.0; |
| 143 | int rate_multiplier = 1; | 147 | int rate_multiplier = 1; |
| 144 | state_data *previous_state; | 148 | state_data *previous_state; |
| 145 | double previous_value[MAX_OIDS]; | 149 | double *previous_value; |
| 150 | size_t previous_size = OID_COUNT_STEP; | ||
| 146 | int perf_labels = 1; | 151 | int perf_labels = 1; |
| 147 | 152 | ||
| 148 | 153 | ||
| @@ -150,16 +155,18 @@ static char *fix_snmp_range(char *th) | |||
| 150 | { | 155 | { |
| 151 | double left, right; | 156 | double left, right; |
| 152 | char *colon, *ret; | 157 | char *colon, *ret; |
| 153 | if (!(colon = strchr(th, ':'))) | 158 | |
| 159 | if ((colon = strchr(th, ':')) == NULL || *(colon + 1) == '\0') | ||
| 154 | return th; | 160 | return th; |
| 155 | *colon = 0; | ||
| 156 | 161 | ||
| 157 | left = strtod(th, NULL); | 162 | left = strtod(th, NULL); |
| 158 | right = strtod(colon + 1, NULL); | 163 | right = strtod(colon + 1, NULL); |
| 159 | if (right >= left) { | 164 | if (right >= left) |
| 160 | return th; | 165 | return th; |
| 161 | } | 166 | |
| 162 | ret = malloc(strlen(th) + strlen(colon + 1) + 2); | 167 | if ((ret = malloc(strlen(th) + 2)) == NULL) |
| 168 | die(STATE_UNKNOWN, _("Cannot malloc")); | ||
| 169 | *colon = '\0'; | ||
| 163 | sprintf(ret, "@%s:%s", colon + 1, th); | 170 | sprintf(ret, "@%s:%s", colon + 1, th); |
| 164 | free(th); | 171 | free(th); |
| 165 | return ret; | 172 | return ret; |
| @@ -204,8 +211,11 @@ main (int argc, char **argv) | |||
| 204 | 211 | ||
| 205 | labels = malloc (labels_size * sizeof(*labels)); | 212 | labels = malloc (labels_size * sizeof(*labels)); |
| 206 | unitv = malloc (unitv_size * sizeof(*unitv)); | 213 | unitv = malloc (unitv_size * sizeof(*unitv)); |
| 207 | for (i = 0; i < MAX_OIDS; i++) | 214 | thlds = malloc (thlds_size * sizeof(*thlds)); |
| 208 | eval_method[i] = CHECK_UNDEF; | 215 | response_value = malloc (response_size * sizeof(*response_value)); |
| 216 | previous_value = malloc (previous_size * sizeof(*previous_value)); | ||
| 217 | eval_method = calloc (eval_size, sizeof(*eval_method)); | ||
| 218 | oids = calloc(oids_size, sizeof (char *)); | ||
| 209 | 219 | ||
| 210 | label = strdup ("SNMP"); | 220 | label = strdup ("SNMP"); |
| 211 | units = strdup (""); | 221 | units = strdup (""); |
| @@ -223,13 +233,14 @@ main (int argc, char **argv) | |||
| 223 | 233 | ||
| 224 | np_set_args(argc, argv); | 234 | np_set_args(argc, argv); |
| 225 | 235 | ||
| 236 | time(¤t_time); | ||
| 237 | |||
| 226 | if (process_arguments (argc, argv) == ERROR) | 238 | if (process_arguments (argc, argv) == ERROR) |
| 227 | usage4 (_("Could not parse arguments")); | 239 | usage4 (_("Could not parse arguments")); |
| 228 | 240 | ||
| 229 | if(calculate_rate) { | 241 | if(calculate_rate) { |
| 230 | if (!strcmp(label, "SNMP")) | 242 | if (!strcmp(label, "SNMP")) |
| 231 | label = strdup("SNMP RATE"); | 243 | label = strdup("SNMP RATE"); |
| 232 | time(¤t_time); | ||
| 233 | i=0; | 244 | i=0; |
| 234 | previous_state = np_state_read(); | 245 | previous_state = np_state_read(); |
| 235 | if(previous_state!=NULL) { | 246 | if(previous_state!=NULL) { |
| @@ -238,6 +249,10 @@ main (int argc, char **argv) | |||
| 238 | while((ap = strsep(&previous_string, ":")) != NULL) { | 249 | while((ap = strsep(&previous_string, ":")) != NULL) { |
| 239 | if(verbose>2) | 250 | if(verbose>2) |
| 240 | printf("State for %d=%s\n", i, ap); | 251 | printf("State for %d=%s\n", i, ap); |
| 252 | while (i >= previous_size) { | ||
| 253 | previous_size += OID_COUNT_STEP; | ||
| 254 | previous_value = realloc(previous_value, previous_size * sizeof(*previous_value)); | ||
| 255 | } | ||
| 241 | previous_value[i++]=strtod(ap,NULL); | 256 | previous_value[i++]=strtod(ap,NULL); |
| 242 | } | 257 | } |
| 243 | } | 258 | } |
| @@ -253,6 +268,11 @@ main (int argc, char **argv) | |||
| 253 | w = w ? fix_snmp_range(w) : NULL; | 268 | w = w ? fix_snmp_range(w) : NULL; |
| 254 | c = c ? fix_snmp_range(c) : NULL; | 269 | c = c ? fix_snmp_range(c) : NULL; |
| 255 | 270 | ||
| 271 | while (i >= thlds_size) { | ||
| 272 | thlds_size += OID_COUNT_STEP; | ||
| 273 | thlds = realloc(thlds, thlds_size * sizeof(*thlds)); | ||
| 274 | } | ||
| 275 | |||
| 256 | /* Skip empty thresholds, while avoiding segfault */ | 276 | /* Skip empty thresholds, while avoiding segfault */ |
| 257 | set_thresholds(&thlds[i], | 277 | set_thresholds(&thlds[i], |
| 258 | w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL, | 278 | w ? strpbrk(w, NP_THRESHOLDS_CHARS) : NULL, |
| @@ -432,6 +452,10 @@ main (int argc, char **argv) | |||
| 432 | ptr = strpbrk (show, "0123456789"); | 452 | ptr = strpbrk (show, "0123456789"); |
| 433 | if (ptr == NULL) | 453 | if (ptr == NULL) |
| 434 | die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show); | 454 | die (STATE_UNKNOWN,_("No valid data returned (%s)\n"), show); |
| 455 | while (i >= response_size) { | ||
| 456 | response_size += OID_COUNT_STEP; | ||
| 457 | response_value = realloc(response_value, response_size * sizeof(*response_value)); | ||
| 458 | } | ||
| 435 | response_value[i] = strtod (ptr, NULL) + offset; | 459 | response_value[i] = strtod (ptr, NULL) + offset; |
| 436 | 460 | ||
| 437 | if(calculate_rate) { | 461 | if(calculate_rate) { |
| @@ -459,7 +483,7 @@ main (int argc, char **argv) | |||
| 459 | } | 483 | } |
| 460 | 484 | ||
| 461 | /* Process this block for string matching */ | 485 | /* Process this block for string matching */ |
| 462 | else if (eval_method[i] & CRIT_STRING) { | 486 | else if (eval_size > i && eval_method[i] & CRIT_STRING) { |
| 463 | if (strcmp (show, string_value)) | 487 | if (strcmp (show, string_value)) |
| 464 | iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK; | 488 | iresult = (invert_search==0) ? STATE_CRITICAL : STATE_OK; |
| 465 | else | 489 | else |
| @@ -467,7 +491,7 @@ main (int argc, char **argv) | |||
| 467 | } | 491 | } |
| 468 | 492 | ||
| 469 | /* Process this block for regex matching */ | 493 | /* Process this block for regex matching */ |
| 470 | else if (eval_method[i] & CRIT_REGEX) { | 494 | else if (eval_size > i && eval_method[i] & CRIT_REGEX) { |
| 471 | excode = regexec (&preg, response, 10, pmatch, eflags); | 495 | excode = regexec (&preg, response, 10, pmatch, eflags); |
| 472 | if (excode == 0) { | 496 | if (excode == 0) { |
| 473 | iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL; | 497 | iresult = (invert_search==0) ? STATE_OK : STATE_CRITICAL; |
| @@ -485,9 +509,9 @@ main (int argc, char **argv) | |||
| 485 | /* Process this block for existence-nonexistence checks */ | 509 | /* Process this block for existence-nonexistence checks */ |
| 486 | /* TV: Should this be outside of this else block? */ | 510 | /* TV: Should this be outside of this else block? */ |
| 487 | else { | 511 | else { |
| 488 | if (eval_method[i] & CRIT_PRESENT) | 512 | if (eval_size > i && eval_method[i] & CRIT_PRESENT) |
| 489 | iresult = STATE_CRITICAL; | 513 | iresult = STATE_CRITICAL; |
| 490 | else if (eval_method[i] & WARN_PRESENT) | 514 | else if (eval_size > i && eval_method[i] & WARN_PRESENT) |
| 491 | iresult = STATE_WARNING; | 515 | iresult = STATE_WARNING; |
| 492 | else if (response && iresult == STATE_DEPENDENT) | 516 | else if (response && iresult == STATE_DEPENDENT) |
| 493 | iresult = STATE_OK; | 517 | iresult = STATE_OK; |
| @@ -727,23 +751,36 @@ process_arguments (int argc, char **argv) | |||
| 727 | */ | 751 | */ |
| 728 | needmibs = TRUE; | 752 | needmibs = TRUE; |
| 729 | } | 753 | } |
| 730 | if (!oids) oids = calloc(MAX_OIDS, sizeof (char *)); | 754 | for (ptr = strtok(optarg, ", "); ptr != NULL; ptr = strtok(NULL, ", "), j++) { |
| 731 | for (ptr = strtok(optarg, ", "); ptr != NULL && j < MAX_OIDS; ptr = strtok(NULL, ", "), j++) { | 755 | while (j >= oids_size) { |
| 756 | oids_size += OID_COUNT_STEP; | ||
| 757 | oids = realloc(oids, oids_size * sizeof (*oids)); | ||
| 758 | } | ||
| 732 | oids[j] = strdup(ptr); | 759 | oids[j] = strdup(ptr); |
| 733 | } | 760 | } |
| 734 | numoids = j; | 761 | numoids = j; |
| 735 | if (c == 'E' || c == 'e') { | 762 | if (c == 'E' || c == 'e') { |
| 736 | jj++; | 763 | jj++; |
| 737 | ii++; | 764 | ii++; |
| 765 | while (j+1 >= eval_size) { | ||
| 766 | eval_size += OID_COUNT_STEP; | ||
| 767 | eval_method = realloc(eval_method, eval_size * sizeof(*eval_method)); | ||
| 768 | memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8); | ||
| 769 | } | ||
| 770 | if (c == 'E') | ||
| 771 | eval_method[j+1] |= WARN_PRESENT; | ||
| 772 | else if (c == 'e') | ||
| 773 | eval_method[j+1] |= CRIT_PRESENT; | ||
| 738 | } | 774 | } |
| 739 | if (c == 'E') | ||
| 740 | eval_method[j+1] |= WARN_PRESENT; | ||
| 741 | else if (c == 'e') | ||
| 742 | eval_method[j+1] |= CRIT_PRESENT; | ||
| 743 | break; | 775 | break; |
| 744 | case 's': /* string or substring */ | 776 | case 's': /* string or substring */ |
| 745 | strncpy (string_value, optarg, sizeof (string_value) - 1); | 777 | strncpy (string_value, optarg, sizeof (string_value) - 1); |
| 746 | string_value[sizeof (string_value) - 1] = 0; | 778 | string_value[sizeof (string_value) - 1] = 0; |
| 779 | while (jj >= eval_size) { | ||
| 780 | eval_size += OID_COUNT_STEP; | ||
| 781 | eval_method = realloc(eval_method, eval_size * sizeof(*eval_method)); | ||
| 782 | memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8); | ||
| 783 | } | ||
| 747 | eval_method[jj++] = CRIT_STRING; | 784 | eval_method[jj++] = CRIT_STRING; |
| 748 | ii++; | 785 | ii++; |
| 749 | break; | 786 | break; |
| @@ -759,6 +796,11 @@ process_arguments (int argc, char **argv) | |||
| 759 | printf (_("Could Not Compile Regular Expression")); | 796 | printf (_("Could Not Compile Regular Expression")); |
| 760 | return ERROR; | 797 | return ERROR; |
| 761 | } | 798 | } |
| 799 | while (jj >= eval_size) { | ||
| 800 | eval_size += OID_COUNT_STEP; | ||
| 801 | eval_method = realloc(eval_method, eval_size * sizeof(*eval_method)); | ||
| 802 | memset(eval_method + eval_size - OID_COUNT_STEP, 0, 8); | ||
| 803 | } | ||
| 762 | eval_method[jj++] = CRIT_REGEX; | 804 | eval_method[jj++] = CRIT_REGEX; |
| 763 | ii++; | 805 | ii++; |
| 764 | break; | 806 | break; |
| @@ -1125,7 +1167,7 @@ print_help (void) | |||
| 1125 | printf ("\n"); | 1167 | printf ("\n"); |
| 1126 | printf ("%s\n", _("Notes:")); | 1168 | printf ("%s\n", _("Notes:")); |
| 1127 | printf (" %s\n", _("- Multiple OIDs (and labels) may be indicated by a comma or space-delimited ")); | 1169 | printf (" %s\n", _("- Multiple OIDs (and labels) may be indicated by a comma or space-delimited ")); |
| 1128 | printf (" %s %i %s\n", _("list (lists with internal spaces must be quoted). Maximum:"), MAX_OIDS, _("OIDs.")); | 1170 | printf (" %s\n", _("list (lists with internal spaces must be quoted).")); |
| 1129 | 1171 | ||
| 1130 | printf(" -%s", UT_THRESHOLDS_NOTES); | 1172 | printf(" -%s", UT_THRESHOLDS_NOTES); |
| 1131 | 1173 | ||
diff --git a/plugins/t/check_snmp.t b/plugins/t/check_snmp.t index 04bf500b..6de5f299 100644 --- a/plugins/t/check_snmp.t +++ b/plugins/t/check_snmp.t | |||
| @@ -8,145 +8,164 @@ use strict; | |||
| 8 | use Test::More; | 8 | use Test::More; |
| 9 | use NPTest; | 9 | use NPTest; |
| 10 | 10 | ||
| 11 | my $tests = 8+42+2+2; | 11 | BEGIN { |
| 12 | plan tests => $tests; | 12 | plan skip_all => 'check_snmp is not compiled' unless -x "./check_snmp"; |
| 13 | plan tests => 60; | ||
| 14 | } | ||
| 15 | |||
| 13 | my $res; | 16 | my $res; |
| 14 | 17 | ||
| 18 | my $host_snmp = getTestParameter( "host_snmp", "NP_HOST_SNMP", "localhost", | ||
| 19 | "A host providing an SNMP Service"); | ||
| 20 | |||
| 21 | my $snmp_community = getTestParameter( "snmp_community", "NP_SNMP_COMMUNITY", "public", | ||
| 22 | "The SNMP Community string for SNMP Testing (assumes snmp v1)" ); | ||
| 23 | |||
| 24 | my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1", | ||
| 25 | "The hostname of system not responsive to network requests" ); | ||
| 26 | |||
| 27 | my $hostname_invalid = getTestParameter( "hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost", | ||
| 28 | "An invalid (not known to DNS) hostname" ); | ||
| 29 | |||
| 30 | $res = NPTest->testCmd( "./check_snmp -t 1" ); | ||
| 31 | is( $res->return_code, 3, "No host name" ); | ||
| 32 | is( $res->output, "No host specified" ); | ||
| 33 | |||
| 34 | $res = NPTest->testCmd( "./check_snmp -H fakehostname" ); | ||
| 35 | is( $res->return_code, 3, "No OIDs specified" ); | ||
| 36 | is( $res->output, "No OIDs specified" ); | ||
| 37 | |||
| 38 | $res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3 --seclevel=rubbish" ); | ||
| 39 | is( $res->return_code, 3, "Invalid seclevel" ); | ||
| 40 | like( $res->output, "/check_snmp: Invalid seclevel - rubbish/" ); | ||
| 41 | |||
| 42 | $res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3c" ); | ||
| 43 | is( $res->return_code, 3, "Invalid protocol" ); | ||
| 44 | like( $res->output, "/check_snmp: Invalid SNMP version - 3c/" ); | ||
| 45 | |||
| 46 | SKIP: { | ||
| 47 | skip "no snmp host defined", 38 if ( ! $host_snmp ); | ||
| 48 | |||
| 49 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); | ||
| 50 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" ); | ||
| 51 | like($res->output, '/^SNMP OK - (\d+)/', "String contains SNMP OK"); | ||
| 52 | $res->output =~ /^SNMP OK - (\d+)/; | ||
| 53 | my $value = $1; | ||
| 54 | cmp_ok( $value, ">", 0, "Got a time value" ); | ||
| 55 | like($res->perf_output, "/sysUpTime.*$1/", "Got perfdata with value '$1' in it"); | ||
| 56 | |||
| 57 | |||
| 58 | # some more threshold tests | ||
| 59 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1"); | ||
| 60 | cmp_ok( $res->return_code, '==', 2, "Threshold test -c 1" ); | ||
| 61 | |||
| 62 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1:"); | ||
| 63 | cmp_ok( $res->return_code, '==', 0, "Threshold test -c 1:" ); | ||
| 64 | |||
| 65 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c ~:1"); | ||
| 66 | cmp_ok( $res->return_code, '==', 2, "Threshold test -c ~:1" ); | ||
| 67 | |||
| 68 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1:10"); | ||
| 69 | cmp_ok( $res->return_code, '==', 2, "Threshold test -c 1:10" ); | ||
| 70 | |||
| 71 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c \@1:10"); | ||
| 72 | cmp_ok( $res->return_code, '==', 0, "Threshold test -c \@1:10" ); | ||
| 73 | |||
| 74 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 10:1"); | ||
| 75 | cmp_ok( $res->return_code, '==', 0, "Threshold test -c 10:1" ); | ||
| 76 | |||
| 77 | |||
| 78 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:"); | ||
| 79 | cmp_ok( $res->return_code, '==', 0, "Test with numeric OID (no mibs loaded)" ); | ||
| 80 | like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK"); | ||
| 81 | |||
| 82 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0"); | ||
| 83 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" ); | ||
| 84 | unlike($res->perf_output, '/sysDescr/', "Perfdata doesn't contain string values"); | ||
| 85 | |||
| 86 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0,system.sysDescr.0"); | ||
| 87 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, comma-separated" ); | ||
| 88 | like($res->output, '/^SNMP OK - /', "String contains SNMP OK"); | ||
| 89 | |||
| 90 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0"); | ||
| 91 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, repeated option" ); | ||
| 92 | like($res->output, '/^SNMP OK - /', "String contains SNMP OK"); | ||
| 93 | |||
| 94 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1"); | ||
| 95 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrSWRunIndex.1" ); | ||
| 96 | like($res->output, '/^SNMP OK - 1\s.*$/', "String fits SNMP OK and output format"); | ||
| 97 | |||
| 98 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0 -c 1:"); | ||
| 99 | cmp_ok( $res->return_code, '==', 1, "Exit WARNING when querying hrSWRunIndex.1 and warn-th doesn't apply " ); | ||
| 100 | like($res->output, '/^SNMP WARNING - \*1\*\s.*$/', "String matches SNMP WARNING and output format"); | ||
| 101 | |||
| 102 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0"); | ||
| 103 | cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" ); | ||
| 104 | like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format"); | ||
| 105 | |||
| 106 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2"); | ||
| 107 | cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" ); | ||
| 108 | like($res->output, "/^SNMP OK - 2 1/", "Got two values back" ); | ||
| 109 | like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" ); | ||
| 110 | like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" ); | ||
| 111 | |||
| 112 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2"); | ||
| 113 | cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" ); | ||
| 114 | like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" ); | ||
| 115 | like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" ); | ||
| 116 | like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" ); | ||
| 117 | |||
| 118 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:"); | ||
| 119 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrMemorySize and hrSystemProcesses"); | ||
| 120 | like($res->output, '/^SNMP OK - \d+ \d+/', "String contains hrMemorySize and hrSystemProcesses"); | ||
| 121 | |||
| 122 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0"); | ||
| 123 | cmp_ok( $res->return_code, '==', 0, "Exit OK with inside-range thresholds"); | ||
| 124 | like($res->output, '/^SNMP OK - 1\s.*$/', "String matches SNMP OK and output format"); | ||
| 125 | |||
| 126 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3"); | ||
| 127 | $res->output =~ m/^SNMP OK - (\d+\.\d{2})\s.*$/; | ||
| 128 | my $lower = $1 - 0.05; | ||
| 129 | my $higher = $1 + 0.05; | ||
| 130 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher"); | ||
| 131 | cmp_ok( $res->return_code, '==', 1, "Exit WARNING with fractionnal arguments"); | ||
| 132 | |||
| 133 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2"); | ||
| 134 | cmp_ok( $res->return_code, '==', 1, "Exit WARNING on 2nd threshold"); | ||
| 135 | like($res->output, '/^SNMP WARNING - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s+\*1\*\s.*$/', "First OID returned as string, 2nd checked for thresholds"); | ||
| 136 | |||
| 137 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''"); | ||
| 138 | cmp_ok( $res->return_code, '==', 0, "Empty thresholds doesn't crash"); | ||
| 139 | |||
| 140 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2"); | ||
| 141 | cmp_ok( $res->return_code, '==', 0, "Skipping first two thresholds on 2 OID check"); | ||
| 142 | like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping first two thresholds, result printed rather than parsed"); | ||
| 143 | |||
| 144 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,"); | ||
| 145 | cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds"); | ||
| 146 | like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed"); | ||
| 147 | |||
| 148 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1000000000000: -u '1/100 sec'"); | ||
| 149 | cmp_ok( $res->return_code, '==', 2, "Timetick used as a threshold"); | ||
| 150 | like($res->output, '/^SNMP CRITICAL - \*\d+\* 1\/100 sec.*$/', "Timetick used as a threshold, parsed as numeric"); | ||
| 151 | |||
| 152 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0"); | ||
| 153 | cmp_ok( $res->return_code, '==', 0, "Timetick used as a string"); | ||
| 154 | like($res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "Timetick used as a string, result printed rather than parsed"); | ||
| 155 | } | ||
| 156 | |||
| 157 | # These checks need a complete command line. An invalid community is used so | ||
| 158 | # the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway | ||
| 15 | SKIP: { | 159 | SKIP: { |
| 16 | skip "check_snmp is not compiled", $tests if ( ! -x "./check_snmp" ); | 160 | skip "no non responsive host defined", 2 if ( ! $host_nonresponsive ); |
| 17 | 161 | $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:"); | |
| 18 | my $host_snmp = getTestParameter( "host_snmp", "NP_HOST_SNMP", "localhost", | 162 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); |
| 19 | "A host providing an SNMP Service"); | 163 | like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem"); |
| 20 | 164 | } | |
| 21 | my $snmp_community = getTestParameter( "snmp_community", "NP_SNMP_COMMUNITY", "public", | ||
| 22 | "The SNMP Community string for SNMP Testing (assumes snmp v1)" ); | ||
| 23 | |||
| 24 | my $host_nonresponsive = getTestParameter( "host_nonresponsive", "NP_HOST_NONRESPONSIVE", "10.0.0.1", | ||
| 25 | "The hostname of system not responsive to network requests" ); | ||
| 26 | |||
| 27 | my $hostname_invalid = getTestParameter( "hostname_invalid", "NP_HOSTNAME_INVALID", "nosuchhost", | ||
| 28 | "An invalid (not known to DNS) hostname" ); | ||
| 29 | |||
| 30 | $res = NPTest->testCmd( "./check_snmp -t 1" ); | ||
| 31 | is( $res->return_code, 3, "No host name" ); | ||
| 32 | is( $res->output, "No host specified" ); | ||
| 33 | |||
| 34 | $res = NPTest->testCmd( "./check_snmp -H fakehostname" ); | ||
| 35 | is( $res->return_code, 3, "No OIDs specified" ); | ||
| 36 | is( $res->output, "No OIDs specified" ); | ||
| 37 | |||
| 38 | $res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3 --seclevel=rubbish" ); | ||
| 39 | is( $res->return_code, 3, "Invalid seclevel" ); | ||
| 40 | like( $res->output, "/check_snmp: Invalid seclevel - rubbish/" ); | ||
| 41 | |||
| 42 | $res = NPTest->testCmd( "./check_snmp -H fakehost -o oids -P 3c" ); | ||
| 43 | is( $res->return_code, 3, "Invalid protocol" ); | ||
| 44 | like( $res->output, "/check_snmp: Invalid SNMP version - 3c/" ); | ||
| 45 | |||
| 46 | SKIP: { | ||
| 47 | skip "no snmp host defined", 38 if ( ! $host_snmp ); | ||
| 48 | |||
| 49 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -w 1: -c 1:"); | ||
| 50 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying uptime" ); | ||
| 51 | like($res->output, '/^SNMP OK - (\d+)/', "String contains SNMP OK"); | ||
| 52 | $res->output =~ /^SNMP OK - (\d+)/; | ||
| 53 | my $value = $1; | ||
| 54 | cmp_ok( $value, ">", 0, "Got a time value" ); | ||
| 55 | like($res->perf_output, "/sysUpTime.*$1/", "Got perfdata with value '$1' in it"); | ||
| 56 | |||
| 57 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o .1.3.6.1.2.1.1.3.0 -w 1: -c 1:"); | ||
| 58 | cmp_ok( $res->return_code, '==', 0, "Test with numeric OID (no mibs loaded)" ); | ||
| 59 | like($res->output, '/^SNMP OK - \d+/', "String contains SNMP OK"); | ||
| 60 | |||
| 61 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0"); | ||
| 62 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying sysDescr" ); | ||
| 63 | unlike($res->perf_output, '/sysDescr/', "Perfdata doesn't contain string values"); | ||
| 64 | |||
| 65 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0,system.sysDescr.0"); | ||
| 66 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, comma-separated" ); | ||
| 67 | like($res->output, '/^SNMP OK - /', "String contains SNMP OK"); | ||
| 68 | |||
| 69 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysDescr.0 -o system.sysDescr.0"); | ||
| 70 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying two string OIDs, repeated option" ); | ||
| 71 | like($res->output, '/^SNMP OK - /', "String contains SNMP OK"); | ||
| 72 | |||
| 73 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 1:1 -c 1:1"); | ||
| 74 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrSWRunIndex.1" ); | ||
| 75 | like($res->output, '/^SNMP OK - 1\s.*$/', "String fits SNMP OK and output format"); | ||
| 76 | |||
| 77 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w 0 -c 1:"); | ||
| 78 | cmp_ok( $res->return_code, '==', 1, "Exit WARNING when querying hrSWRunIndex.1 and warn-th doesn't apply " ); | ||
| 79 | like($res->output, '/^SNMP WARNING - \*1\*\s.*$/', "String matches SNMP WARNING and output format"); | ||
| 80 | |||
| 81 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w :0 -c 0"); | ||
| 82 | cmp_ok( $res->return_code, '==', 2, "Exit CRITICAL when querying hrSWRunIndex.1 and crit-th doesn't apply" ); | ||
| 83 | like($res->output, '/^SNMP CRITICAL - \*1\*\s.*$/', "String matches SNMP CRITICAL and output format"); | ||
| 84 | |||
| 85 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2 -c 1:2"); | ||
| 86 | cmp_ok( $res->return_code, '==', 0, "Checking two OIDs at once" ); | ||
| 87 | like($res->output, "/^SNMP OK - 2 1/", "Got two values back" ); | ||
| 88 | like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" ); | ||
| 89 | like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" ); | ||
| 90 | |||
| 91 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o ifIndex.2,ifIndex.1 -w 1:2,1:2 -c 2:2,2:2"); | ||
| 92 | cmp_ok( $res->return_code, '==', 2, "Checking critical threshold is passed if any one value crosses" ); | ||
| 93 | like($res->output, "/^SNMP CRITICAL - 2 *1*/", "Got two values back" ); | ||
| 94 | like( $res->perf_output, "/ifIndex.2=2/", "Got 1st perf data" ); | ||
| 95 | like( $res->perf_output, "/ifIndex.1=1/", "Got 2nd perf data" ); | ||
| 96 | |||
| 97 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w 1:,1: -c 1:,1:"); | ||
| 98 | cmp_ok( $res->return_code, '==', 0, "Exit OK when querying hrMemorySize and hrSystemProcesses"); | ||
| 99 | like($res->output, '/^SNMP OK - \d+ \d+/', "String contains hrMemorySize and hrSystemProcesses"); | ||
| 100 | |||
| 101 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w \@:0 -c \@0"); | ||
| 102 | cmp_ok( $res->return_code, '==', 0, "Exit OK with inside-range thresholds"); | ||
| 103 | like($res->output, '/^SNMP OK - 1\s.*$/', "String matches SNMP OK and output format"); | ||
| 104 | |||
| 105 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3"); | ||
| 106 | $res->output =~ m/^SNMP OK - (\d+\.\d{2})\s.*$/; | ||
| 107 | my $lower = $1 - 0.05; | ||
| 108 | my $higher = $1 + 0.05; | ||
| 109 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o enterprises.ucdavis.laTable.laEntry.laLoad.3 -w $lower -c $higher"); | ||
| 110 | cmp_ok( $res->return_code, '==', 1, "Exit WARNING with fractionnal arguments"); | ||
| 111 | |||
| 112 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0,host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w ,:0 -c ,:2"); | ||
| 113 | cmp_ok( $res->return_code, '==', 1, "Exit WARNING on 2nd threshold"); | ||
| 114 | like($res->output, '/^SNMP WARNING - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s+\*1\*\s.*$/', "First OID returned as string, 2nd checked for thresholds"); | ||
| 115 | |||
| 116 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrSWRun.hrSWRunTable.hrSWRunEntry.hrSWRunIndex.1 -w '' -c ''"); | ||
| 117 | cmp_ok( $res->return_code, '==', 0, "Empty thresholds doesn't crash"); | ||
| 118 | |||
| 119 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,,1 -c ,,2"); | ||
| 120 | cmp_ok( $res->return_code, '==', 0, "Skipping first two thresholds on 2 OID check"); | ||
| 121 | like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping first two thresholds, result printed rather than parsed"); | ||
| 122 | |||
| 123 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o host.hrStorage.hrMemorySize.0,host.hrSystem.hrSystemProcesses.0 -w ,, -c ,,"); | ||
| 124 | cmp_ok( $res->return_code, '==', 0, "Skipping all thresholds"); | ||
| 125 | like($res->output, '/^SNMP OK - \d+ \w+ \d+\s.*$/', "Skipping all thresholds, result printed rather than parsed"); | ||
| 126 | |||
| 127 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0 -c 1000000000000: -u '1/100 sec'"); | ||
| 128 | cmp_ok( $res->return_code, '==', 2, "Timetick used as a threshold"); | ||
| 129 | like($res->output, '/^SNMP CRITICAL - \*\d+\* 1\/100 sec.*$/', "Timetick used as a threshold, parsed as numeric"); | ||
| 130 | |||
| 131 | $res = NPTest->testCmd( "./check_snmp -H $host_snmp -C $snmp_community -o system.sysUpTime.0"); | ||
| 132 | cmp_ok( $res->return_code, '==', 0, "Timetick used as a string"); | ||
| 133 | like($res->output, '/^SNMP OK - Timeticks:\s\(\d+\)\s+(?:\d+ days?,\s+)?\d+:\d+:\d+\.\d+\s.*$/', "Timetick used as a string, result printed rather than parsed"); | ||
| 134 | } | ||
| 135 | |||
| 136 | # These checks need a complete command line. An invalid community is used so | ||
| 137 | # the tests can run on hosts w/o snmp host/community in NPTest.cache. Execution will fail anyway | ||
| 138 | SKIP: { | ||
| 139 | skip "no non responsive host defined", 2 if ( ! $host_nonresponsive ); | ||
| 140 | $res = NPTest->testCmd( "./check_snmp -H $host_nonresponsive -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:"); | ||
| 141 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); | ||
| 142 | like($res->output, '/External command error: Timeout: No Response from /', "String matches timeout problem"); | ||
| 143 | } | ||
| 144 | |||
| 145 | SKIP: { | ||
| 146 | skip "no non invalid host defined", 2 if ( ! $hostname_invalid ); | ||
| 147 | $res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:"); | ||
| 148 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); | ||
| 149 | like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host)/', "String matches invalid host"); | ||
| 150 | } | ||
| 151 | 165 | ||
| 166 | SKIP: { | ||
| 167 | skip "no non invalid host defined", 2 if ( ! $hostname_invalid ); | ||
| 168 | $res = NPTest->testCmd( "./check_snmp -H $hostname_invalid -C np_foobar -o system.sysUpTime.0 -w 1: -c 1:"); | ||
| 169 | cmp_ok( $res->return_code, '==', 3, "Exit UNKNOWN with non responsive host" ); | ||
| 170 | like($res->output, '/External command error: .*(nosuchhost|Name or service not known|Unknown host)/', "String matches invalid host"); | ||
| 152 | } | 171 | } |
diff --git a/plugins/t/check_tcp.t b/plugins/t/check_tcp.t index d6808bf2..c100cadd 100644 --- a/plugins/t/check_tcp.t +++ b/plugins/t/check_tcp.t | |||
| @@ -32,7 +32,7 @@ $t += checkCmd( "./check_tcp $host_tcp_http -p 81 -wt 0 -ct 0 -to 1", 2 | |||
| 32 | $t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt 0 -ct 0 -to 1", 2 ); | 32 | $t += checkCmd( "./check_tcp $host_nonresponsive -p 80 -wt 0 -ct 0 -to 1", 2 ); |
| 33 | $t += checkCmd( "./check_tcp $hostname_invalid -p 80 -wt 0 -ct 0 -to 1", 2 ); | 33 | $t += checkCmd( "./check_tcp $hostname_invalid -p 80 -wt 0 -ct 0 -to 1", 2 ); |
| 34 | $t += checkCmd( "./check_tcp -S -D 1 -H www.verisign.com -p 443", 0 ); | 34 | $t += checkCmd( "./check_tcp -S -D 1 -H www.verisign.com -p 443", 0 ); |
| 35 | $t += checkCmd( "./check_tcp -S -D 9000,1 -H www.verisign.com -p 443", 0 ); | 35 | $t += checkCmd( "./check_tcp -S -D 9000,1 -H www.verisign.com -p 443", 1 ); |
| 36 | $t += checkCmd( "./check_tcp -S -D 9000 -H www.verisign.com -p 443", 1 ); | 36 | $t += checkCmd( "./check_tcp -S -D 9000 -H www.verisign.com -p 443", 1 ); |
| 37 | $t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443", 2 ); | 37 | $t += checkCmd( "./check_tcp -S -D 9000,8999 -H www.verisign.com -p 443", 2 ); |
| 38 | $t += checkCmd( "./check_tcp -6 -p 80 www.heise.de", 0 ); | 38 | $t += checkCmd( "./check_tcp -6 -p 80 www.heise.de", 0 ); |
