diff options
| -rw-r--r-- | plugins/check_ping.c | 109 |
1 files changed, 54 insertions, 55 deletions
diff --git a/plugins/check_ping.c b/plugins/check_ping.c index 9eff13c3..26c0192a 100644 --- a/plugins/check_ping.c +++ b/plugins/check_ping.c | |||
| @@ -26,11 +26,13 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net"; | |||
| 26 | #include "popen.h" | 26 | #include "popen.h" |
| 27 | #include "utils.h" | 27 | #include "utils.h" |
| 28 | 28 | ||
| 29 | #define UNKNOWN_PACKET_LOSS 200 /* 200% */ | 29 | #define WARN_DUPLICATES "DUPLICATES FOUND! " |
| 30 | #define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ | 30 | #define UNKNOWN_TRIP_TIME -1.0 /* -1 seconds */ |
| 31 | #define DEFAULT_MAX_PACKETS 5 /* default no. of ICMP ECHO packets */ | ||
| 32 | 31 | ||
| 33 | #define WARN_DUPLICATES "DUPLICATES FOUND! " | 32 | enum { |
| 33 | UNKNOWN_PACKET_LOSS = 200, /* 200% */ | ||
| 34 | DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */ | ||
| 35 | }; | ||
| 34 | 36 | ||
| 35 | int process_arguments (int, char **); | 37 | int process_arguments (int, char **); |
| 36 | int get_threshold (char *, float *, int *); | 38 | int get_threshold (char *, float *, int *); |
| @@ -53,12 +55,16 @@ int verbose = FALSE; | |||
| 53 | float rta = UNKNOWN_TRIP_TIME; | 55 | float rta = UNKNOWN_TRIP_TIME; |
| 54 | int pl = UNKNOWN_PACKET_LOSS; | 56 | int pl = UNKNOWN_PACKET_LOSS; |
| 55 | 57 | ||
| 56 | char *warn_text = NULL; | 58 | char *warn_text = ""; |
| 59 | |||
| 60 | |||
| 57 | 61 | ||
| 62 | |||
| 63 | |||
| 58 | int | 64 | int |
| 59 | main (int argc, char **argv) | 65 | main (int argc, char **argv) |
| 60 | { | 66 | { |
| 61 | char *command_line = NULL; | 67 | char *cmd = NULL; |
| 62 | int result = STATE_UNKNOWN; | 68 | int result = STATE_UNKNOWN; |
| 63 | int this_result = STATE_UNKNOWN; | 69 | int this_result = STATE_UNKNOWN; |
| 64 | int i; | 70 | int i; |
| @@ -84,32 +90,32 @@ main (int argc, char **argv) | |||
| 84 | #ifdef PING6_COMMAND | 90 | #ifdef PING6_COMMAND |
| 85 | # ifdef PING_PACKETS_FIRST | 91 | # ifdef PING_PACKETS_FIRST |
| 86 | if (is_inet6_addr(addresses[i]) && address_family != AF_INET) | 92 | if (is_inet6_addr(addresses[i]) && address_family != AF_INET) |
| 87 | asprintf (&command_line, PING6_COMMAND, max_packets, addresses[i]); | 93 | asprintf (&cmd, PING6_COMMAND, max_packets, addresses[i]); |
| 88 | else | 94 | else |
| 89 | asprintf (&command_line, PING_COMMAND, max_packets, addresses[i]); | 95 | asprintf (&cmd, PING_COMMAND, max_packets, addresses[i]); |
| 90 | # else | 96 | # else |
| 91 | if (is_inet6_addr(addresses[i]) && address_family != AF_INET) | 97 | if (is_inet6_addr(addresses[i]) && address_family != AF_INET) |
| 92 | asprintf (&command_line, PING6_COMMAND, addresses[i], max_packets); | 98 | asprintf (&cmd, PING6_COMMAND, addresses[i], max_packets); |
| 93 | else | 99 | else |
| 94 | asprintf (&command_line, PING_COMMAND, addresses[i], max_packets); | 100 | asprintf (&cmd, PING_COMMAND, addresses[i], max_packets); |
| 95 | # endif | 101 | # endif |
| 96 | #else /* USE_IPV6 */ | 102 | #else /* USE_IPV6 */ |
| 97 | # ifdef PING_PACKETS_FIRST | 103 | # ifdef PING_PACKETS_FIRST |
| 98 | asprintf (&command_line, PING_COMMAND, max_packets, addresses[i]); | 104 | asprintf (&cmd, PING_COMMAND, max_packets, addresses[i]); |
| 99 | # else | 105 | # else |
| 100 | asprintf (&command_line, PING_COMMAND, addresses[i], max_packets); | 106 | asprintf (&cmd, PING_COMMAND, addresses[i], max_packets); |
| 101 | # endif | 107 | # endif |
| 102 | #endif /* USE_IPV6 */ | 108 | #endif /* USE_IPV6 */ |
| 103 | 109 | ||
| 104 | if (verbose) | 110 | if (verbose) |
| 105 | printf ("%s ==> ", command_line); | 111 | printf ("%s ==> ", cmd); |
| 106 | 112 | ||
| 107 | /* run the command */ | 113 | /* run the command */ |
| 108 | this_result = run_ping (command_line, addresses[i]); | 114 | this_result = run_ping (cmd, addresses[i]); |
| 109 | 115 | ||
| 110 | if (pl == UNKNOWN_PACKET_LOSS || rta == UNKNOWN_TRIP_TIME) { | 116 | if (pl == UNKNOWN_PACKET_LOSS || rta == UNKNOWN_TRIP_TIME) { |
| 111 | printf ("%s\n", command_line); | 117 | printf ("%s\n", cmd); |
| 112 | terminate (STATE_UNKNOWN, | 118 | die (STATE_UNKNOWN, |
| 113 | _("Error: Could not interpret output from ping command\n")); | 119 | _("Error: Could not interpret output from ping command\n")); |
| 114 | } | 120 | } |
| 115 | 121 | ||
| @@ -121,7 +127,7 @@ main (int argc, char **argv) | |||
| 121 | this_result = max_state (STATE_OK, this_result); | 127 | this_result = max_state (STATE_OK, this_result); |
| 122 | 128 | ||
| 123 | if (n_addresses > 1 && this_result != STATE_UNKNOWN) | 129 | if (n_addresses > 1 && this_result != STATE_UNKNOWN) |
| 124 | terminate (STATE_OK, "%s is alive\n", addresses[i]); | 130 | die (STATE_OK, "%s is alive\n", addresses[i]); |
| 125 | 131 | ||
| 126 | if (display_html == TRUE) | 132 | if (display_html == TRUE) |
| 127 | printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]); | 133 | printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]); |
| @@ -144,8 +150,12 @@ main (int argc, char **argv) | |||
| 144 | 150 | ||
| 145 | return result; | 151 | return result; |
| 146 | } | 152 | } |
| 147 | |||
| 148 | 153 | ||
| 154 | |||
| 155 | |||
| 156 | |||
| 157 | |||
| 158 | |||
| 149 | /* process command-line arguments */ | 159 | /* process command-line arguments */ |
| 150 | int | 160 | int |
| 151 | process_arguments (int argc, char **argv) | 161 | process_arguments (int argc, char **argv) |
| @@ -213,7 +223,7 @@ process_arguments (int argc, char **argv) | |||
| 213 | max_addr *= 2; | 223 | max_addr *= 2; |
| 214 | addresses = realloc (addresses, max_addr); | 224 | addresses = realloc (addresses, max_addr); |
| 215 | if (addresses == NULL) | 225 | if (addresses == NULL) |
| 216 | terminate (STATE_UNKNOWN, _("Could not realloc() addresses\n")); | 226 | die (STATE_UNKNOWN, _("Could not realloc() addresses\n")); |
| 217 | } | 227 | } |
| 218 | addresses[n_addresses-1] = ptr; | 228 | addresses[n_addresses-1] = ptr; |
| 219 | if ((ptr = index (ptr, ','))) { | 229 | if ((ptr = index (ptr, ','))) { |
| @@ -307,7 +317,7 @@ process_arguments (int argc, char **argv) | |||
| 307 | if (max_packets == -1) { | 317 | if (max_packets == -1) { |
| 308 | if (is_intnonneg (argv[c])) { | 318 | if (is_intnonneg (argv[c])) { |
| 309 | max_packets = atoi (argv[c++]); | 319 | max_packets = atoi (argv[c++]); |
| 310 | } else { | 320 | } else { |
| 311 | printf (_("<max_packets> (%s) must be a non-negative number\n"), argv[c]); | 321 | printf (_("<max_packets> (%s) must be a non-negative number\n"), argv[c]); |
| 312 | return ERROR; | 322 | return ERROR; |
| 313 | } | 323 | } |
| @@ -375,40 +385,33 @@ validate_arguments () | |||
| 375 | 385 | ||
| 376 | return OK; | 386 | return OK; |
| 377 | } | 387 | } |
| 378 | |||
| 379 | 388 | ||
| 389 | |||
| 390 | |||
| 391 | |||
| 392 | |||
| 393 | |||
| 380 | int | 394 | int |
| 381 | run_ping (char *command_line, char *server_address) | 395 | run_ping (char *cmd, char *server_address) |
| 382 | { | 396 | { |
| 383 | char buf[MAX_INPUT_BUFFER]; | 397 | char buf[MAX_INPUT_BUFFER]; |
| 384 | int result = STATE_UNKNOWN; | 398 | int result = STATE_UNKNOWN; |
| 385 | 399 | ||
| 386 | warn_text = malloc (1); | 400 | if ((child_process = spopen (cmd)) == NULL) { |
| 387 | if (warn_text == NULL) | ||
| 388 | terminate (STATE_UNKNOWN, _("unable to malloc warn_text")); | ||
| 389 | warn_text[0] = 0; | ||
| 390 | |||
| 391 | if ((child_process = spopen (command_line)) == NULL) { | ||
| 392 | printf (_("Cannot open pipe: ")); | 401 | printf (_("Cannot open pipe: ")); |
| 393 | terminate (STATE_UNKNOWN, command_line); | 402 | die (STATE_UNKNOWN, cmd); |
| 394 | } | 403 | } |
| 395 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | 404 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); |
| 396 | if (child_stderr == NULL) | 405 | if (child_stderr == NULL) |
| 397 | printf (_("Cannot open stderr for %s\n"), command_line); | 406 | printf (_("Cannot open stderr for %s\n"), cmd); |
| 398 | 407 | ||
| 399 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_process)) { | 408 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_process)) { |
| 400 | 409 | ||
| 401 | if (strstr (buf, _("(DUP!)"))) { | 410 | if (strstr (buf, _("(DUP!)"))) { |
| 402 | /* cannot use the max function since STATE_UNKNOWN is max | 411 | result = max_state (result, STATE_WARNING); |
| 403 | result = max (result, STATE_WARNING); */ | 412 | warn_text = strdup (WARN_DUPLICATES); |
| 404 | if( !(result == STATE_CRITICAL) ){ | 413 | if (!warn_text) |
| 405 | result = STATE_WARNING; | 414 | die (STATE_UNKNOWN, _("unable to realloc warn_text")); |
| 406 | } | ||
| 407 | |||
| 408 | warn_text = realloc (warn_text, strlen (WARN_DUPLICATES) + 1); | ||
| 409 | if (warn_text == NULL) | ||
| 410 | terminate (STATE_UNKNOWN, _("unable to realloc warn_text")); | ||
| 411 | strcpy (warn_text, WARN_DUPLICATES); | ||
| 412 | } | 415 | } |
| 413 | 416 | ||
| 414 | /* get the percent loss statistics */ | 417 | /* get the percent loss statistics */ |
| @@ -434,39 +437,31 @@ run_ping (char *command_line, char *server_address) | |||
| 434 | if (pl == 100) | 437 | if (pl == 100) |
| 435 | rta = crta; | 438 | rta = crta; |
| 436 | 439 | ||
| 437 | |||
| 438 | /* check stderr */ | 440 | /* check stderr */ |
| 439 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_stderr)) { | 441 | while (fgets (buf, MAX_INPUT_BUFFER - 1, child_stderr)) { |
| 440 | if (strstr(buf,"Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP")) | 442 | if (strstr(buf,"Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP")) |
| 441 | continue; | 443 | continue; |
| 442 | 444 | ||
| 443 | if (strstr (buf, "Network is unreachable")) | 445 | if (strstr (buf, "Network is unreachable")) |
| 444 | terminate (STATE_CRITICAL, | 446 | die (STATE_CRITICAL, |
| 445 | _("PING CRITICAL - Network unreachable (%s)"), | 447 | _("PING CRITICAL - Network unreachable (%s)"), |
| 446 | server_address); | 448 | server_address); |
| 447 | else if (strstr (buf, "Destination Host Unreachable")) | 449 | else if (strstr (buf, "Destination Host Unreachable")) |
| 448 | terminate (STATE_CRITICAL, | 450 | die (STATE_CRITICAL, |
| 449 | _("PING CRITICAL - Host Unreachable (%s)"), | 451 | _("PING CRITICAL - Host Unreachable (%s)"), |
| 450 | server_address); | 452 | server_address); |
| 451 | else if (strstr (buf, "unknown host" )) | 453 | else if (strstr (buf, "unknown host" )) |
| 452 | terminate (STATE_CRITICAL, | 454 | die (STATE_CRITICAL, |
| 453 | _("PING CRITICAL - Host not found (%s)"), | 455 | _("PING CRITICAL - Host not found (%s)"), |
| 454 | server_address); | 456 | server_address); |
| 455 | 457 | ||
| 456 | warn_text = | ||
| 457 | realloc (warn_text, strlen (warn_text) + strlen (buf) + 2); | ||
| 458 | if (warn_text == NULL) | ||
| 459 | terminate (STATE_UNKNOWN, _("unable to realloc warn_text")); | ||
| 460 | if (strlen (warn_text) == 0) | 458 | if (strlen (warn_text) == 0) |
| 461 | strcpy (warn_text, buf); | 459 | warn_text = strdup (buf); |
| 462 | else | 460 | else if (asprintf (&warn_text, "%s %s", warn_text, buf) == -1) |
| 463 | sprintf (warn_text, "%s %s", warn_text, buf); | 461 | die (STATE_UNKNOWN, _("unable to realloc warn_text")); |
| 464 | 462 | ||
| 465 | if (strstr (buf, "DUPLICATES FOUND")) { | 463 | if (strstr (buf, "DUPLICATES FOUND")) |
| 466 | if( !(result == STATE_CRITICAL) ){ | 464 | result = max_state (result, STATE_WARNING); |
| 467 | result = STATE_WARNING; | ||
| 468 | } | ||
| 469 | } | ||
| 470 | else | 465 | else |
| 471 | result = STATE_CRITICAL ; | 466 | result = STATE_CRITICAL ; |
| 472 | } | 467 | } |
| @@ -481,6 +476,10 @@ run_ping (char *command_line, char *server_address) | |||
| 481 | } | 476 | } |
| 482 | 477 | ||
| 483 | 478 | ||
| 479 | |||
| 480 | |||
| 481 | |||
| 482 | |||
| 484 | void | 483 | void |
| 485 | print_usage (void) | 484 | print_usage (void) |
| 486 | { | 485 | { |
