From a2eb4e8210deb37133ece1e6e94aad4e6c5bea14 Mon Sep 17 00:00:00 2001 From: Oliver Skibbe Date: Mon, 28 Sep 2015 14:22:09 +0200 Subject: * check_ping: added option for packet size - added option (-s/--packetsize) for setting packet size (limited to 65528 Bytes, according to RFC791) - added DEFAULT_PACKET_SIZE constant with 56 Bytes) - disabled ping check for UnixWare in autoconf: if condition and with_ping_command had different syntax --- configure.ac | 37 ++++++++++++++++++++++++++++++++----- plugins/check_ping.c | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index dfc37b5e..5e2a0b38 100644 --- a/configure.ac +++ b/configure.ac @@ -1079,6 +1079,7 @@ AC_ARG_WITH(ping_command, AC_MSG_CHECKING(for ICMP ping syntax) ac_cv_ping_packets_first=no ac_cv_ping_has_timeout=no +ac_cv_ping_has_packetsize=no if test -n "$with_ping_command" then AC_MSG_RESULT([(command-line) $with_ping_command]) @@ -1102,12 +1103,22 @@ then ac_cv_ping_has_timeout=yes AC_MSG_RESULT([$with_ping_command]) -elif [[ "z$ac_cv_uname_s" = "zUnixWare" ]] && \ - $PATH_TO_PING -n -s 127.0.0.1 56 1 2>/dev/null | \ +# XXX with_ping_command not same like if condition +#elif [[ "z$ac_cv_uname_s" = "zUnixWare" ]] && \ +# $PATH_TO_PING -n -s 127.0.0.1 56 1 2>/dev/null | \ +# egrep -i "^round-trip|^rtt" >/dev/null +#then +# with_ping_command="$PATH_TO_PING -n -U -c %d %s" +# ac_cv_ping_packets_first=yes +# AC_MSG_RESULT([$with_ping_command]) + +elif $PATH_TO_PING -n -U -w 10 -c 1 -s 56 127.0.0.1 2>/dev/null | \ egrep -i "^round-trip|^rtt" >/dev/null then - with_ping_command="$PATH_TO_PING -n -U -c %d %s" + with_ping_command="$PATH_TO_PING -n -U -w %d -c %d -s %d %s" ac_cv_ping_packets_first=yes + ac_cv_ping_has_timeout=yes + ac_cv_ping_has_packetsize=yes AC_MSG_RESULT([$with_ping_command]) elif $PATH_TO_PING -4 -n -U -w 10 -c 1 127.0.0.1 2>/dev/null | \ @@ -1126,6 +1137,14 @@ then ac_cv_ping_has_timeout=yes AC_MSG_RESULT([$with_ping_command]) +elif $PATH_TO_PING -n -U -c 1 -s 56 127.0.0.1 2>/dev/null | \ + egrep -i "^round-trip|^rtt" >/dev/null +then + with_ping_command="$PATH_TO_PING -n -U -c %d -s %d %s" + ac_cv_ping_packets_first=yes + ac_cv_ping_has_packetsize=yes + AC_MSG_RESULT([$with_ping_command]) + elif $PATH_TO_PING -n -U -c 1 127.0.0.1 2>/dev/null | \ egrep -i "^round-trip|^rtt" >/dev/null then @@ -1155,13 +1174,15 @@ then elif $PATH_TO_PING -n -s 127.0.0.1 56 1 2>/dev/null | \ egrep -i "^round-trip|^rtt" >/dev/null then - with_ping_command="$PATH_TO_PING -n -s %s 56 %d" + with_ping_command="$PATH_TO_PING -n -s %s %d %d" + ac_cv_ping_has_packetsize=yes AC_MSG_RESULT([$with_ping_command]) elif $PATH_TO_PING -n -h 127.0.0.1 -s 56 -c 1 2>/dev/null | \ egrep -i "^round-trip|^rtt" >/dev/null then - with_ping_command="$PATH_TO_PING -n -h %s -s 56 -c %d" + with_ping_command="$PATH_TO_PING -n -h %s -s %d -c %d" + ac_cv_ping_has_packetsize=yes AC_MSG_RESULT([$with_ping_command]) elif $PATH_TO_PING -n -s 56 -c 1 127.0.0.1 2>/dev/null | \ @@ -1197,6 +1218,12 @@ then [Define if ping has its own timeout option that should be set]) fi +if test "x$ac_cv_ping_has_packetsize" != "xno" +then + AC_DEFINE(PING_HAS_PACKETSIZE,1, + [Define if ping has an option for custom packet size]) +fi + AC_ARG_WITH(ping6_command, ACX_HELP_STRING([--with-ping6-command=SYNTAX], [sets syntax for ICMPv6 ping]), diff --git a/plugins/check_ping.c b/plugins/check_ping.c index ba7af373..de173f9f 100644 --- a/plugins/check_ping.c +++ b/plugins/check_ping.c @@ -44,7 +44,8 @@ const char *email = "devel@monitoring-plugins.org"; enum { UNKNOWN_PACKET_LOSS = 200, /* 200% */ - DEFAULT_MAX_PACKETS = 5 /* default no. of ICMP ECHO packets */ + DEFAULT_MAX_PACKETS = 5, /* default no. of ICMP ECHO packets */ + DEFAULT_PACKET_SIZE = 56 /* default size of ICMP ECHO packets */ }; int process_arguments (int, char **); @@ -64,6 +65,7 @@ char **addresses = NULL; int n_addresses = 0; int max_addr = 1; int max_packets = -1; +int packet_size = DEFAULT_PACKET_SIZE; int verbose = 0; float rta = UNKNOWN_TRIP_TIME; @@ -122,13 +124,21 @@ main (int argc, char **argv) /* does the host address of number of packets argument come first? */ #ifdef PING_PACKETS_FIRST -# ifdef PING_HAS_TIMEOUT +# if defined(PING_HAS_TIMEOUT) && defined(PING_HAS_PACKETSIZE) + xasprintf (&cmd, rawcmd, timeout_interval, max_packets, packet_size, addresses[i]); +# elif defined(PING_HAS_TIMEOUT) xasprintf (&cmd, rawcmd, timeout_interval, max_packets, addresses[i]); +# elif defined(PING_HAS_PACKETSIZE) + xasprintf (&cmd, rawcmd, max_packets, packet_size, addresses[i]); # else xasprintf (&cmd, rawcmd, max_packets, addresses[i]); # endif #else - xasprintf (&cmd, rawcmd, addresses[i], max_packets); +# ifdef PING_HAS_PACKETSIZE + xasprintf (&cmd, rawcmd, addresses[i], packet_size, max_packets); +# else + xasprintf (&cmd, rawcmd, addresses[i], max_packets); +# endif #endif if (verbose >= 2) @@ -202,6 +212,7 @@ process_arguments (int argc, char **argv) static struct option longopts[] = { STD_LONG_OPTS, {"packets", required_argument, 0, 'p'}, + {"packetsize",required_argument, 0, 's'}, {"nohtml", no_argument, 0, 'n'}, {"link", no_argument, 0, 'L'}, {"use-ipv4", no_argument, 0, '4'}, @@ -220,7 +231,7 @@ process_arguments (int argc, char **argv) } while (1) { - c = getopt_long (argc, argv, "VvhnL46t:c:w:H:p:", longopts, &option); + c = getopt_long (argc, argv, "VvhnL46t:c:w:H:p:s:", longopts, &option); if (c == -1 || c == EOF) break; @@ -277,6 +288,12 @@ process_arguments (int argc, char **argv) else usage2 (_(" (%s) must be a non-negative number\n"), optarg); break; + case 's': /* number of packets to send */ + if (is_intnonneg (optarg)) + packet_size = atoi (optarg); + else + usage2 (_(" (%s) must be a non-negative number\n"), optarg); + break; case 'n': /* no HTML */ display_html = FALSE; break; @@ -307,6 +324,7 @@ process_arguments (int argc, char **argv) } } + /* XXX shouldnt this be in function validate_arguments ? */ if (wpl == UNKNOWN_PACKET_LOSS) { if (is_intpercent (argv[c]) == FALSE) { printf (_(" (%s) must be an integer percentage\n"), argv[c]); @@ -359,6 +377,7 @@ process_arguments (int argc, char **argv) return ERROR; } } + /* XXX END shouldnt this be in function validate_arguments ? */ return validate_arguments (); } @@ -387,6 +406,10 @@ validate_arguments () float max_seconds; int i; + if (packet_size > 65528) { + printf (_("max packet size cannot be larger than 65528 Bytes")); + return ERROR; + } if (wrta < 0.0) { printf (_(" was not set\n")); return ERROR; @@ -591,6 +614,9 @@ print_help (void) printf (" %s\n", "-p, --packets=INTEGER"); printf (" %s ", _("number of ICMP ECHO packets to send")); printf (_("(Default: %d)\n"), DEFAULT_MAX_PACKETS); + printf (" %s\n", "-s, --packetsize=INTEGER"); + printf (" %s ", _("size of ICMP ECHO packet to send")); + printf (_("(Default: %d)\n"), DEFAULT_PACKET_SIZE); printf (" %s\n", "-L, --link"); printf (" %s\n", _("show HTML in the plugin output (obsoleted by urlize)")); @@ -615,5 +641,5 @@ print_usage (void) { printf ("%s\n", _("Usage:")); printf ("%s -H -w ,%% -c ,%%\n", progname); - printf (" [-p packets] [-t timeout] [-4|-6]\n"); + printf (" [-p packets] [-s packetsize] [-t timeout] [-4|-6]\n"); } -- cgit v1.2.3-74-g34f1