add logic to check multiple servers

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@361 f882894a-f735-0410-b71e-b25c423dba1c
This commit is contained in:
Karl DeBisschop 2003-03-02 06:01:18 +00:00
parent eb47d294c6
commit 2789d11698

View 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 ()
int
run_ping (char *command_line)
run_ping (char *command_line, char *server_address)
{
char input_buffer[MAX_INPUT_BUFFER];
int result = STATE_UNKNOWN;