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 fc191201..cb13bc9a 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) |
