diff options
Diffstat (limited to 'plugins/check_ping.c')
| -rw-r--r-- | plugins/check_ping.c | 125 | 
1 files changed, 86 insertions, 39 deletions
| diff --git a/plugins/check_ping.c b/plugins/check_ping.c index 6bcdeaad..61feb958 100644 --- a/plugins/check_ping.c +++ b/plugins/check_ping.c | |||
| @@ -135,7 +135,8 @@ int main(int argc, char **argv) { | |||
| 135 | die(STATE_UNKNOWN, _("CRITICAL - Could not interpret output from ping command\n")); | 135 | die(STATE_UNKNOWN, _("CRITICAL - Could not interpret output from ping command\n")); | 
| 136 | } | 136 | } | 
| 137 | 137 | ||
| 138 | if (pinged.packet_loss >= config.cpl || pinged.round_trip_average >= config.crta || pinged.round_trip_average < 0) { | 138 | if (pinged.packet_loss >= config.cpl || pinged.round_trip_average >= config.crta || | 
| 139 | pinged.round_trip_average < 0) { | ||
| 139 | pinged.state = STATE_CRITICAL; | 140 | pinged.state = STATE_CRITICAL; | 
| 140 | } else if (pinged.packet_loss >= config.wpl || pinged.round_trip_average >= config.wrta) { | 141 | } else if (pinged.packet_loss >= config.wpl || pinged.round_trip_average >= config.wrta) { | 
| 141 | pinged.state = STATE_WARNING; | 142 | pinged.state = STATE_WARNING; | 
| @@ -151,10 +152,11 @@ int main(int argc, char **argv) { | |||
| 151 | printf("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, config.addresses[i]); | 152 | printf("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, config.addresses[i]); | 
| 152 | } | 153 | } | 
| 153 | if (pinged.packet_loss == 100) { | 154 | if (pinged.packet_loss == 100) { | 
| 154 | printf(_("PING %s - %sPacket loss = %d%%"), state_text(pinged.state), warn_text, pinged.packet_loss); | 155 | printf(_("PING %s - %sPacket loss = %d%%"), state_text(pinged.state), warn_text, | 
| 156 | pinged.packet_loss); | ||
| 155 | } else { | 157 | } else { | 
| 156 | printf(_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), state_text(pinged.state), warn_text, pinged.packet_loss, | 158 | printf(_("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms"), state_text(pinged.state), | 
| 157 | pinged.round_trip_average); | 159 | warn_text, pinged.packet_loss, pinged.round_trip_average); | 
| 158 | } | 160 | } | 
| 159 | if (config.display_html) { | 161 | if (config.display_html) { | 
| 160 | printf("</A>"); | 162 | printf("</A>"); | 
| @@ -162,14 +164,16 @@ int main(int argc, char **argv) { | |||
| 162 | 164 | ||
| 163 | /* Print performance data */ | 165 | /* Print performance data */ | 
| 164 | if (pinged.packet_loss != 100) { | 166 | if (pinged.packet_loss != 100) { | 
| 165 | printf("|%s", fperfdata("rta", pinged.round_trip_average, "ms", (bool)(config.wrta > 0), config.wrta, (bool)(config.crta > 0), | 167 | printf("|%s", | 
| 166 | config.crta, true, 0, false, 0)); | 168 | fperfdata("rta", pinged.round_trip_average, "ms", (bool)(config.wrta > 0), | 
| 169 | config.wrta, (bool)(config.crta > 0), config.crta, true, 0, false, 0)); | ||
| 167 | } else { | 170 | } else { | 
| 168 | printf("| rta=U;%f;%f;;", config.wrta, config.crta); | 171 | printf("| rta=U;%f;%f;;", config.wrta, config.crta); | 
| 169 | } | 172 | } | 
| 170 | 173 | ||
| 171 | printf(" %s\n", perfdata("pl", (long)pinged.packet_loss, "%", (bool)(config.wpl > 0), config.wpl, (bool)(config.cpl > 0), | 174 | printf(" %s\n", | 
| 172 | config.cpl, true, 0, false, 0)); | 175 | perfdata("pl", (long)pinged.packet_loss, "%", (bool)(config.wpl > 0), config.wpl, | 
| 176 | (bool)(config.cpl > 0), config.cpl, true, 0, false, 0)); | ||
| 173 | 177 | ||
| 174 | if (verbose >= 2) { | 178 | if (verbose >= 2) { | 
| 175 | printf("%f:%d%% %f:%d%%\n", config.wrta, config.wpl, config.crta, config.cpl); | 179 | printf("%f:%d%% %f:%d%%\n", config.wrta, config.wpl, config.crta, config.cpl); | 
| @@ -254,7 +258,8 @@ check_ping_config_wrapper process_arguments(int argc, char **argv) { | |||
| 254 | result.config.n_addresses++; | 258 | result.config.n_addresses++; | 
| 255 | if (result.config.n_addresses > max_addr) { | 259 | if (result.config.n_addresses > max_addr) { | 
| 256 | max_addr *= 2; | 260 | max_addr *= 2; | 
| 257 | result.config.addresses = realloc(result.config.addresses, sizeof(char *) * max_addr); | 261 | result.config.addresses = | 
| 262 | realloc(result.config.addresses, sizeof(char *) * max_addr); | ||
| 258 | if (result.config.addresses == NULL) { | 263 | if (result.config.addresses == NULL) { | 
| 259 | die(STATE_UNKNOWN, _("Could not realloc() addresses\n")); | 264 | die(STATE_UNKNOWN, _("Could not realloc() addresses\n")); | 
| 260 | } | 265 | } | 
| @@ -411,13 +416,15 @@ check_ping_config_wrapper validate_arguments(check_ping_config_wrapper config_wr | |||
| 411 | } | 416 | } | 
| 412 | 417 | ||
| 413 | if (config_wrapper.config.wrta > config_wrapper.config.crta) { | 418 | if (config_wrapper.config.wrta > config_wrapper.config.crta) { | 
| 414 | printf(_("<wrta> (%f) cannot be larger than <crta> (%f)\n"), config_wrapper.config.wrta, config_wrapper.config.crta); | 419 | printf(_("<wrta> (%f) cannot be larger than <crta> (%f)\n"), config_wrapper.config.wrta, | 
| 420 | config_wrapper.config.crta); | ||
| 415 | config_wrapper.errorcode = ERROR; | 421 | config_wrapper.errorcode = ERROR; | 
| 416 | return config_wrapper; | 422 | return config_wrapper; | 
| 417 | } | 423 | } | 
| 418 | 424 | ||
| 419 | if (config_wrapper.config.wpl > config_wrapper.config.cpl) { | 425 | if (config_wrapper.config.wpl > config_wrapper.config.cpl) { | 
| 420 | printf(_("<wpl> (%d) cannot be larger than <cpl> (%d)\n"), config_wrapper.config.wpl, config_wrapper.config.cpl); | 426 | printf(_("<wpl> (%d) cannot be larger than <cpl> (%d)\n"), config_wrapper.config.wpl, | 
| 427 | config_wrapper.config.cpl); | ||
| 421 | config_wrapper.errorcode = ERROR; | 428 | config_wrapper.errorcode = ERROR; | 
| 422 | return config_wrapper; | 429 | return config_wrapper; | 
| 423 | } | 430 | } | 
| @@ -426,7 +433,8 @@ check_ping_config_wrapper validate_arguments(check_ping_config_wrapper config_wr | |||
| 426 | config_wrapper.config.max_packets = DEFAULT_MAX_PACKETS; | 433 | config_wrapper.config.max_packets = DEFAULT_MAX_PACKETS; | 
| 427 | } | 434 | } | 
| 428 | 435 | ||
| 429 | double max_seconds = (config_wrapper.config.crta / 1000.0 * config_wrapper.config.max_packets) + config_wrapper.config.max_packets; | 436 | double max_seconds = (config_wrapper.config.crta / 1000.0 * config_wrapper.config.max_packets) + | 
| 437 | config_wrapper.config.max_packets; | ||
| 430 | if (max_seconds > timeout_interval) { | 438 | if (max_seconds > timeout_interval) { | 
| 431 | timeout_interval = (unsigned int)max_seconds; | 439 | timeout_interval = (unsigned int)max_seconds; | 
| 432 | } | 440 | } | 
| @@ -470,37 +478,70 @@ ping_result run_ping(const char *cmd, const char *addr, double crta) { | |||
| 470 | 478 | ||
| 471 | /* get the percent loss statistics */ | 479 | /* get the percent loss statistics */ | 
| 472 | int match = 0; | 480 | int match = 0; | 
| 473 | if ((sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) == | 481 | if ((sscanf( | 
| 474 | 1 && | 482 | buf, | 
| 483 | "%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n", | ||
| 484 | &result.packet_loss, &match) == 1 && | ||
| 475 | match) || | 485 | match) || | 
| 476 | (sscanf(buf, "%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n", &result.packet_loss, | 486 | (sscanf(buf, | 
| 477 | &match) == 1 && | 487 | "%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet " | 
| 488 | "loss%n", | ||
| 489 | &result.packet_loss, &match) == 1 && | ||
| 490 | match) || | ||
| 491 | (sscanf(buf, | ||
| 492 | "%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n", | ||
| 493 | &result.packet_loss, &match) == 1 && | ||
| 494 | match) || | ||
| 495 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% packet loss%n", | ||
| 496 | &result.packet_loss, &match) == 1 && | ||
| 497 | match) || | ||
| 498 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% loss, time%n", | ||
| 499 | &result.packet_loss, &match) == 1 && | ||
| 478 | match) || | 500 | match) || | 
| 479 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n", &result.packet_loss, &match) == 1 && | 501 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% loss, time%n", | 
| 502 | &result.packet_loss, &match) == 1 && | ||
| 480 | match) || | 503 | match) || | 
| 481 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% packet loss%n", &result.packet_loss, &match) == 1 && match) || | 504 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% packet loss, time%n", | 
| 482 | (sscanf(buf, "%*d packets transmitted, %*d packets received, %d%% loss, time%n", &result.packet_loss, &match) == 1 && match) || | 505 | &result.packet_loss, &match) == 1 && | 
| 483 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% loss, time%n", &result.packet_loss, &match) == 1 && match) || | 506 | match) == 1 || | 
| 484 | (sscanf(buf, "%*d packets transmitted, %*d received, %d%% packet loss, time%n", &result.packet_loss, &match) == 1 && match) == | 507 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n", | 
| 485 | 1 || | 508 | &result.packet_loss, &match) == 1 && | 
| 486 | (sscanf(buf, "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) == 1 && | ||
| 487 | match) || | 509 | match) || | 
| 488 | (sscanf(buf, "%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n", &result.packet_loss, &match) == 1 && | 510 | (sscanf(buf, "%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n", | 
| 511 | &result.packet_loss, &match) == 1 && | ||
| 489 | match) || | 512 | match) || | 
| 490 | (sscanf(buf, "%*[^(](%d%% %*[^)])%n", &result.packet_loss, &match) == 1 && match)) { | 513 | (sscanf(buf, "%*[^(](%d%% %*[^)])%n", &result.packet_loss, &match) == 1 && match)) { | 
| 491 | continue; | 514 | continue; | 
| 492 | } | 515 | } | 
| 493 | 516 | ||
| 494 | /* get the round trip average */ | 517 | /* get the round trip average */ | 
| 495 | if ((sscanf(buf, "round-trip min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 518 | if ((sscanf(buf, "round-trip min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, | 
| 496 | (sscanf(buf, "round-trip min/avg/max/mdev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 519 | &match) == 1 && | 
| 497 | (sscanf(buf, "round-trip min/avg/max/sdev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 520 | match) || | 
| 498 | (sscanf(buf, "round-trip min/avg/max/stddev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 521 | (sscanf(buf, "round-trip min/avg/max/mdev = %*f/%lf/%*f/%*f%n", | 
| 499 | (sscanf(buf, "round-trip min/avg/max/std-dev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 522 | &result.round_trip_average, &match) == 1 && | 
| 500 | (sscanf(buf, "round-trip (ms) min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 523 | match) || | 
| 501 | (sscanf(buf, "round-trip (ms) min/avg/max/stddev = %*f/%lf/%*f/%*f%n", &result.round_trip_average, &match) == 1 && match) || | 524 | (sscanf(buf, "round-trip min/avg/max/sdev = %*f/%lf/%*f/%*f%n", | 
| 502 | (sscanf(buf, "rtt min/avg/max/mdev = %*f/%lf/%*f/%*f ms%n", &result.round_trip_average, &match) == 1 && match) || | 525 | &result.round_trip_average, &match) == 1 && | 
| 503 | (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %lfms%n", &result.round_trip_average, &match) == 1 && match)) { | 526 | match) || | 
| 527 | (sscanf(buf, "round-trip min/avg/max/stddev = %*f/%lf/%*f/%*f%n", | ||
| 528 | &result.round_trip_average, &match) == 1 && | ||
| 529 | match) || | ||
| 530 | (sscanf(buf, "round-trip min/avg/max/std-dev = %*f/%lf/%*f/%*f%n", | ||
| 531 | &result.round_trip_average, &match) == 1 && | ||
| 532 | match) || | ||
| 533 | (sscanf(buf, "round-trip (ms) min/avg/max = %*f/%lf/%*f%n", &result.round_trip_average, | ||
| 534 | &match) == 1 && | ||
| 535 | match) || | ||
| 536 | (sscanf(buf, "round-trip (ms) min/avg/max/stddev = %*f/%lf/%*f/%*f%n", | ||
| 537 | &result.round_trip_average, &match) == 1 && | ||
| 538 | match) || | ||
| 539 | (sscanf(buf, "rtt min/avg/max/mdev = %*f/%lf/%*f/%*f ms%n", &result.round_trip_average, | ||
| 540 | &match) == 1 && | ||
| 541 | match) || | ||
| 542 | (sscanf(buf, "%*[^=] = %*fms, %*[^=] = %*fms, %*[^=] = %lfms%n", | ||
| 543 | &result.round_trip_average, &match) == 1 && | ||
| 544 | match)) { | ||
| 504 | continue; | 545 | continue; | 
| 505 | } | 546 | } | 
| 506 | } | 547 | } | 
| @@ -513,7 +554,8 @@ ping_result run_ping(const char *cmd, const char *addr, double crta) { | |||
| 513 | /* check stderr, setting at least WARNING if there is output here */ | 554 | /* check stderr, setting at least WARNING if there is output here */ | 
| 514 | /* Add warning into warn_text */ | 555 | /* Add warning into warn_text */ | 
| 515 | while (fgets(buf, MAX_INPUT_BUFFER - 1, child_stderr)) { | 556 | while (fgets(buf, MAX_INPUT_BUFFER - 1, child_stderr)) { | 
| 516 | if (!strstr(buf, "WARNING - no SO_TIMESTAMP support, falling back to SIOCGSTAMP") && !strstr(buf, "Warning: time of day goes back") | 557 | if (!strstr(buf, "WARNING - no SO_TIMESTAMP support, falling back to SIOCGSTAMP") && | 
| 558 | !strstr(buf, "Warning: time of day goes back") | ||
| 517 | 559 | ||
| 518 | ) { | 560 | ) { | 
| 519 | if (verbose >= 3) { | 561 | if (verbose >= 3) { | 
| @@ -524,7 +566,8 @@ ping_result run_ping(const char *cmd, const char *addr, double crta) { | |||
| 524 | if (warn_text == NULL) { | 566 | if (warn_text == NULL) { | 
| 525 | warn_text = strdup(_("System call sent warnings to stderr ")); | 567 | warn_text = strdup(_("System call sent warnings to stderr ")); | 
| 526 | } else { | 568 | } else { | 
| 527 | xasprintf(&warn_text, "%s %s", warn_text, _("System call sent warnings to stderr ")); | 569 | xasprintf(&warn_text, "%s %s", warn_text, | 
| 570 | _("System call sent warnings to stderr ")); | ||
| 528 | } | 571 | } | 
| 529 | } | 572 | } | 
| 530 | } | 573 | } | 
| @@ -542,7 +585,8 @@ ping_result run_ping(const char *cmd, const char *addr, double crta) { | |||
| 542 | } | 585 | } | 
| 543 | 586 | ||
| 544 | mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { | 587 | mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { | 
| 545 | if (strstr(buf, "Network is unreachable") || strstr(buf, "Destination Net Unreachable") || strstr(buf, "No route")) { | 588 | if (strstr(buf, "Network is unreachable") || strstr(buf, "Destination Net Unreachable") || | 
| 589 | strstr(buf, "No route")) { | ||
| 546 | die(STATE_CRITICAL, _("CRITICAL - Network Unreachable (%s)\n"), addr); | 590 | die(STATE_CRITICAL, _("CRITICAL - Network Unreachable (%s)\n"), addr); | 
| 547 | } else if (strstr(buf, "Destination Host Unreachable") || strstr(buf, "Address unreachable")) { | 591 | } else if (strstr(buf, "Destination Host Unreachable") || strstr(buf, "Address unreachable")) { | 
| 548 | die(STATE_CRITICAL, _("CRITICAL - Host Unreachable (%s)\n"), addr); | 592 | die(STATE_CRITICAL, _("CRITICAL - Host Unreachable (%s)\n"), addr); | 
| @@ -567,7 +611,8 @@ mp_state_enum error_scan(char buf[MAX_INPUT_BUFFER], const char *addr) { | |||
| 567 | if (strstr(buf, "(DUP!)") || strstr(buf, "DUPLICATES FOUND")) { | 611 | if (strstr(buf, "(DUP!)") || strstr(buf, "DUPLICATES FOUND")) { | 
| 568 | if (warn_text == NULL) { | 612 | if (warn_text == NULL) { | 
| 569 | warn_text = strdup(_(WARN_DUPLICATES)); | 613 | warn_text = strdup(_(WARN_DUPLICATES)); | 
| 570 | } else if (!strstr(warn_text, _(WARN_DUPLICATES)) && xasprintf(&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1) { | 614 | } else if (!strstr(warn_text, _(WARN_DUPLICATES)) && | 
| 615 | xasprintf(&warn_text, "%s %s", warn_text, _(WARN_DUPLICATES)) == -1) { | ||
| 571 | die(STATE_UNKNOWN, _("Unable to realloc warn_text\n")); | 616 | die(STATE_UNKNOWN, _("Unable to realloc warn_text\n")); | 
| 572 | } | 617 | } | 
| 573 | return STATE_WARNING; | 618 | return STATE_WARNING; | 
| @@ -613,8 +658,10 @@ void print_help(void) { | |||
| 613 | printf("%s\n", _("percentage of packet loss to trigger an alarm state.")); | 658 | printf("%s\n", _("percentage of packet loss to trigger an alarm state.")); | 
| 614 | 659 | ||
| 615 | printf("\n"); | 660 | printf("\n"); | 
| 616 | printf("%s\n", _("This plugin uses the ping command to probe the specified host for packet loss")); | 661 | printf("%s\n", | 
| 617 | printf("%s\n", _("(percentage) and round trip average (milliseconds). It can produce HTML output.")); | 662 | _("This plugin uses the ping command to probe the specified host for packet loss")); | 
| 663 | printf("%s\n", | ||
| 664 | _("(percentage) and round trip average (milliseconds). It can produce HTML output.")); | ||
| 618 | 665 | ||
| 619 | printf(UT_SUPPORT); | 666 | printf(UT_SUPPORT); | 
| 620 | } | 667 | } | 
