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 | } |
