diff options
-rw-r--r-- | plugins/check_snmp.c | 185 |
1 files changed, 85 insertions, 100 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c index fc19120..cb13bc9 100644 --- a/plugins/check_snmp.c +++ b/plugins/check_snmp.c | |||
@@ -175,7 +175,7 @@ int errcode, excode; | |||
175 | #endif | 175 | #endif |
176 | 176 | ||
177 | char *server_address = NULL; | 177 | char *server_address = NULL; |
178 | char *community = NULL; | 178 | char *community = DEFAULT_COMMUNITY; |
179 | char *authpriv = NULL; | 179 | char *authpriv = NULL; |
180 | char *proto = NULL; | 180 | char *proto = NULL; |
181 | char *seclevel = NULL; | 181 | char *seclevel = NULL; |
@@ -184,8 +184,8 @@ char *authproto = NULL; | |||
184 | char *authpasswd = NULL; | 184 | char *authpasswd = NULL; |
185 | char *privpasswd = NULL; | 185 | char *privpasswd = NULL; |
186 | char *oid = ""; | 186 | char *oid = ""; |
187 | char *label = NULL; | 187 | char *label = "SNMP"; |
188 | char *units = NULL; | 188 | char *units = ""; |
189 | char *port = DEFAULT_PORT; | 189 | char *port = DEFAULT_PORT; |
190 | char string_value[MAX_INPUT_BUFFER] = ""; | 190 | char string_value[MAX_INPUT_BUFFER] = ""; |
191 | char **labels = NULL; | 191 | char **labels = NULL; |
@@ -203,9 +203,9 @@ unsigned long response_value[MAX_OIDS]; | |||
203 | int check_warning_value = FALSE; | 203 | int check_warning_value = FALSE; |
204 | int check_critical_value = FALSE; | 204 | int check_critical_value = FALSE; |
205 | int eval_method[MAX_OIDS]; | 205 | int eval_method[MAX_OIDS]; |
206 | char *delimiter = NULL; | 206 | char *delimiter = DEFAULT_DELIMITER; |
207 | char *output_delim = NULL; | 207 | char *output_delim = DEFAULT_OUTPUT_DELIMITER; |
208 | char *miblist = NULL; | 208 | char *miblist = DEFAULT_MIBLIST; |
209 | 209 | ||
210 | 210 | ||
211 | int | 211 | int |
@@ -219,7 +219,7 @@ main (int argc, char **argv) | |||
219 | char *command_line = NULL; | 219 | char *command_line = NULL; |
220 | char *response = NULL; | 220 | char *response = NULL; |
221 | char *outbuff = ""; | 221 | char *outbuff = ""; |
222 | char *output = NULL; | 222 | char *output = ""; |
223 | char *ptr = NULL; | 223 | char *ptr = NULL; |
224 | char *p2 = NULL; | 224 | char *p2 = NULL; |
225 | char *show = NULL; | 225 | char *show = NULL; |
@@ -251,7 +251,6 @@ main (int argc, char **argv) | |||
251 | printf ("Could not open stderr for %s\n", command_line); | 251 | printf ("Could not open stderr for %s\n", command_line); |
252 | } | 252 | } |
253 | 253 | ||
254 | asprintf (&output, ""); | ||
255 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) | 254 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) |
256 | asprintf (&output, "%s%s", output, input_buffer); | 255 | asprintf (&output, "%s%s", output, input_buffer); |
257 | 256 | ||
@@ -293,6 +292,7 @@ main (int argc, char **argv) | |||
293 | } | 292 | } |
294 | } | 293 | } |
295 | 294 | ||
295 | /* We strip out the datatype indicator for PHBs */ | ||
296 | if (strstr (response, "Gauge: ")) | 296 | if (strstr (response, "Gauge: ")) |
297 | show = strstr (response, "Gauge: ") + 7; | 297 | show = strstr (response, "Gauge: ") + 7; |
298 | else if (strstr (response, "Gauge32: ")) | 298 | else if (strstr (response, "Gauge32: ")) |
@@ -305,12 +305,7 @@ main (int argc, char **argv) | |||
305 | 305 | ||
306 | iresult = STATE_DEPENDENT; | 306 | iresult = STATE_DEPENDENT; |
307 | 307 | ||
308 | if (eval_method[i] & CRIT_PRESENT) { | 308 | /* Process this block for integer comparisons */ |
309 | iresult = STATE_CRITICAL; | ||
310 | } else if (eval_method[i] & WARN_PRESENT) { | ||
311 | iresult = STATE_WARNING; | ||
312 | } | ||
313 | |||
314 | if (eval_method[i] & CRIT_GT || | 309 | if (eval_method[i] & CRIT_GT || |
315 | eval_method[i] & CRIT_LT || | 310 | eval_method[i] & CRIT_LT || |
316 | eval_method[i] & CRIT_GE || | 311 | eval_method[i] & CRIT_GE || |
@@ -327,9 +322,9 @@ main (int argc, char **argv) | |||
327 | response_value[i] = strtoul (p2, NULL, 10); | 322 | response_value[i] = strtoul (p2, NULL, 10); |
328 | iresult = check_num (i); | 323 | iresult = check_num (i); |
329 | asprintf (&show, "%lu", response_value[i]); | 324 | asprintf (&show, "%lu", response_value[i]); |
330 | /*asprintf (&show, "%s", response); */ | ||
331 | } | 325 | } |
332 | 326 | ||
327 | /* Process this block for string matching */ | ||
333 | else if (eval_method[i] & CRIT_STRING) { | 328 | else if (eval_method[i] & CRIT_STRING) { |
334 | if (strcmp (response, string_value)) | 329 | if (strcmp (response, string_value)) |
335 | iresult = STATE_CRITICAL; | 330 | iresult = STATE_CRITICAL; |
@@ -337,6 +332,7 @@ main (int argc, char **argv) | |||
337 | iresult = STATE_OK; | 332 | iresult = STATE_OK; |
338 | } | 333 | } |
339 | 334 | ||
335 | /* Process this block for regex matching */ | ||
340 | else if (eval_method[i] & CRIT_REGEX) { | 336 | else if (eval_method[i] & CRIT_REGEX) { |
341 | #ifdef HAVE_REGEX_H | 337 | #ifdef HAVE_REGEX_H |
342 | excode = regexec (&preg, response, 10, pmatch, eflags); | 338 | excode = regexec (&preg, response, 10, pmatch, eflags); |
@@ -352,21 +348,25 @@ main (int argc, char **argv) | |||
352 | iresult = STATE_CRITICAL; | 348 | iresult = STATE_CRITICAL; |
353 | } | 349 | } |
354 | #else | 350 | #else |
355 | printf ("SNMP UNKNOWN: call for regex which was not a compiled option"); | 351 | printf ("%s UNKNOWN: call for regex which was not a compiled option", label); |
356 | exit (STATE_UNKNOWN); | 352 | exit (STATE_UNKNOWN); |
357 | #endif | 353 | #endif |
358 | } | 354 | } |
355 | |||
356 | /* Process this block for existence-nonexistence checks */ | ||
359 | else { | 357 | else { |
360 | if (response && iresult == STATE_DEPENDENT) | 358 | if (eval_method[i] & CRIT_PRESENT) |
361 | iresult = STATE_OK; | ||
362 | else if (eval_method[i] & CRIT_PRESENT) | ||
363 | iresult = STATE_CRITICAL; | 359 | iresult = STATE_CRITICAL; |
364 | else if (eval_method[i] & WARN_PRESENT) | 360 | else if (eval_method[i] & WARN_PRESENT) |
365 | iresult = STATE_WARNING; | 361 | iresult = STATE_WARNING; |
362 | else if (response && iresult == STATE_DEPENDENT) | ||
363 | iresult = STATE_OK; | ||
366 | } | 364 | } |
367 | 365 | ||
366 | /* Result is the worst outcome of all the OIDs tested */ | ||
368 | result = max_state (result, iresult); | 367 | result = max_state (result, iresult); |
369 | 368 | ||
369 | /* Prepend a label for this OID if there is one */ | ||
370 | if (nlabels > 1 && i < nlabels && labels[i] != NULL) | 370 | if (nlabels > 1 && i < nlabels && labels[i] != NULL) |
371 | asprintf (&outbuff, "%s%s%s %s%s%s", outbuff, | 371 | asprintf (&outbuff, "%s%s%s %s%s%s", outbuff, |
372 | (i == 0) ? " " : output_delim, | 372 | (i == 0) ? " " : output_delim, |
@@ -375,7 +375,8 @@ main (int argc, char **argv) | |||
375 | asprintf (&outbuff, "%s%s%s%s%s", outbuff, (i == 0) ? " " : output_delim, | 375 | asprintf (&outbuff, "%s%s%s%s%s", outbuff, (i == 0) ? " " : output_delim, |
376 | mark (iresult), show, mark (iresult)); | 376 | mark (iresult), show, mark (iresult)); |
377 | 377 | ||
378 | if (nunits > 0 && i < nunits) | 378 | /* Append a unit string for this OID if there is one */ |
379 | if (nunits > 0 && i < nunits && unitv[i] != NULL) | ||
379 | asprintf (&outbuff, "%s %s", outbuff, unitv[i]); | 380 | asprintf (&outbuff, "%s %s", outbuff, unitv[i]); |
380 | 381 | ||
381 | i++; | 382 | i++; |
@@ -413,7 +414,7 @@ process_arguments (int argc, char **argv) | |||
413 | { | 414 | { |
414 | char *ptr; | 415 | char *ptr; |
415 | int c = 1; | 416 | int c = 1; |
416 | int j = 0, jj = 0; | 417 | int j = 0, jj = 0, ii = 0; |
417 | 418 | ||
418 | #ifdef HAVE_GETOPT_H | 419 | #ifdef HAVE_GETOPT_H |
419 | int option_index = 0; | 420 | int option_index = 0; |
@@ -479,34 +480,52 @@ process_arguments (int argc, char **argv) | |||
479 | case 'v': /* verbose */ | 480 | case 'v': /* verbose */ |
480 | verbose = TRUE; | 481 | verbose = TRUE; |
481 | break; | 482 | break; |
483 | |||
484 | /* Connection info */ | ||
485 | case 'C': /* group or community */ | ||
486 | community = strscpy (community, optarg); | ||
487 | break; | ||
488 | case 'H': /* Host or server */ | ||
489 | server_address = strscpy (server_address, optarg); | ||
490 | break; | ||
491 | case 'p': /* TCP port number */ | ||
492 | port = strscpy(port, optarg); | ||
493 | break; | ||
494 | case 'm': /* List of MIBS */ | ||
495 | miblist = strscpy(miblist, optarg); | ||
496 | break; | ||
497 | case 'P': /* SNMP protocol version */ | ||
498 | proto = strscpy(proto, optarg); | ||
499 | break; | ||
500 | case 'L': /* security level */ | ||
501 | seclevel = strscpy(seclevel,optarg); | ||
502 | break; | ||
503 | case 'U': /* security username */ | ||
504 | secname = strscpy(secname, optarg); | ||
505 | break; | ||
506 | case 'a': /* auth protocol */ | ||
507 | asprintf (&authproto, optarg); | ||
508 | break; | ||
509 | case 'A': /* auth passwd */ | ||
510 | authpasswd = strscpy(authpasswd, optarg); | ||
511 | break; | ||
512 | case 'X': /* priv passwd */ | ||
513 | privpasswd = strscpy(privpasswd, optarg); | ||
514 | break; | ||
482 | case 't': /* timeout period */ | 515 | case 't': /* timeout period */ |
483 | if (!is_integer (optarg)) | 516 | if (!is_integer (optarg)) |
484 | usage2 ("Timeout Interval must be an integer", optarg); | 517 | usage2 ("Timeout Interval must be an integer", optarg); |
485 | timeout_interval = atoi (optarg); | 518 | timeout_interval = atoi (optarg); |
486 | break; | 519 | break; |
487 | case 'e': /* PRELIMINARY - may change */ | 520 | |
488 | eval_method[j] |= WARN_PRESENT; | 521 | /* Test parameters */ |
489 | for (ptr = optarg; (ptr = index (ptr, ',')); ptr++) | ||
490 | ptr[0] = ' '; /* relpace comma with space */ | ||
491 | for (ptr = optarg; (ptr = index (ptr, ' ')); ptr++) | ||
492 | eval_method[++j] |= WARN_PRESENT; | ||
493 | asprintf (&oid, "%s %s", (oid?oid:""), optarg); | ||
494 | break; | ||
495 | case 'E': /* PRELIMINARY - may change */ | ||
496 | eval_method[j] |= WARN_PRESENT; | ||
497 | for (ptr = optarg; (ptr = index (ptr, ',')); ptr++) | ||
498 | ptr[0] = ' '; /* relpace comma with space */ | ||
499 | for (ptr = optarg; (ptr = index (ptr, ' ')); ptr++) | ||
500 | eval_method[++j] |= CRIT_PRESENT; | ||
501 | asprintf (&oid, "%s %s", (oid?oid:""), optarg); | ||
502 | break; | ||
503 | case 'c': /* critical time threshold */ | 522 | case 'c': /* critical time threshold */ |
504 | if (strspn (optarg, "0123456789:,") < strlen (optarg)) { | 523 | if (strspn (optarg, "0123456789:,") < strlen (optarg)) { |
505 | printf ("Invalid critical threshold: %s\n", optarg); | 524 | printf ("Invalid critical threshold: %s\n", optarg); |
506 | print_usage (); | 525 | print_usage (); |
507 | exit (STATE_UNKNOWN); | 526 | exit (STATE_UNKNOWN); |
508 | } | 527 | } |
509 | for (ptr = optarg, jj = 0; ptr && jj < MAX_OIDS; jj++) { | 528 | for (ptr = optarg; ptr && jj < MAX_OIDS; jj++) { |
510 | if (lu_getll (&lower_crit_lim[jj], ptr) == 1) | 529 | if (lu_getll (&lower_crit_lim[jj], ptr) == 1) |
511 | eval_method[jj] |= CRIT_LT; | 530 | eval_method[jj] |= CRIT_LT; |
512 | if (lu_getul (&upper_crit_lim[jj], ptr) == 1) | 531 | if (lu_getul (&upper_crit_lim[jj], ptr) == 1) |
@@ -520,37 +539,36 @@ process_arguments (int argc, char **argv) | |||
520 | print_usage (); | 539 | print_usage (); |
521 | exit (STATE_UNKNOWN); | 540 | exit (STATE_UNKNOWN); |
522 | } | 541 | } |
523 | for (ptr = optarg, jj = 0; ptr && jj < MAX_OIDS; jj++) { | 542 | for (ptr = optarg; ptr && ii < MAX_OIDS; ii++) { |
524 | if (lu_getll (&lower_warn_lim[jj], ptr) == 1) | 543 | if (lu_getll (&lower_warn_lim[ii], ptr) == 1) |
525 | eval_method[jj] |= WARN_LT; | 544 | eval_method[ii] |= WARN_LT; |
526 | if (lu_getul (&upper_warn_lim[jj], ptr) == 1) | 545 | if (lu_getul (&upper_warn_lim[ii], ptr) == 1) |
527 | eval_method[jj] |= WARN_GT; | 546 | eval_method[ii] |= WARN_GT; |
528 | (ptr = index (ptr, ',')) ? ptr++ : ptr; | 547 | (ptr = index (ptr, ',')) ? ptr++ : ptr; |
529 | } | 548 | } |
530 | break; | 549 | break; |
531 | case 'H': /* Host or server */ | ||
532 | server_address = strscpy (server_address, optarg); | ||
533 | break; | ||
534 | case 'C': /* group or community */ | ||
535 | community = strscpy (community, optarg); | ||
536 | break; | ||
537 | case 'o': /* object identifier */ | 550 | case 'o': /* object identifier */ |
551 | case 'e': /* PRELIMINARY - may change */ | ||
552 | case 'E': /* PRELIMINARY - may change */ | ||
538 | for (ptr = optarg; (ptr = index (ptr, ',')); ptr++) | 553 | for (ptr = optarg; (ptr = index (ptr, ',')); ptr++) |
539 | ptr[0] = ' '; /* relpace comma with space */ | 554 | ptr[0] = ' '; /* relpace comma with space */ |
540 | for (ptr = optarg; (ptr = index (ptr, ' ')); ptr++) | 555 | for (ptr = optarg; (ptr = index (ptr, ' ')); ptr++) |
541 | j++; /* count OIDs */ | 556 | j++; /* count OIDs */ |
542 | asprintf (&oid, "%s %s", (oid?oid:""), optarg); | 557 | asprintf (&oid, "%s %s", (oid?oid:""), optarg); |
543 | break; | 558 | if (c == 'E' || c == 'e') { |
544 | case 'd': /* delimiter */ | 559 | jj++; |
545 | delimiter = strscpy (delimiter, optarg); | 560 | ii++; |
546 | break; | 561 | } |
547 | case 'D': /* output-delimiter */ | 562 | if (c == 'E') |
548 | output_delim = strscpy (output_delim, optarg); | 563 | eval_method[j+1] |= WARN_PRESENT; |
564 | else if (c == 'e') | ||
565 | eval_method[j+1] |= CRIT_PRESENT; | ||
549 | break; | 566 | break; |
550 | case 's': /* string or substring */ | 567 | case 's': /* string or substring */ |
551 | strncpy (string_value, optarg, sizeof (string_value) - 1); | 568 | strncpy (string_value, optarg, sizeof (string_value) - 1); |
552 | string_value[sizeof (string_value) - 1] = 0; | 569 | string_value[sizeof (string_value) - 1] = 0; |
553 | eval_method[jj] = CRIT_STRING; | 570 | eval_method[jj++] = CRIT_STRING; |
571 | ii++; | ||
554 | break; | 572 | break; |
555 | case 'R': /* regex */ | 573 | case 'R': /* regex */ |
556 | #ifdef HAVE_REGEX_H | 574 | #ifdef HAVE_REGEX_H |
@@ -567,12 +585,21 @@ process_arguments (int argc, char **argv) | |||
567 | printf ("Could Not Compile Regular Expression"); | 585 | printf ("Could Not Compile Regular Expression"); |
568 | return ERROR; | 586 | return ERROR; |
569 | } | 587 | } |
570 | eval_method[jj] = CRIT_REGEX; | 588 | eval_method[jj++] = CRIT_REGEX; |
589 | ii++; | ||
571 | #else | 590 | #else |
572 | printf ("SNMP UNKNOWN: call for regex which was not a compiled option"); | 591 | printf ("%s UNKNOWN: call for regex which was not a compiled option", label); |
573 | exit (STATE_UNKNOWN); | 592 | exit (STATE_UNKNOWN); |
574 | #endif | 593 | #endif |
575 | break; | 594 | break; |
595 | |||
596 | /* Format */ | ||
597 | case 'd': /* delimiter */ | ||
598 | delimiter = strscpy (delimiter, optarg); | ||
599 | break; | ||
600 | case 'D': /* output-delimiter */ | ||
601 | output_delim = strscpy (output_delim, optarg); | ||
602 | break; | ||
576 | case 'l': /* label */ | 603 | case 'l': /* label */ |
577 | label = optarg; | 604 | label = optarg; |
578 | nlabels++; | 605 | nlabels++; |
@@ -635,30 +662,6 @@ process_arguments (int argc, char **argv) | |||
635 | unitv[nunits - 1] = ptr; | 662 | unitv[nunits - 1] = ptr; |
636 | } | 663 | } |
637 | break; | 664 | break; |
638 | case 'p': /* TCP port number */ | ||
639 | port = strscpy(port, optarg); | ||
640 | break; | ||
641 | case 'm': /* List of MIBS */ | ||
642 | miblist = strscpy(miblist, optarg); | ||
643 | break; | ||
644 | case 'P': /* SNMP protocol version */ | ||
645 | proto = strscpy(proto, optarg); | ||
646 | break; | ||
647 | case 'L': /* security level */ | ||
648 | seclevel = strscpy(seclevel,optarg); | ||
649 | break; | ||
650 | case 'U': /* security username */ | ||
651 | secname = strscpy(secname, optarg); | ||
652 | break; | ||
653 | case 'a': /* auth protocol */ | ||
654 | asprintf (&authproto, optarg); | ||
655 | break; | ||
656 | case 'A': /* auth passwd */ | ||
657 | authpasswd = strscpy(authpasswd, optarg); | ||
658 | break; | ||
659 | case 'X': /* priv passwd */ | ||
660 | privpasswd = strscpy(privpasswd, optarg); | ||
661 | break; | ||
662 | 665 | ||
663 | } | 666 | } |
664 | } | 667 | } |
@@ -693,24 +696,6 @@ int | |||
693 | validate_arguments () | 696 | validate_arguments () |
694 | { | 697 | { |
695 | 698 | ||
696 | if (community == NULL) | ||
697 | asprintf (&community, DEFAULT_COMMUNITY); | ||
698 | |||
699 | if (delimiter == NULL) | ||
700 | asprintf (&delimiter, DEFAULT_DELIMITER); | ||
701 | |||
702 | if (output_delim == NULL) | ||
703 | asprintf (&output_delim, DEFAULT_OUTPUT_DELIMITER); | ||
704 | |||
705 | if (miblist == NULL) | ||
706 | asprintf (&miblist, DEFAULT_MIBLIST); | ||
707 | |||
708 | if (label == NULL) | ||
709 | asprintf (&label, "SNMP"); | ||
710 | |||
711 | if (units == NULL) | ||
712 | asprintf (&units, ""); | ||
713 | |||
714 | /* Need better checks to verify seclevel and authproto choices */ | 699 | /* Need better checks to verify seclevel and authproto choices */ |
715 | 700 | ||
716 | if (seclevel == NULL) | 701 | if (seclevel == NULL) |