Code

add logic to check multiple servers
authorKarl DeBisschop <kdebisschop@users.sourceforge.net>
Sun, 2 Mar 2003 06:01:18 +0000 (06:01 +0000)
committerKarl DeBisschop <kdebisschop@users.sourceforge.net>
Sun, 2 Mar 2003 06:01:18 +0000 (06:01 +0000)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@361 f882894a-f735-0410-b71e-b25c423dba1c

plugins/check_ping.c

index 0c0f2e44f2872e0d4601e683c9b733dd596ecc3c..c75ad587d84a450c4f275567188db563d945fd18 100644 (file)
@@ -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 ()
 \f
 
 int
-run_ping (char *command_line)
+run_ping (char *command_line, char *server_address)
 {
        char input_buffer[MAX_INPUT_BUFFER];
        int result = STATE_UNKNOWN;