diff options
Diffstat (limited to 'plugins/check_icmp.c')
-rw-r--r-- | plugins/check_icmp.c | 166 |
1 files changed, 103 insertions, 63 deletions
diff --git a/plugins/check_icmp.c b/plugins/check_icmp.c index 361e924e..cbd68642 100644 --- a/plugins/check_icmp.c +++ b/plugins/check_icmp.c @@ -21,6 +21,15 @@ * The fping website can be found at http://www.fping.com */ +const char *progname = "check_icmp"; +const char *revision = "$Revision$"; +const char *copyright = "2004"; +const char *email = "nagiosplug-devel@lists.sourceforge.net"; + +#include "common.h" +#include "netutils.h" +#include "utils.h" + #include <stdio.h> #include <errno.h> #include <time.h> @@ -66,8 +75,8 @@ extern char *optarg; extern int optind, opterr; /*** Constants ***/ -#define EMAIL "ae@op5.se" -#define VERSION "0.8.1" +//#define EMAIL "ae@op5.se" +//#define VERSION "0.8.1" #ifndef INADDR_NONE # define INADDR_NONE 0xffffffU @@ -219,9 +228,9 @@ int num_pingsent = 0; /* total pings sent */ int num_pingreceived = 0; /* total pings received */ int num_othericmprcvd = 0; /* total non-echo-reply ICMP received */ -struct timeval current_time; /* current time (pseudo) */ -struct timeval start_time; -struct timeval end_time; +struct timeval current_time; /* current time (pseudo) */ +struct timeval my_start_time; /* conflict with utils.c 33, but not found ?? */ +struct timeval my_end_time; /* conflict with utils.c 33, but not found ?? */ struct timeval last_send_time; /* time last ping was sent */ struct timezone tz; @@ -245,23 +254,29 @@ int recvfrom_wto(int, char *, int, struct sockaddr *, int); void remove_job(HOST_ENTRY *); void send_ping(int, HOST_ENTRY *); long timeval_diff(struct timeval *, struct timeval *); -void usage(void); +//void usage(void); int wait_for_reply(int); void finish(void); int handle_random_icmp(struct icmp *, struct sockaddr_in *); char *sprint_tm(int); int get_threshold(char *, threshold *); +/* common functions */ +void print_help (void); +void print_usage (void); + /*** the various exit-states */ -enum { +/*enum { STATE_OK = 0, STATE_WARNING, STATE_CRITICAL, STATE_UNKNOWN, STATE_DEPENDANT, STATE_OOB -}; +};*/ + /* the strings that correspond to them */ +/* char *status_string[STATE_OOB] = { "OK", "WARNING", @@ -269,6 +284,7 @@ char *status_string[STATE_OOB] = { "UNKNOWN", "DEPENDANT" }; +*/ int status = STATE_OK; int fin_stat = STATE_OK; @@ -288,6 +304,10 @@ int main(int argc, char **argv) if(strchr(argv[0], '/')) prog = strrchr(argv[0], '/') + 1; else prog = argv[0]; + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + /* check if we are root */ if(geteuid()) { printf("Root access needed (for raw sockets)\n"); @@ -309,7 +329,7 @@ int main(int argc, char **argv) seteuid(uid); } - if(argc < 2) usage(); + if(argc < 2) print_usage(); ident = getpid() & 0xFFFF; @@ -356,35 +376,35 @@ int main(int argc, char **argv) case 'w': if(get_threshold(optarg, &warn)) { printf("Illegal threshold pair specified for -%c", c); - usage(); + print_usage(); } break; case 'c': if(get_threshold(optarg, &crit)) { printf("Illegal threshold pair specified for -%c", c); - usage(); + print_usage(); } break; case 't': if(!(timeout = (u_int) strtoul(optarg, NULL, 0) * 100)) { printf("option -%c requires integer argument\n", c); - usage(); + print_usage(); } break; case 'r': if(!(retry = (u_int) strtoul(optarg, NULL, 0))) { printf("option -%c requires integer argument\n", c); - usage(); + print_usage(); } break; case 'i': if(!(interval = (u_int) strtoul(optarg, NULL, 0) * 100)) { printf("option -%c requires positive non-zero integer argument\n", c); - usage(); + print_usage(); } break; @@ -392,19 +412,19 @@ int main(int argc, char **argv) case 'n': if(!(count = (u_int) strtoul(optarg, NULL, 0))) { printf("option -%c requires positive non-zero integer argument\n", c); - usage(); + print_usage(); } break; case 'b': if(!(ping_data_size = (u_int) strtoul(optarg, NULL, 0))) { printf("option -%c requires integer argument\n", c); - usage(); + print_usage(); } break; case 'h': - usage(); + print_usage(); break; case 'e': @@ -437,7 +457,7 @@ int main(int argc, char **argv) case 'v': printf("%s: Version %s $Date$\n", prog, VERSION); - printf("%s: comments to %s\n", prog, EMAIL); + printf("%s: comments to %s\n", prog, email); exit(STATE_OK); case 'g': @@ -448,7 +468,7 @@ int main(int argc, char **argv) default: printf("option flag -%c specified, but not recognized\n", c); - usage(); + print_usage(); break; } } @@ -479,27 +499,27 @@ int main(int argc, char **argv) prog, MIN_INTERVAL, MAX_RETRY); printf("Current settings; i = %d, r = %d\n", interval / 100, retry); - usage(); + print_usage(); } if((ping_data_size > MAX_PING_DATA) || (ping_data_size < MIN_PING_DATA)) { printf("%s: data size %u not valid, must be between %u and %u\n", prog, ping_data_size, MIN_PING_DATA, MAX_PING_DATA); - usage(); + print_usage(); } if((backoff > MAX_BACKOFF_FACTOR) || (backoff < MIN_BACKOFF_FACTOR)) { printf("%s: backoff factor %.1f not valid, must be between %.1f and %.1f\n", prog, backoff, MIN_BACKOFF_FACTOR, MAX_BACKOFF_FACTOR); - usage(); + print_usage(); } if(count > MAX_COUNT) { printf("%s: count %u not valid, must be less than %u\n", prog, count, MAX_COUNT); - usage(); + print_usage(); } if(count_flag) { @@ -517,7 +537,7 @@ int main(int argc, char **argv) /* generate requires command line parameters beyond the switches */ if(generate_flag && !*argv) { printf("generate flag requires command line parameters beyond switches\n"); - usage(); + print_usage(); } if(*argv && !generate_flag) { @@ -546,7 +566,7 @@ int main(int argc, char **argv) if(!num_hosts) { printf("No hosts to work with!\n\n"); - usage(); + print_usage(); } /* allocate array to hold outstanding ping requests */ @@ -566,8 +586,8 @@ int main(int argc, char **argv) signal(SIGINT, (void *)finish); - gettimeofday(&start_time, &tz); - current_time = start_time; + gettimeofday(&my_start_time, &tz); + current_time = my_start_time; last_send_time.tv_sec = current_time.tv_sec - 10000; @@ -666,7 +686,7 @@ void finish() int i; HOST_ENTRY *h; - gettimeofday(&end_time, &tz); + gettimeofday(&my_end_time, &tz); /* tot up unreachables */ for(i=0; i<num_hosts; i++) { @@ -712,7 +732,7 @@ void finish() if(num_hosts == 1 || status != STATE_OK) { printf("%s - %s: rta %s ms, lost %d%%", - status_string[status], h->host, + state_text(status), h->host, sprint_tm(h->total_time / h->num_recv), h->num_sent > 0 ? ((h->num_sent - h->num_recv) * 100) / h->num_sent : 0 ); @@ -735,7 +755,7 @@ void finish() if(num_noaddress) { printf("No hostaddress specified.\n"); - usage(); + print_usage(); } else if(num_alive != num_hosts) { /* for future multi-check support */ @@ -1340,37 +1360,57 @@ int get_threshold(char *str, threshold *th) return 0; } -/* make a blahblah */ -void usage(void) +void +print_help (void) { - printf("\nUsage: %s [options] [targets]\n", prog); - printf(" -H host target host\n"); - printf(" -b n ping packet size in bytes (default %d)\n", ping_data_size); - printf(" -n|p n number of pings to send to each target (default %d)\n", count); - printf(" -r n number of retries (default %d)\n", retry); - printf(" -t n timeout value (in msec) (default %d)\n", timeout / 100); - printf(" -i n packet interval (in msec) (default %d)\n", DEFAULT_INTERVAL); -/* XXX - possibly on todo-list - printf(" -m ping multiple interfaces on target host\n"); - printf(" -a show targets that are alive\n"); - printf(" -d show dead targets\n"); -*/ printf(" -v show version\n"); - printf(" -D increase debug output level\n"); - printf(" -w warning threshold pair, given as RTA[ums],PL[%%]\n"); - printf(" -c critical threshold pair, given as RTA[ums],PL[%%]\n"); - printf("\n"); - printf("Note:\n"); - printf("* This program requires root privileges to run properly.\n"); - printf(" If it is run as setuid root it will halt with an error if;\n"); - printf(" interval < 25 || retries > 5\n\n"); - printf("* Threshold pairs are given as such;\n"); - printf(" 100,40%%\n"); - printf(" to set a threshold value pair of 100 milliseconds and 40%% packetloss\n"); - printf(" The '%%' sign is optional, and if rta value is suffixed by;\n"); - printf(" s, rta time is set in seconds\n"); - printf(" m, rta time will be set in milliseconds (this is default)\n"); - printf(" u, rta time will be set in microseconds\n"); - printf(" Decimal points are silently ignored for sideways compatibility.\n"); - printf("\n"); - exit(3); -} /* usage() */ + print_revision (progname, revision); + + printf ("Copyright (c) 2004 Andreas Ericsson <ae@op5.se>\n"); + printf (COPYRIGHT, copyright, email); + + printf (_("This plugin will check hosts sending icmp pings\n\n")); + + print_usage (); + + printf (_(UT_HELP_VRSN)); + + printf (_("\ + -H, \n\ + Host name argument for servers\n\ + -b \n\ + ping packet size in bytes (default %d)\n\ + -n \n\ + number of pings to send to each target (default %d)\n\ + -r \n\ + number of retries (default %d)\n\ + -t \n\ + timeout value (in msec) (default %d)\n\ + -i \n\ + packet interval (in msec) (default %d)\n\ + -w \n\ + warning threshold pair, given as RTA[ums],PL[%%]\n\ + -c \n\ + critical threshold pair, given as RTA[ums],PL[%%]\n\ + -D \n\ + increase debug output level\n\n"),ping_data_size,count,retry,(timeout / 100),DEFAULT_INTERVAL); + + printf (_(UT_WARN_CRIT)); + + printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); + + printf (_(UT_VERBOSE)); + +// printf (_("This plugin will check hosts sending icmp pings\n")); + + printf (_(UT_SUPPORT)); +} + +void +print_usage (void) +{ + printf ("\ +Usage: %s -H <vhost> | [-b <ping packet size in bytes>] [-n <number of pings>]\n\ + [-r <number of retries>] [-t <timeout>] [-i packet interval]\n\ + [-w <warning threshold>] [-c <critical threshold>]\n\ + [-D <debug>] \n", progname); +} |