summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/check_ping.c109
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! " 32enum {
33 UNKNOWN_PACKET_LOSS = 200, /* 200% */
34 DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */
35};
34 36
35int process_arguments (int, char **); 37int process_arguments (int, char **);
36int get_threshold (char *, float *, int *); 38int get_threshold (char *, float *, int *);
@@ -53,12 +55,16 @@ int verbose = FALSE;
53float rta = UNKNOWN_TRIP_TIME; 55float rta = UNKNOWN_TRIP_TIME;
54int pl = UNKNOWN_PACKET_LOSS; 56int pl = UNKNOWN_PACKET_LOSS;
55 57
56char *warn_text = NULL; 58char *warn_text = "";
59
60
57 61
62
63
58int 64int
59main (int argc, char **argv) 65main (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 */
150int 160int
151process_arguments (int argc, char **argv) 161process_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
380int 394int
381run_ping (char *command_line, char *server_address) 395run_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
484void 483void
485print_usage (void) 484print_usage (void)
486{ 485{