|
|
@@ -58,7 +58,7 @@ the contrib area of the downloads section at http://www.nagios.org\n\n"
|
|
|
int process_arguments (int, char **);
|
|
|
int get_threshold (char *, float *, int *);
|
|
|
int validate_arguments (void);
|
|
|
-int run_ping (char *);
|
|
|
+int run_ping (char *, char *);
|
|
|
void print_usage (void);
|
|
|
void print_help (void);
|
|
|
|
|
|
@@ -67,7 +67,9 @@ int wpl = UNKNOWN_PACKET_LOSS;
|
|
|
int cpl = UNKNOWN_PACKET_LOSS;
|
|
|
float wrta = UNKNOWN_TRIP_TIME;
|
|
|
float crta = UNKNOWN_TRIP_TIME;
|
|
|
-char *server_address = NULL;
|
|
|
+char **addresses = NULL;
|
|
|
+int n_addresses;
|
|
|
+int max_addr = 1;
|
|
|
int max_packets = -1;
|
|
|
int verbose = FALSE;
|
|
|
|
|
|
@@ -81,18 +83,14 @@ main (int argc, char **argv)
|
|
|
{
|
|
|
char *command_line = NULL;
|
|
|
int result = STATE_UNKNOWN;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ addresses = malloc (max_addr);
|
|
|
|
|
|
if (process_arguments (argc, argv) == ERROR)
|
|
|
usage ("Could not parse arguments");
|
|
|
exit;
|
|
|
|
|
|
- /* does the host address of number of packets argument come first? */
|
|
|
-#ifdef PING_PACKETS_FIRST
|
|
|
- asprintf (&command_line, PING_COMMAND, max_packets, server_address);
|
|
|
-#else
|
|
|
- asprintf (&command_line, PING_COMMAND, server_address, max_packets);
|
|
|
-#endif
|
|
|
-
|
|
|
/* Set signal handling and alarm */
|
|
|
if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
|
|
|
printf ("Cannot catch SIGALRM");
|
|
|
@@ -102,43 +100,53 @@ main (int argc, char **argv)
|
|
|
/* handle timeouts gracefully */
|
|
|
alarm (timeout_interval);
|
|
|
|
|
|
- if (verbose)
|
|
|
- printf ("%s ==> ", command_line);
|
|
|
+ for (i = 0 ; i < n_addresses ; i++) {
|
|
|
|
|
|
- /* run the command */
|
|
|
- run_ping (command_line);
|
|
|
+ /* does the host address of number of packets argument come first? */
|
|
|
+#ifdef PING_PACKETS_FIRST
|
|
|
+ asprintf (&command_line, PING_COMMAND, max_packets, addresses[i]);
|
|
|
+#else
|
|
|
+ asprintf (&command_line, PING_COMMAND, addresses[i], max_packets);
|
|
|
+#endif
|
|
|
|
|
|
- if (pl == UNKNOWN_PACKET_LOSS || rta == UNKNOWN_TRIP_TIME) {
|
|
|
- printf ("%s\n", command_line);
|
|
|
- terminate (STATE_UNKNOWN,
|
|
|
- "Error: Could not interpret output from ping command\n");
|
|
|
- }
|
|
|
+ if (verbose)
|
|
|
+ printf ("%s ==> ", command_line);
|
|
|
|
|
|
- if (pl >= cpl || rta >= crta || rta < 0)
|
|
|
- result = STATE_CRITICAL;
|
|
|
- else if (pl >= wpl || rta >= wrta)
|
|
|
- result = STATE_WARNING;
|
|
|
- else if (pl < wpl && rta < wrta && pl >= 0 && rta >= 0)
|
|
|
- /* cannot use the max function because STATE_UNKNOWN is now 3 gt STATE_OK
|
|
|
- result = max (result, STATE_OK); */
|
|
|
- if( !( (result == STATE_WARNING) || (result == STATE_CRITICAL) ) ) {
|
|
|
- result = STATE_OK;
|
|
|
+ /* run the command */
|
|
|
+ run_ping (command_line, addresses[i]);
|
|
|
+
|
|
|
+ if (pl == UNKNOWN_PACKET_LOSS || rta == UNKNOWN_TRIP_TIME) {
|
|
|
+ printf ("%s\n", command_line);
|
|
|
+ terminate (STATE_UNKNOWN,
|
|
|
+ "Error: Could not interpret output from ping command\n");
|
|
|
}
|
|
|
-
|
|
|
- if (display_html == TRUE)
|
|
|
- printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, server_address);
|
|
|
- if (pl == 100)
|
|
|
- printf ("PING %s - %sPacket loss = %d%%", state_text (result), warn_text,
|
|
|
- pl);
|
|
|
- else
|
|
|
- printf ("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms",
|
|
|
- state_text (result), warn_text, pl, rta);
|
|
|
- if (display_html == TRUE)
|
|
|
- printf ("</A>");
|
|
|
- printf ("\n");
|
|
|
|
|
|
- if (verbose)
|
|
|
- printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl);
|
|
|
+ if (pl >= cpl || rta >= crta || rta < 0)
|
|
|
+ result = STATE_CRITICAL;
|
|
|
+ else if (pl >= wpl || rta >= wrta)
|
|
|
+ result = STATE_WARNING;
|
|
|
+ else if (pl < wpl && rta < wrta && pl >= 0 && rta >= 0)
|
|
|
+ /* cannot use the max function because STATE_UNKNOWN is now 3 gt STATE_OK
|
|
|
+ result = max (result, STATE_OK); */
|
|
|
+ if( !( (result == STATE_WARNING) || (result == STATE_CRITICAL) ) ) {
|
|
|
+ result = STATE_OK;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (display_html == TRUE)
|
|
|
+ printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]);
|
|
|
+ if (pl == 100)
|
|
|
+ printf ("PING %s - %sPacket loss = %d%%", state_text (result), warn_text,
|
|
|
+ pl);
|
|
|
+ else
|
|
|
+ printf ("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms",
|
|
|
+ state_text (result), warn_text, pl, rta);
|
|
|
+ if (display_html == TRUE)
|
|
|
+ printf ("</A>");
|
|
|
+ printf ("\n");
|
|
|
+
|
|
|
+ if (verbose)
|
|
|
+ printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl);
|
|
|
+ }
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
@@ -200,7 +208,14 @@ process_arguments (int argc, char **argv)
|
|
|
case 'H': /* hostname */
|
|
|
if (is_host (optarg) == FALSE)
|
|
|
usage2 ("Invalid host name/address", optarg);
|
|
|
- server_address = optarg;
|
|
|
+ n_addresses++;
|
|
|
+ if (n_addresses > max_addr) {
|
|
|
+ max_addr *= 2;
|
|
|
+ addresses = realloc (addresses, max_addr);
|
|
|
+ if (addresses == NULL)
|
|
|
+ terminate (STATE_UNKNOWN, "Could not realloc() addresses\n");
|
|
|
+ }
|
|
|
+ addresses[n_addresses-1] = optarg;
|
|
|
break;
|
|
|
case 'p': /* number of packets to send */
|
|
|
if (is_intnonneg (optarg))
|
|
|
@@ -227,12 +242,12 @@ process_arguments (int argc, char **argv)
|
|
|
if (c == argc)
|
|
|
return validate_arguments ();
|
|
|
|
|
|
- if (server_address == NULL) {
|
|
|
+ if (addresses[0] == NULL) {
|
|
|
if (is_host (argv[c]) == FALSE) {
|
|
|
printf ("Invalid host name/address: %s\n\n", argv[c]);
|
|
|
return ERROR;
|
|
|
} else {
|
|
|
- server_address = argv[c++];
|
|
|
+ addresses[0] = argv[c++];
|
|
|
if (c == argc)
|
|
|
return validate_arguments ();
|
|
|
}
|
|
|
@@ -349,7 +364,7 @@ validate_arguments ()
|
|
|
|
|
|
|
|
|
int
|
|
|
-run_ping (char *command_line)
|
|
|
+run_ping (char *command_line, char *server_address)
|
|
|
{
|
|
|
char input_buffer[MAX_INPUT_BUFFER];
|
|
|
int result = STATE_UNKNOWN;
|