diff options
| -rw-r--r-- | plugins/check_ping.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/plugins/check_ping.c b/plugins/check_ping.c index 87f9db01..7d9dd3bf 100644 --- a/plugins/check_ping.c +++ b/plugins/check_ping.c | |||
| @@ -37,7 +37,8 @@ enum { | |||
| 37 | int process_arguments (int, char **); | 37 | int process_arguments (int, char **); |
| 38 | int get_threshold (char *, float *, int *); | 38 | int get_threshold (char *, float *, int *); |
| 39 | int validate_arguments (void); | 39 | int validate_arguments (void); |
| 40 | int run_ping (char *, char *); | 40 | int run_ping (const char *cmd, const char *addr); |
| 41 | int error_scan (char buf[MAX_INPUT_BUFFER], const char *addr); | ||
| 41 | void print_usage (void); | 42 | void print_usage (void); |
| 42 | void print_help (void); | 43 | void print_help (void); |
| 43 | 44 | ||
| @@ -394,7 +395,7 @@ validate_arguments () | |||
| 394 | 395 | ||
| 395 | 396 | ||
| 396 | int | 397 | int |
| 397 | run_ping (char *cmd, char *server_address) | 398 | run_ping (const char *cmd, const char *addr) |
| 398 | { | 399 | { |
| 399 | char buf[MAX_INPUT_BUFFER]; | 400 | char buf[MAX_INPUT_BUFFER]; |
| 400 | int result = STATE_UNKNOWN; | 401 | int result = STATE_UNKNOWN; |
| @@ -408,12 +409,7 @@ run_ping (char *cmd, char *server_address) | |||
| 408 | 409 | ||
| 409 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_process)) { | 410 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_process)) { |
| 410 | 411 | ||
| 411 | if (strstr (buf, _("(DUP!)"))) { | 412 | result = max_state (result, error_scan (buf, addr)); |
| 412 | result = max_state (result, STATE_WARNING); | ||
| 413 | warn_text = strdup (WARN_DUPLICATES); | ||
| 414 | if (!warn_text) | ||
| 415 | die (STATE_UNKNOWN, _("unable to realloc warn_text")); | ||
| 416 | } | ||
| 417 | 413 | ||
| 418 | /* get the percent loss statistics */ | 414 | /* get the percent loss statistics */ |
| 419 | if(sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss",&pl)==1 || | 415 | if(sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss",&pl)==1 || |
| @@ -438,34 +434,11 @@ run_ping (char *cmd, char *server_address) | |||
| 438 | if (pl == 100) | 434 | if (pl == 100) |
| 439 | rta = crta; | 435 | rta = crta; |
| 440 | 436 | ||
| 441 | /* check stderr */ | 437 | /* check stderr, setting at least WARNING if there is output here */ |
| 442 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_stderr)) { | 438 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_stderr)) |
| 443 | if (strstr(buf,"Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP")) | 439 | if (! strstr(buf,"Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP")) |
| 444 | continue; | 440 | result = max_state (STATE_WARNING, error_scan (buf, addr)); |
| 445 | |||
| 446 | if (strstr (buf, "Network is unreachable")) | ||
| 447 | die (STATE_CRITICAL, | ||
| 448 | _("PING CRITICAL - Network unreachable (%s)"), | ||
| 449 | server_address); | ||
| 450 | else if (strstr (buf, "Destination Host Unreachable")) | ||
| 451 | die (STATE_CRITICAL, | ||
| 452 | _("PING CRITICAL - Host Unreachable (%s)"), | ||
| 453 | server_address); | ||
| 454 | else if (strstr (buf, "unknown host" )) | ||
| 455 | die (STATE_CRITICAL, | ||
| 456 | _("PING CRITICAL - Host not found (%s)"), | ||
| 457 | server_address); | ||
| 458 | 441 | ||
| 459 | if (warn_text == NULL) | ||
| 460 | warn_text = strdup (buf); | ||
| 461 | else if (asprintf (&warn_text, "%s %s", warn_text, buf) == -1) | ||
| 462 | die (STATE_UNKNOWN, _("unable to realloc warn_text")); | ||
| 463 | |||
| 464 | if (strstr (buf, "DUPLICATES FOUND")) | ||
| 465 | result = max_state (result, STATE_WARNING); | ||
| 466 | else | ||
| 467 | result = STATE_CRITICAL ; | ||
| 468 | } | ||
| 469 | (void) fclose (child_stderr); | 442 | (void) fclose (child_stderr); |
| 470 | 443 | ||
| 471 | 444 | ||
| @@ -483,6 +456,32 @@ run_ping (char *cmd, char *server_address) | |||
| 483 | 456 | ||
| 484 | 457 | ||
| 485 | 458 | ||
| 459 | int | ||
| 460 | error_scan (char buf[MAX_INPUT_BUFFER], const char *addr) | ||
| 461 | { | ||
| 462 | if (strstr (buf, "Network is unreachable")) | ||
| 463 | die (STATE_CRITICAL, _("PING CRITICAL - Network unreachable (%s)"), addr); | ||
| 464 | else if (strstr (buf, "Destination Host Unreachable")) | ||
| 465 | die (STATE_CRITICAL, _("PING CRITICAL - Host Unreachable (%s)"), addr); | ||
| 466 | else if (strstr (buf, "unknown host" )) | ||
| 467 | die (STATE_CRITICAL, _("PING CRITICAL - Host not found (%s)"), addr); | ||
| 468 | |||
| 469 | if (strstr (buf, "(DUP!)") || strstr (buf, "DUPLICATES FOUND")) { | ||
| 470 | if (warn_text == NULL) | ||
| 471 | warn_text = strdup (_(WARN_DUPLICATES)); | ||
| 472 | else if (! strstr (warn_text, _(WARN_DUPLICATES)) && | ||
| 473 | asprintf (&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1) | ||
| 474 | die (STATE_UNKNOWN, _("unable to realloc warn_text")); | ||
| 475 | return (STATE_WARNING); | ||
| 476 | } | ||
| 477 | |||
| 478 | return (STATE_OK); | ||
| 479 | } | ||
| 480 | |||
| 481 | |||
| 482 | |||
| 483 | |||
| 484 | |||
| 486 | 485 | ||
| 487 | void | 486 | void |
| 488 | print_usage (void) | 487 | print_usage (void) |
