From 2789d116982e7fa2aaf93455d43e7f4ad93a42fc Mon Sep 17 00:00:00 2001
From: Karl DeBisschop <kdebisschop@users.sourceforge.net>
Date: Sun, 2 Mar 2003 06:01:18 +0000
Subject: add logic to check multiple servers

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@361 f882894a-f735-0410-b71e-b25c423dba1c

diff --git a/plugins/check_ping.c b/plugins/check_ping.c
index 0c0f2e4..c75ad58 100644
--- a/plugins/check_ping.c
+++ b/plugins/check_ping.c
@@ -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;
-- 
cgit v0.10-9-g596f

