diff options
| author | Karl DeBisschop <kdebisschop@users.sourceforge.net> | 2003-03-02 06:01:18 +0000 |
|---|---|---|
| committer | Karl DeBisschop <kdebisschop@users.sourceforge.net> | 2003-03-02 06:01:18 +0000 |
| commit | 2789d116982e7fa2aaf93455d43e7f4ad93a42fc (patch) | |
| tree | bbde0639adff89133861507a25d4661cab49af52 | |
| parent | eb47d294c6c0393a75f06a51bd60290fd52e0c90 (diff) | |
| download | monitoring-plugins-2789d116982e7fa2aaf93455d43e7f4ad93a42fc.tar.gz | |
add logic to check multiple servers
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@361 f882894a-f735-0410-b71e-b25c423dba1c
| -rw-r--r-- | plugins/check_ping.c | 105 |
1 files changed, 60 insertions, 45 deletions
diff --git a/plugins/check_ping.c b/plugins/check_ping.c index 0c0f2e44..c75ad587 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" | |||
| 58 | int process_arguments (int, char **); | 58 | int process_arguments (int, char **); |
| 59 | int get_threshold (char *, float *, int *); | 59 | int get_threshold (char *, float *, int *); |
| 60 | int validate_arguments (void); | 60 | int validate_arguments (void); |
| 61 | int run_ping (char *); | 61 | int run_ping (char *, char *); |
| 62 | void print_usage (void); | 62 | void print_usage (void); |
| 63 | void print_help (void); | 63 | void print_help (void); |
| 64 | 64 | ||
| @@ -67,7 +67,9 @@ int wpl = UNKNOWN_PACKET_LOSS; | |||
| 67 | int cpl = UNKNOWN_PACKET_LOSS; | 67 | int cpl = UNKNOWN_PACKET_LOSS; |
| 68 | float wrta = UNKNOWN_TRIP_TIME; | 68 | float wrta = UNKNOWN_TRIP_TIME; |
| 69 | float crta = UNKNOWN_TRIP_TIME; | 69 | float crta = UNKNOWN_TRIP_TIME; |
| 70 | char *server_address = NULL; | 70 | char **addresses = NULL; |
| 71 | int n_addresses; | ||
| 72 | int max_addr = 1; | ||
| 71 | int max_packets = -1; | 73 | int max_packets = -1; |
| 72 | int verbose = FALSE; | 74 | int verbose = FALSE; |
| 73 | 75 | ||
| @@ -81,18 +83,14 @@ main (int argc, char **argv) | |||
| 81 | { | 83 | { |
| 82 | char *command_line = NULL; | 84 | char *command_line = NULL; |
| 83 | int result = STATE_UNKNOWN; | 85 | int result = STATE_UNKNOWN; |
| 86 | int i; | ||
| 87 | |||
| 88 | addresses = malloc (max_addr); | ||
| 84 | 89 | ||
| 85 | if (process_arguments (argc, argv) == ERROR) | 90 | if (process_arguments (argc, argv) == ERROR) |
| 86 | usage ("Could not parse arguments"); | 91 | usage ("Could not parse arguments"); |
| 87 | exit; | 92 | exit; |
| 88 | 93 | ||
| 89 | /* does the host address of number of packets argument come first? */ | ||
| 90 | #ifdef PING_PACKETS_FIRST | ||
| 91 | asprintf (&command_line, PING_COMMAND, max_packets, server_address); | ||
| 92 | #else | ||
| 93 | asprintf (&command_line, PING_COMMAND, server_address, max_packets); | ||
| 94 | #endif | ||
| 95 | |||
| 96 | /* Set signal handling and alarm */ | 94 | /* Set signal handling and alarm */ |
| 97 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { | 95 | if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { |
| 98 | printf ("Cannot catch SIGALRM"); | 96 | printf ("Cannot catch SIGALRM"); |
| @@ -102,43 +100,53 @@ main (int argc, char **argv) | |||
| 102 | /* handle timeouts gracefully */ | 100 | /* handle timeouts gracefully */ |
| 103 | alarm (timeout_interval); | 101 | alarm (timeout_interval); |
| 104 | 102 | ||
| 105 | if (verbose) | 103 | for (i = 0 ; i < n_addresses ; i++) { |
| 106 | printf ("%s ==> ", command_line); | ||
| 107 | 104 | ||
| 108 | /* run the command */ | 105 | /* does the host address of number of packets argument come first? */ |
| 109 | run_ping (command_line); | 106 | #ifdef PING_PACKETS_FIRST |
| 107 | asprintf (&command_line, PING_COMMAND, max_packets, addresses[i]); | ||
| 108 | #else | ||
| 109 | asprintf (&command_line, PING_COMMAND, addresses[i], max_packets); | ||
| 110 | #endif | ||
| 110 | 111 | ||
| 111 | if (pl == UNKNOWN_PACKET_LOSS || rta == UNKNOWN_TRIP_TIME) { | 112 | if (verbose) |
| 112 | printf ("%s\n", command_line); | 113 | printf ("%s ==> ", command_line); |
| 113 | terminate (STATE_UNKNOWN, | ||
| 114 | "Error: Could not interpret output from ping command\n"); | ||
| 115 | } | ||
| 116 | 114 | ||
| 117 | if (pl >= cpl || rta >= crta || rta < 0) | 115 | /* run the command */ |
| 118 | result = STATE_CRITICAL; | 116 | run_ping (command_line, addresses[i]); |
| 119 | else if (pl >= wpl || rta >= wrta) | 117 | |
| 120 | result = STATE_WARNING; | 118 | if (pl == UNKNOWN_PACKET_LOSS || rta == UNKNOWN_TRIP_TIME) { |
| 121 | else if (pl < wpl && rta < wrta && pl >= 0 && rta >= 0) | 119 | printf ("%s\n", command_line); |
| 122 | /* cannot use the max function because STATE_UNKNOWN is now 3 gt STATE_OK | 120 | terminate (STATE_UNKNOWN, |
| 123 | result = max (result, STATE_OK); */ | 121 | "Error: Could not interpret output from ping command\n"); |
| 124 | if( !( (result == STATE_WARNING) || (result == STATE_CRITICAL) ) ) { | ||
| 125 | result = STATE_OK; | ||
| 126 | } | 122 | } |
| 127 | |||
| 128 | if (display_html == TRUE) | ||
| 129 | printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, server_address); | ||
| 130 | if (pl == 100) | ||
| 131 | printf ("PING %s - %sPacket loss = %d%%", state_text (result), warn_text, | ||
| 132 | pl); | ||
| 133 | else | ||
| 134 | printf ("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms", | ||
| 135 | state_text (result), warn_text, pl, rta); | ||
| 136 | if (display_html == TRUE) | ||
| 137 | printf ("</A>"); | ||
| 138 | printf ("\n"); | ||
| 139 | 123 | ||
| 140 | if (verbose) | 124 | if (pl >= cpl || rta >= crta || rta < 0) |
| 141 | printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl); | 125 | result = STATE_CRITICAL; |
| 126 | else if (pl >= wpl || rta >= wrta) | ||
| 127 | result = STATE_WARNING; | ||
| 128 | else if (pl < wpl && rta < wrta && pl >= 0 && rta >= 0) | ||
| 129 | /* cannot use the max function because STATE_UNKNOWN is now 3 gt STATE_OK | ||
| 130 | result = max (result, STATE_OK); */ | ||
| 131 | if( !( (result == STATE_WARNING) || (result == STATE_CRITICAL) ) ) { | ||
| 132 | result = STATE_OK; | ||
| 133 | } | ||
| 134 | |||
| 135 | if (display_html == TRUE) | ||
| 136 | printf ("<A HREF='%s/traceroute.cgi?%s'>", CGIURL, addresses[i]); | ||
| 137 | if (pl == 100) | ||
| 138 | printf ("PING %s - %sPacket loss = %d%%", state_text (result), warn_text, | ||
| 139 | pl); | ||
| 140 | else | ||
| 141 | printf ("PING %s - %sPacket loss = %d%%, RTA = %2.2f ms", | ||
| 142 | state_text (result), warn_text, pl, rta); | ||
| 143 | if (display_html == TRUE) | ||
| 144 | printf ("</A>"); | ||
| 145 | printf ("\n"); | ||
| 146 | |||
| 147 | if (verbose) | ||
| 148 | printf ("%f:%d%% %f:%d%%\n", wrta, wpl, crta, cpl); | ||
| 149 | } | ||
| 142 | 150 | ||
| 143 | return result; | 151 | return result; |
| 144 | } | 152 | } |
| @@ -200,7 +208,14 @@ process_arguments (int argc, char **argv) | |||
| 200 | case 'H': /* hostname */ | 208 | case 'H': /* hostname */ |
| 201 | if (is_host (optarg) == FALSE) | 209 | if (is_host (optarg) == FALSE) |
| 202 | usage2 ("Invalid host name/address", optarg); | 210 | usage2 ("Invalid host name/address", optarg); |
| 203 | server_address = optarg; | 211 | n_addresses++; |
| 212 | if (n_addresses > max_addr) { | ||
| 213 | max_addr *= 2; | ||
| 214 | addresses = realloc (addresses, max_addr); | ||
| 215 | if (addresses == NULL) | ||
| 216 | terminate (STATE_UNKNOWN, "Could not realloc() addresses\n"); | ||
| 217 | } | ||
| 218 | addresses[n_addresses-1] = optarg; | ||
| 204 | break; | 219 | break; |
| 205 | case 'p': /* number of packets to send */ | 220 | case 'p': /* number of packets to send */ |
| 206 | if (is_intnonneg (optarg)) | 221 | if (is_intnonneg (optarg)) |
| @@ -227,12 +242,12 @@ process_arguments (int argc, char **argv) | |||
| 227 | if (c == argc) | 242 | if (c == argc) |
| 228 | return validate_arguments (); | 243 | return validate_arguments (); |
| 229 | 244 | ||
| 230 | if (server_address == NULL) { | 245 | if (addresses[0] == NULL) { |
| 231 | if (is_host (argv[c]) == FALSE) { | 246 | if (is_host (argv[c]) == FALSE) { |
| 232 | printf ("Invalid host name/address: %s\n\n", argv[c]); | 247 | printf ("Invalid host name/address: %s\n\n", argv[c]); |
| 233 | return ERROR; | 248 | return ERROR; |
| 234 | } else { | 249 | } else { |
| 235 | server_address = argv[c++]; | 250 | addresses[0] = argv[c++]; |
| 236 | if (c == argc) | 251 | if (c == argc) |
| 237 | return validate_arguments (); | 252 | return validate_arguments (); |
| 238 | } | 253 | } |
| @@ -349,7 +364,7 @@ validate_arguments () | |||
| 349 | 364 | ||
| 350 | 365 | ||
| 351 | int | 366 | int |
| 352 | run_ping (char *command_line) | 367 | run_ping (char *command_line, char *server_address) |
| 353 | { | 368 | { |
| 354 | char input_buffer[MAX_INPUT_BUFFER]; | 369 | char input_buffer[MAX_INPUT_BUFFER]; |
| 355 | int result = STATE_UNKNOWN; | 370 | int result = STATE_UNKNOWN; |
