diff options
author | Benoit Mortier <opensides@users.sourceforge.net> | 2004-12-24 18:06:05 (GMT) |
---|---|---|
committer | Benoit Mortier <opensides@users.sourceforge.net> | 2004-12-24 18:06:05 (GMT) |
commit | d8de534e9fa654b3211497bd62b421e2edd8e9c1 (patch) | |
tree | ebd9b89325a3c8f6edb0469ae8a00ac5d094dd15 /plugins/check_icmp.c | |
parent | 31713f6886512cfe9c5472b21a42203331a88200 (diff) | |
download | monitoring-plugins-d8de534e9fa654b3211497bd62b421e2edd8e9c1.tar.gz |
first pass at adapting to plugin guidelines
and start of localization
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1057 f882894a-f735-0410-b71e-b25c423dba1c
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 361e924..cbd6864 100644 --- a/plugins/check_icmp.c +++ b/plugins/check_icmp.c | |||
@@ -21,6 +21,15 @@ | |||
21 | * The fping website can be found at http://www.fping.com | 21 | * The fping website can be found at http://www.fping.com |
22 | */ | 22 | */ |
23 | 23 | ||
24 | const char *progname = "check_icmp"; | ||
25 | const char *revision = "$Revision$"; | ||
26 | const char *copyright = "2004"; | ||
27 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | ||
28 | |||
29 | #include "common.h" | ||
30 | #include "netutils.h" | ||
31 | #include "utils.h" | ||
32 | |||
24 | #include <stdio.h> | 33 | #include <stdio.h> |
25 | #include <errno.h> | 34 | #include <errno.h> |
26 | #include <time.h> | 35 | #include <time.h> |
@@ -66,8 +75,8 @@ extern char *optarg; | |||
66 | extern int optind, opterr; | 75 | extern int optind, opterr; |
67 | 76 | ||
68 | /*** Constants ***/ | 77 | /*** Constants ***/ |
69 | #define EMAIL "ae@op5.se" | 78 | //#define EMAIL "ae@op5.se" |
70 | #define VERSION "0.8.1" | 79 | //#define VERSION "0.8.1" |
71 | 80 | ||
72 | #ifndef INADDR_NONE | 81 | #ifndef INADDR_NONE |
73 | # define INADDR_NONE 0xffffffU | 82 | # define INADDR_NONE 0xffffffU |
@@ -219,9 +228,9 @@ int num_pingsent = 0; /* total pings sent */ | |||
219 | int num_pingreceived = 0; /* total pings received */ | 228 | int num_pingreceived = 0; /* total pings received */ |
220 | int num_othericmprcvd = 0; /* total non-echo-reply ICMP received */ | 229 | int num_othericmprcvd = 0; /* total non-echo-reply ICMP received */ |
221 | 230 | ||
222 | struct timeval current_time; /* current time (pseudo) */ | 231 | struct timeval current_time; /* current time (pseudo) */ |
223 | struct timeval start_time; | 232 | struct timeval my_start_time; /* conflict with utils.c 33, but not found ?? */ |
224 | struct timeval end_time; | 233 | struct timeval my_end_time; /* conflict with utils.c 33, but not found ?? */ |
225 | struct timeval last_send_time; /* time last ping was sent */ | 234 | struct timeval last_send_time; /* time last ping was sent */ |
226 | struct timezone tz; | 235 | struct timezone tz; |
227 | 236 | ||
@@ -245,23 +254,29 @@ int recvfrom_wto(int, char *, int, struct sockaddr *, int); | |||
245 | void remove_job(HOST_ENTRY *); | 254 | void remove_job(HOST_ENTRY *); |
246 | void send_ping(int, HOST_ENTRY *); | 255 | void send_ping(int, HOST_ENTRY *); |
247 | long timeval_diff(struct timeval *, struct timeval *); | 256 | long timeval_diff(struct timeval *, struct timeval *); |
248 | void usage(void); | 257 | //void usage(void); |
249 | int wait_for_reply(int); | 258 | int wait_for_reply(int); |
250 | void finish(void); | 259 | void finish(void); |
251 | int handle_random_icmp(struct icmp *, struct sockaddr_in *); | 260 | int handle_random_icmp(struct icmp *, struct sockaddr_in *); |
252 | char *sprint_tm(int); | 261 | char *sprint_tm(int); |
253 | int get_threshold(char *, threshold *); | 262 | int get_threshold(char *, threshold *); |
254 | 263 | ||
264 | /* common functions */ | ||
265 | void print_help (void); | ||
266 | void print_usage (void); | ||
267 | |||
255 | /*** the various exit-states */ | 268 | /*** the various exit-states */ |
256 | enum { | 269 | /*enum { |
257 | STATE_OK = 0, | 270 | STATE_OK = 0, |
258 | STATE_WARNING, | 271 | STATE_WARNING, |
259 | STATE_CRITICAL, | 272 | STATE_CRITICAL, |
260 | STATE_UNKNOWN, | 273 | STATE_UNKNOWN, |
261 | STATE_DEPENDANT, | 274 | STATE_DEPENDANT, |
262 | STATE_OOB | 275 | STATE_OOB |
263 | }; | 276 | };*/ |
277 | |||
264 | /* the strings that correspond to them */ | 278 | /* the strings that correspond to them */ |
279 | /* | ||
265 | char *status_string[STATE_OOB] = { | 280 | char *status_string[STATE_OOB] = { |
266 | "OK", | 281 | "OK", |
267 | "WARNING", | 282 | "WARNING", |
@@ -269,6 +284,7 @@ char *status_string[STATE_OOB] = { | |||
269 | "UNKNOWN", | 284 | "UNKNOWN", |
270 | "DEPENDANT" | 285 | "DEPENDANT" |
271 | }; | 286 | }; |
287 | */ | ||
272 | 288 | ||
273 | int status = STATE_OK; | 289 | int status = STATE_OK; |
274 | int fin_stat = STATE_OK; | 290 | int fin_stat = STATE_OK; |
@@ -288,6 +304,10 @@ int main(int argc, char **argv) | |||
288 | if(strchr(argv[0], '/')) prog = strrchr(argv[0], '/') + 1; | 304 | if(strchr(argv[0], '/')) prog = strrchr(argv[0], '/') + 1; |
289 | else prog = argv[0]; | 305 | else prog = argv[0]; |
290 | 306 | ||
307 | setlocale (LC_ALL, ""); | ||
308 | bindtextdomain (PACKAGE, LOCALEDIR); | ||
309 | textdomain (PACKAGE); | ||
310 | |||
291 | /* check if we are root */ | 311 | /* check if we are root */ |
292 | if(geteuid()) { | 312 | if(geteuid()) { |
293 | printf("Root access needed (for raw sockets)\n"); | 313 | printf("Root access needed (for raw sockets)\n"); |
@@ -309,7 +329,7 @@ int main(int argc, char **argv) | |||
309 | seteuid(uid); | 329 | seteuid(uid); |
310 | } | 330 | } |
311 | 331 | ||
312 | if(argc < 2) usage(); | 332 | if(argc < 2) print_usage(); |
313 | 333 | ||
314 | ident = getpid() & 0xFFFF; | 334 | ident = getpid() & 0xFFFF; |
315 | 335 | ||
@@ -356,35 +376,35 @@ int main(int argc, char **argv) | |||
356 | case 'w': | 376 | case 'w': |
357 | if(get_threshold(optarg, &warn)) { | 377 | if(get_threshold(optarg, &warn)) { |
358 | printf("Illegal threshold pair specified for -%c", c); | 378 | printf("Illegal threshold pair specified for -%c", c); |
359 | usage(); | 379 | print_usage(); |
360 | } | 380 | } |
361 | break; | 381 | break; |
362 | 382 | ||
363 | case 'c': | 383 | case 'c': |
364 | if(get_threshold(optarg, &crit)) { | 384 | if(get_threshold(optarg, &crit)) { |
365 | printf("Illegal threshold pair specified for -%c", c); | 385 | printf("Illegal threshold pair specified for -%c", c); |
366 | usage(); | 386 | print_usage(); |
367 | } | 387 | } |
368 | break; | 388 | break; |
369 | 389 | ||
370 | case 't': | 390 | case 't': |
371 | if(!(timeout = (u_int) strtoul(optarg, NULL, 0) * 100)) { | 391 | if(!(timeout = (u_int) strtoul(optarg, NULL, 0) * 100)) { |
372 | printf("option -%c requires integer argument\n", c); | 392 | printf("option -%c requires integer argument\n", c); |
373 | usage(); | 393 | print_usage(); |
374 | } | 394 | } |
375 | break; | 395 | break; |
376 | 396 | ||
377 | case 'r': | 397 | case 'r': |
378 | if(!(retry = (u_int) strtoul(optarg, NULL, 0))) { | 398 | if(!(retry = (u_int) strtoul(optarg, NULL, 0))) { |
379 | printf("option -%c requires integer argument\n", c); | 399 | printf("option -%c requires integer argument\n", c); |
380 | usage(); | 400 | print_usage(); |
381 | } | 401 | } |
382 | break; | 402 | break; |
383 | 403 | ||
384 | case 'i': | 404 | case 'i': |
385 | if(!(interval = (u_int) strtoul(optarg, NULL, 0) * 100)) { | 405 | if(!(interval = (u_int) strtoul(optarg, NULL, 0) * 100)) { |
386 | printf("option -%c requires positive non-zero integer argument\n", c); | 406 | printf("option -%c requires positive non-zero integer argument\n", c); |
387 | usage(); | 407 | print_usage(); |
388 | } | 408 | } |
389 | break; | 409 | break; |
390 | 410 | ||
@@ -392,19 +412,19 @@ int main(int argc, char **argv) | |||
392 | case 'n': | 412 | case 'n': |
393 | if(!(count = (u_int) strtoul(optarg, NULL, 0))) { | 413 | if(!(count = (u_int) strtoul(optarg, NULL, 0))) { |
394 | printf("option -%c requires positive non-zero integer argument\n", c); | 414 | printf("option -%c requires positive non-zero integer argument\n", c); |
395 | usage(); | 415 | print_usage(); |
396 | } | 416 | } |
397 | break; | 417 | break; |
398 | 418 | ||
399 | case 'b': | 419 | case 'b': |
400 | if(!(ping_data_size = (u_int) strtoul(optarg, NULL, 0))) { | 420 | if(!(ping_data_size = (u_int) strtoul(optarg, NULL, 0))) { |
401 | printf("option -%c requires integer argument\n", c); | 421 | printf("option -%c requires integer argument\n", c); |
402 | usage(); | 422 | print_usage(); |
403 | } | 423 | } |
404 | break; | 424 | break; |
405 | 425 | ||
406 | case 'h': | 426 | case 'h': |
407 | usage(); | 427 | print_usage(); |
408 | break; | 428 | break; |
409 | 429 | ||
410 | case 'e': | 430 | case 'e': |
@@ -437,7 +457,7 @@ int main(int argc, char **argv) | |||
437 | 457 | ||
438 | case 'v': | 458 | case 'v': |
439 | printf("%s: Version %s $Date$\n", prog, VERSION); | 459 | printf("%s: Version %s $Date$\n", prog, VERSION); |
440 | printf("%s: comments to %s\n", prog, EMAIL); | 460 | printf("%s: comments to %s\n", prog, email); |
441 | exit(STATE_OK); | 461 | exit(STATE_OK); |
442 | 462 | ||
443 | case 'g': | 463 | case 'g': |
@@ -448,7 +468,7 @@ int main(int argc, char **argv) | |||
448 | 468 | ||
449 | default: | 469 | default: |
450 | printf("option flag -%c specified, but not recognized\n", c); | 470 | printf("option flag -%c specified, but not recognized\n", c); |
451 | usage(); | 471 | print_usage(); |
452 | break; | 472 | break; |
453 | } | 473 | } |
454 | } | 474 | } |
@@ -479,27 +499,27 @@ int main(int argc, char **argv) | |||
479 | prog, MIN_INTERVAL, MAX_RETRY); | 499 | prog, MIN_INTERVAL, MAX_RETRY); |
480 | printf("Current settings; i = %d, r = %d\n", | 500 | printf("Current settings; i = %d, r = %d\n", |
481 | interval / 100, retry); | 501 | interval / 100, retry); |
482 | usage(); | 502 | print_usage(); |
483 | } | 503 | } |
484 | 504 | ||
485 | if((ping_data_size > MAX_PING_DATA) || (ping_data_size < MIN_PING_DATA)) { | 505 | if((ping_data_size > MAX_PING_DATA) || (ping_data_size < MIN_PING_DATA)) { |
486 | printf("%s: data size %u not valid, must be between %u and %u\n", | 506 | printf("%s: data size %u not valid, must be between %u and %u\n", |
487 | prog, ping_data_size, MIN_PING_DATA, MAX_PING_DATA); | 507 | prog, ping_data_size, MIN_PING_DATA, MAX_PING_DATA); |
488 | usage(); | 508 | print_usage(); |
489 | 509 | ||
490 | } | 510 | } |
491 | 511 | ||
492 | if((backoff > MAX_BACKOFF_FACTOR) || (backoff < MIN_BACKOFF_FACTOR)) { | 512 | if((backoff > MAX_BACKOFF_FACTOR) || (backoff < MIN_BACKOFF_FACTOR)) { |
493 | printf("%s: backoff factor %.1f not valid, must be between %.1f and %.1f\n", | 513 | printf("%s: backoff factor %.1f not valid, must be between %.1f and %.1f\n", |
494 | prog, backoff, MIN_BACKOFF_FACTOR, MAX_BACKOFF_FACTOR); | 514 | prog, backoff, MIN_BACKOFF_FACTOR, MAX_BACKOFF_FACTOR); |
495 | usage(); | 515 | print_usage(); |
496 | 516 | ||
497 | } | 517 | } |
498 | 518 | ||
499 | if(count > MAX_COUNT) { | 519 | if(count > MAX_COUNT) { |
500 | printf("%s: count %u not valid, must be less than %u\n", | 520 | printf("%s: count %u not valid, must be less than %u\n", |
501 | prog, count, MAX_COUNT); | 521 | prog, count, MAX_COUNT); |
502 | usage(); | 522 | print_usage(); |
503 | } | 523 | } |
504 | 524 | ||
505 | if(count_flag) { | 525 | if(count_flag) { |
@@ -517,7 +537,7 @@ int main(int argc, char **argv) | |||
517 | /* generate requires command line parameters beyond the switches */ | 537 | /* generate requires command line parameters beyond the switches */ |
518 | if(generate_flag && !*argv) { | 538 | if(generate_flag && !*argv) { |
519 | printf("generate flag requires command line parameters beyond switches\n"); | 539 | printf("generate flag requires command line parameters beyond switches\n"); |
520 | usage(); | 540 | print_usage(); |
521 | } | 541 | } |
522 | 542 | ||
523 | if(*argv && !generate_flag) { | 543 | if(*argv && !generate_flag) { |
@@ -546,7 +566,7 @@ int main(int argc, char **argv) | |||
546 | 566 | ||
547 | if(!num_hosts) { | 567 | if(!num_hosts) { |
548 | printf("No hosts to work with!\n\n"); | 568 | printf("No hosts to work with!\n\n"); |
549 | usage(); | 569 | print_usage(); |
550 | } | 570 | } |
551 | 571 | ||
552 | /* allocate array to hold outstanding ping requests */ | 572 | /* allocate array to hold outstanding ping requests */ |
@@ -566,8 +586,8 @@ int main(int argc, char **argv) | |||
566 | 586 | ||
567 | signal(SIGINT, (void *)finish); | 587 | signal(SIGINT, (void *)finish); |
568 | 588 | ||
569 | gettimeofday(&start_time, &tz); | 589 | gettimeofday(&my_start_time, &tz); |
570 | current_time = start_time; | 590 | current_time = my_start_time; |
571 | 591 | ||
572 | last_send_time.tv_sec = current_time.tv_sec - 10000; | 592 | last_send_time.tv_sec = current_time.tv_sec - 10000; |
573 | 593 | ||
@@ -666,7 +686,7 @@ void finish() | |||
666 | int i; | 686 | int i; |
667 | HOST_ENTRY *h; | 687 | HOST_ENTRY *h; |
668 | 688 | ||
669 | gettimeofday(&end_time, &tz); | 689 | gettimeofday(&my_end_time, &tz); |
670 | 690 | ||
671 | /* tot up unreachables */ | 691 | /* tot up unreachables */ |
672 | for(i=0; i<num_hosts; i++) { | 692 | for(i=0; i<num_hosts; i++) { |
@@ -712,7 +732,7 @@ void finish() | |||
712 | 732 | ||
713 | if(num_hosts == 1 || status != STATE_OK) { | 733 | if(num_hosts == 1 || status != STATE_OK) { |
714 | printf("%s - %s: rta %s ms, lost %d%%", | 734 | printf("%s - %s: rta %s ms, lost %d%%", |
715 | status_string[status], h->host, | 735 | state_text(status), h->host, |
716 | sprint_tm(h->total_time / h->num_recv), | 736 | sprint_tm(h->total_time / h->num_recv), |
717 | h->num_sent > 0 ? ((h->num_sent - h->num_recv) * 100) / h->num_sent : 0 | 737 | h->num_sent > 0 ? ((h->num_sent - h->num_recv) * 100) / h->num_sent : 0 |
718 | ); | 738 | ); |
@@ -735,7 +755,7 @@ void finish() | |||
735 | 755 | ||
736 | if(num_noaddress) { | 756 | if(num_noaddress) { |
737 | printf("No hostaddress specified.\n"); | 757 | printf("No hostaddress specified.\n"); |
738 | usage(); | 758 | print_usage(); |
739 | } | 759 | } |
740 | else if(num_alive != num_hosts) { | 760 | else if(num_alive != num_hosts) { |
741 | /* for future multi-check support */ | 761 | /* for future multi-check support */ |
@@ -1340,37 +1360,57 @@ int get_threshold(char *str, threshold *th) | |||
1340 | return 0; | 1360 | return 0; |
1341 | } | 1361 | } |
1342 | 1362 | ||
1343 | /* make a blahblah */ | 1363 | void |
1344 | void usage(void) | 1364 | print_help (void) |
1345 | { | 1365 | { |
1346 | printf("\nUsage: %s [options] [targets]\n", prog); | 1366 | print_revision (progname, revision); |
1347 | printf(" -H host target host\n"); | 1367 | |
1348 | printf(" -b n ping packet size in bytes (default %d)\n", ping_data_size); | 1368 | printf ("Copyright (c) 2004 Andreas Ericsson <ae@op5.se>\n"); |
1349 | printf(" -n|p n number of pings to send to each target (default %d)\n", count); | 1369 | printf (COPYRIGHT, copyright, email); |
1350 | printf(" -r n number of retries (default %d)\n", retry); | 1370 | |
1351 | printf(" -t n timeout value (in msec) (default %d)\n", timeout / 100); | 1371 | printf (_("This plugin will check hosts sending icmp pings\n\n")); |
1352 | printf(" -i n packet interval (in msec) (default %d)\n", DEFAULT_INTERVAL); | 1372 | |
1353 | /* XXX - possibly on todo-list | 1373 | print_usage (); |
1354 | printf(" -m ping multiple interfaces on target host\n"); | 1374 | |
1355 | printf(" -a show targets that are alive\n"); | 1375 | printf (_(UT_HELP_VRSN)); |
1356 | printf(" -d show dead targets\n"); | 1376 | |
1357 | */ printf(" -v show version\n"); | 1377 | printf (_("\ |
1358 | printf(" -D increase debug output level\n"); | 1378 | -H, \n\ |
1359 | printf(" -w warning threshold pair, given as RTA[ums],PL[%%]\n"); | 1379 | Host name argument for servers\n\ |
1360 | printf(" -c critical threshold pair, given as RTA[ums],PL[%%]\n"); | 1380 | -b \n\ |
1361 | printf("\n"); | 1381 | ping packet size in bytes (default %d)\n\ |
1362 | printf("Note:\n"); | 1382 | -n \n\ |
1363 | printf("* This program requires root privileges to run properly.\n"); | 1383 | number of pings to send to each target (default %d)\n\ |
1364 | printf(" If it is run as setuid root it will halt with an error if;\n"); | 1384 | -r \n\ |
1365 | printf(" interval < 25 || retries > 5\n\n"); | 1385 | number of retries (default %d)\n\ |
1366 | printf("* Threshold pairs are given as such;\n"); | 1386 | -t \n\ |
1367 | printf(" 100,40%%\n"); | 1387 | timeout value (in msec) (default %d)\n\ |
1368 | printf(" to set a threshold value pair of 100 milliseconds and 40%% packetloss\n"); | 1388 | -i \n\ |
1369 | printf(" The '%%' sign is optional, and if rta value is suffixed by;\n"); | 1389 | packet interval (in msec) (default %d)\n\ |
1370 | printf(" s, rta time is set in seconds\n"); | 1390 | -w \n\ |
1371 | printf(" m, rta time will be set in milliseconds (this is default)\n"); | 1391 | warning threshold pair, given as RTA[ums],PL[%%]\n\ |
1372 | printf(" u, rta time will be set in microseconds\n"); | 1392 | -c \n\ |
1373 | printf(" Decimal points are silently ignored for sideways compatibility.\n"); | 1393 | critical threshold pair, given as RTA[ums],PL[%%]\n\ |
1374 | printf("\n"); | 1394 | -D \n\ |
1375 | exit(3); | 1395 | increase debug output level\n\n"),ping_data_size,count,retry,(timeout / 100),DEFAULT_INTERVAL); |
1376 | } /* usage() */ | 1396 | |
1397 | printf (_(UT_WARN_CRIT)); | ||
1398 | |||
1399 | printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT); | ||
1400 | |||
1401 | printf (_(UT_VERBOSE)); | ||
1402 | |||
1403 | // printf (_("This plugin will check hosts sending icmp pings\n")); | ||
1404 | |||
1405 | printf (_(UT_SUPPORT)); | ||
1406 | } | ||
1407 | |||
1408 | void | ||
1409 | print_usage (void) | ||
1410 | { | ||
1411 | printf ("\ | ||
1412 | Usage: %s -H <vhost> | [-b <ping packet size in bytes>] [-n <number of pings>]\n\ | ||
1413 | [-r <number of retries>] [-t <timeout>] [-i packet interval]\n\ | ||
1414 | [-w <warning threshold>] [-c <critical threshold>]\n\ | ||
1415 | [-D <debug>] \n", progname); | ||
1416 | } | ||