summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2012-06-11 21:40:04 (GMT)
committerHolger Weiss <holger@zedat.fu-berlin.de>2012-06-11 21:40:04 (GMT)
commita80eafbf9cab9d80c526c504edf2ee4446a072d9 (patch)
tree505a6caeb312d63e8b2d9f1814c9b2e807258d51
parent4e9eedc8debe1388996bd5631f2df6e057854061 (diff)
downloadmonitoring-plugins-a80eafbf9cab9d80c526c504edf2ee4446a072d9.tar.gz
Improve parsing of ping6(1) output
The ping6(1) implementation provided by Debian's iputils-ping package may produce output such as the following: | 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2009ms There's a corresponding pattern in check_ping.c:458: | "%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss" Without this fix, the pattern in check_ping.c:456 matched first (as sscanf(3) interprets "+3" as a match for "%d"): | "%*d packets transmitted, %*d received, %d%% loss, time" (#1894850 - Debian bug report #514588 - Matej Vela)
-rw-r--r--NEWS1
-rw-r--r--THANKS.in1
-rw-r--r--plugins/check_ping.c36
3 files changed, 21 insertions, 17 deletions
diff --git a/NEWS b/NEWS
index dd47139..7452a6b 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,7 @@ This file documents the major additions and syntax changes between releases.
23 Fix check_procs where regex input of '|' would get displayed in output - now replaced with ',' 23 Fix check_procs where regex input of '|' would get displayed in output - now replaced with ','
24 Fix segfault in check_host when hostname returns multiple IP addresses (Sebastian Harl) 24 Fix segfault in check_host when hostname returns multiple IP addresses (Sebastian Harl)
25 Fix check_smtp and check_tcp where duplicate messages were displayed for certificate errors 25 Fix check_smtp and check_tcp where duplicate messages were displayed for certificate errors
26 Fix check_ping's parsing of the output of Debian's ping6(1) implementation (#1894850 - Matej Vela)
26 Disable RFC4507 support, to work around SSL negotiation issues with (at least) some Tomcat versions 27 Disable RFC4507 support, to work around SSL negotiation issues with (at least) some Tomcat versions
27 28
281.4.15 27th July 2010 291.4.15 27th July 2010
diff --git a/THANKS.in b/THANKS.in
index c858ce4..32a8868 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -272,3 +272,4 @@ Sebastian Harl
272Jason Lunn 272Jason Lunn
273Alex Griffin 273Alex Griffin
274Marc Remy 274Marc Remy
275Matej Vela
diff --git a/plugins/check_ping.c b/plugins/check_ping.c
index ecdd618..1367e90 100644
--- a/plugins/check_ping.c
+++ b/plugins/check_ping.c
@@ -432,6 +432,7 @@ run_ping (const char *cmd, const char *addr)
432{ 432{
433 char buf[MAX_INPUT_BUFFER]; 433 char buf[MAX_INPUT_BUFFER];
434 int result = STATE_UNKNOWN; 434 int result = STATE_UNKNOWN;
435 int match;
435 436
436 if ((child_process = spopen (cmd)) == NULL) 437 if ((child_process = spopen (cmd)) == NULL)
437 die (STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd); 438 die (STATE_UNKNOWN, _("Could not open pipe: %s\n"), cmd);
@@ -448,28 +449,29 @@ run_ping (const char *cmd, const char *addr)
448 result = max_state (result, error_scan (buf, addr)); 449 result = max_state (result, error_scan (buf, addr));
449 450
450 /* get the percent loss statistics */ 451 /* get the percent loss statistics */
451 if(sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss",&pl)==1 || 452 match = 0;
452 sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss", &pl) == 1 || 453 if((sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) ||
453 sscanf(buf,"%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss", &pl) == 1 || 454 (sscanf(buf,"%*d packets transmitted, %*d packets received, +%*d duplicates, %d%% packet loss%n",&pl,&match) && match) ||
454 sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% packet loss",&pl)==1 || 455 (sscanf(buf,"%*d packets transmitted, %*d received, +%*d duplicates, %d%% packet loss%n",&pl,&match) && match) ||
455 sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% loss, time",&pl)==1 || 456 (sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% packet loss%n",&pl,&match) && match) ||
456 sscanf(buf,"%*d packets transmitted, %*d received, %d%% loss, time", &pl)==1 || 457 (sscanf(buf,"%*d packets transmitted, %*d packets received, %d%% loss, time%n",&pl,&match) && match) ||
457 sscanf(buf,"%*d packets transmitted, %*d received, %d%% packet loss, time", &pl)==1 || 458 (sscanf(buf,"%*d packets transmitted, %*d received, %d%% loss, time%n",&pl,&match) && match) ||
458 sscanf(buf,"%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss", &pl) == 1 || 459 (sscanf(buf,"%*d packets transmitted, %*d received, %d%% packet loss, time%n",&pl,&match) && match) ||
459 sscanf(buf,"%*d packets transmitted %*d received, +%*d errors, %d%% packet loss", &pl) == 1 460 (sscanf(buf,"%*d packets transmitted, %*d received, +%*d errors, %d%% packet loss%n",&pl,&match) && match) ||
461 (sscanf(buf,"%*d packets transmitted %*d received, +%*d errors, %d%% packet loss%n",&pl,&match) && match)
460 ) 462 )
461 continue; 463 continue;
462 464
463 /* get the round trip average */ 465 /* get the round trip average */
464 else 466 else
465 if(sscanf(buf,"round-trip min/avg/max = %*f/%f/%*f",&rta)==1 || 467 if((sscanf(buf,"round-trip min/avg/max = %*f/%f/%*f%n",&rta,&match) && match) ||
466 sscanf(buf,"round-trip min/avg/max/mdev = %*f/%f/%*f/%*f",&rta)==1 || 468 (sscanf(buf,"round-trip min/avg/max/mdev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
467 sscanf(buf,"round-trip min/avg/max/sdev = %*f/%f/%*f/%*f",&rta)==1 || 469 (sscanf(buf,"round-trip min/avg/max/sdev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
468 sscanf(buf,"round-trip min/avg/max/stddev = %*f/%f/%*f/%*f",&rta)==1 || 470 (sscanf(buf,"round-trip min/avg/max/stddev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
469 sscanf(buf,"round-trip min/avg/max/std-dev = %*f/%f/%*f/%*f",&rta)==1 || 471 (sscanf(buf,"round-trip min/avg/max/std-dev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
470 sscanf(buf,"round-trip (ms) min/avg/max = %*f/%f/%*f",&rta)==1 || 472 (sscanf(buf,"round-trip (ms) min/avg/max = %*f/%f/%*f%n",&rta,&match) && match) ||
471 sscanf(buf,"round-trip (ms) min/avg/max/stddev = %*f/%f/%*f/%*f",&rta)==1 || 473 (sscanf(buf,"round-trip (ms) min/avg/max/stddev = %*f/%f/%*f/%*f%n",&rta,&match) && match) ||
472 sscanf(buf,"rtt min/avg/max/mdev = %*f/%f/%*f/%*f ms",&rta)==1) 474 (sscanf(buf,"rtt min/avg/max/mdev = %*f/%f/%*f/%*f ms%n",&rta,&match) && match))
473 continue; 475 continue;
474 } 476 }
475 477