[monitoring-plugins] Implement new fping options for fping 5.2 and 5.3
Lorenz Kästle
git at monitoring-plugins.org
Thu Jun 12 13:50:11 CEST 2025
Module: monitoring-plugins
Branch: master
Commit: 7247fc656a1f475159b7879cc3c3b798e03c1a33
Author: Lorenz Kästle <lorenz.kaestle at netways.de>
Date: Thu Jun 12 11:13:59 2025 +0200
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=7247fc65
Implement new fping options for fping 5.2 and 5.3
fping 5.2 and 5.3 add some new useful command line options
which this commit add to check_fping.
These are:
* --fwmark - sets a firewall mark in the packages to make them
identifiable (fping 5.2)
* --icmp-timestamp - fping uses ICMP timestamp instead of ICMP
Echo (fping 5.2)
* --check-source - fping discards replies which originate not from
the target address (fping 5.2)
The fping release notes describe theses options ( https://github.com/schweikert/fping/releases )
in a little bit more detail.
Currently the help display for those options is only shown
when fping was available in the appropriate version during
compilation.
---
plugins/check_fping.c | 80 +++++++++++++++++++++++++++++++++++++-----
plugins/check_fping.d/config.h | 24 +++++++++++++
2 files changed, 96 insertions(+), 8 deletions(-)
diff --git a/plugins/check_fping.c b/plugins/check_fping.c
index e05056b2..4d328a01 100644
--- a/plugins/check_fping.c
+++ b/plugins/check_fping.c
@@ -117,8 +117,26 @@ int main(int argc, char **argv) {
xasprintf(&option_string, "%s-R ", option_string);
}
+ if (config.fwmark_set) {
+ xasprintf(&option_string, "%s--fwmark %u ", option_string, config.fwmark);
+ }
+
+ if (config.icmp_timestamp) {
+ xasprintf(&option_string, "%s--icmp-timestamp ", option_string);
+ }
+
+ if (config.check_source) {
+ xasprintf(&option_string, "%s--check-source ", option_string);
+ }
+
char *command_line = NULL;
- xasprintf(&command_line, "%s %s-b %d -c %d %s", fping_prog, option_string, config.packet_size, config.packet_count, server);
+
+ if (config.icmp_timestamp) {
+ // no paket size settable for ICMP timestamp
+ xasprintf(&command_line, "%s %s -c %d %s", fping_prog, option_string, config.packet_count, server);
+ } else {
+ xasprintf(&command_line, "%s %s-b %d -c %d %s", fping_prog, option_string, config.packet_size, config.packet_count, server);
+ }
if (verbose) {
printf("%s\n", command_line);
@@ -275,13 +293,35 @@ mp_state_enum textscan(char *buf, const char *server_name, bool crta_p, double c
/* process command-line arguments */
check_fping_config_wrapper process_arguments(int argc, char **argv) {
- static struct option longopts[] = {
- {"hostname", required_argument, 0, 'H'}, {"sourceip", required_argument, 0, 'S'}, {"sourceif", required_argument, 0, 'I'},
- {"critical", required_argument, 0, 'c'}, {"warning", required_argument, 0, 'w'}, {"alive", no_argument, 0, 'a'},
- {"bytes", required_argument, 0, 'b'}, {"number", required_argument, 0, 'n'}, {"target-timeout", required_argument, 0, 'T'},
- {"interval", required_argument, 0, 'i'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'},
- {"help", no_argument, 0, 'h'}, {"use-ipv4", no_argument, 0, '4'}, {"use-ipv6", no_argument, 0, '6'},
- {"dontfrag", no_argument, 0, 'M'}, {"random", no_argument, 0, 'R'}, {0, 0, 0, 0}};
+ enum {
+ FWMARK_OPT = CHAR_MAX + 1,
+ ICMP_TIMESTAMP_OPT,
+ CHECK_SOURCE_OPT,
+ };
+ static struct option longopts[] = {{"hostname", required_argument, 0, 'H'},
+ {"sourceip", required_argument, 0, 'S'},
+ {"sourceif", required_argument, 0, 'I'},
+ {"critical", required_argument, 0, 'c'},
+ {"warning", required_argument, 0, 'w'},
+ {"alive", no_argument, 0, 'a'},
+ {"bytes", required_argument, 0, 'b'},
+ {"number", required_argument, 0, 'n'},
+ {"target-timeout", required_argument, 0, 'T'},
+ {"interval", required_argument, 0, 'i'},
+ {"verbose", no_argument, 0, 'v'},
+ {"version", no_argument, 0, 'V'},
+ {"help", no_argument, 0, 'h'},
+ {"use-ipv4", no_argument, 0, '4'},
+ {"use-ipv6", no_argument, 0, '6'},
+ {"dontfrag", no_argument, 0, 'M'},
+ {"random", no_argument, 0, 'R'},
+ // only available with fping version >= 5.3
+ {"fwmark", required_argument, NULL, FWMARK_OPT},
+ // only available with fping version >= 5.3
+ {"icmp-timestamp", no_argument, NULL, ICMP_TIMESTAMP_OPT},
+ {"check-source", no_argument, NULL, CHECK_SOURCE_OPT},
+
+ {0, 0, 0, 0}};
char *rv[2];
rv[PL] = NULL;
@@ -409,6 +449,20 @@ check_fping_config_wrapper process_arguments(int argc, char **argv) {
case 'M':
result.config.dontfrag = true;
break;
+ case FWMARK_OPT:
+ if (is_intpos(optarg)) {
+ result.config.fwmark = (unsigned int)atol(optarg);
+ result.config.fwmark_set = true;
+ } else {
+ usage(_("fwmark must be a positive integer"));
+ }
+ break;
+ case ICMP_TIMESTAMP_OPT:
+ result.config.icmp_timestamp = true;
+ break;
+ case CHECK_SOURCE_OPT:
+ result.config.check_source = true;
+ break;
}
}
@@ -496,6 +550,16 @@ void print_help(void) {
printf(" %s\n", _("set the Don't Fragment flag"));
printf(" %s\n", "-R, --random");
printf(" %s\n", _("random packet data (to foil link data compression)"));
+#ifdef FPING_VERSION_5_2_OR_HIGHER
+ printf(" %s\n", "--fwmark=INTEGER");
+ printf(" %s\n", _("set the routing mark to INTEGER (fping option)"));
+# ifdef FPING_VERSION_5_3_OR_HIGHER
+ printf(" %s\n", "--icmp-timestamp");
+ printf(" %s\n", _("use ICMP Timestamp instead of ICMP Echo (fping option)"));
+ printf(" %s\n", "--check-source");
+ printf(" %s\n", _("discard replies not from target address (fping option)"));
+# endif
+#endif
printf(UT_VERBOSE);
printf("\n");
printf(" %s\n", _("THRESHOLD is <rta>,<pl>%% where <rta> is the round trip average travel time (ms)"));
diff --git a/plugins/check_fping.d/config.h b/plugins/check_fping.d/config.h
index a0697bf3..6d28382a 100644
--- a/plugins/check_fping.d/config.h
+++ b/plugins/check_fping.d/config.h
@@ -29,6 +29,21 @@ typedef struct {
bool cpl_p;
int wpl;
bool wpl_p;
+
+ // only available with fping version >= 5.2
+ // for a given uint _fwmark_ fping sets _fwmark_ as a firewall mark
+ // in the pakets
+ unsigned int fwmark;
+ bool fwmark_set;
+
+
+ // only available with fping version >= 5.3
+ // Setting icmp_timestamp tells fping to use ICMP Timestamp (ICMP type 13) instead
+ // of ICMP Echo
+ bool icmp_timestamp;
+
+ // Setting check_source lets fping discard replies which are not from the target address
+ bool check_source;
} check_fping_config;
check_fping_config check_fping_config_init() {
@@ -53,6 +68,15 @@ check_fping_config check_fping_config_init() {
.cpl_p = false,
.wpl = 0,
.wpl_p = false,
+
+ // only available with fping version >= 5.2
+ .fwmark = 0,
+ .fwmark_set = false, // just to be deterministic
+
+ // only available with fping version >= 5.3
+ .icmp_timestamp = false,
+ .check_source = false,
+
};
return tmp;
}
More information about the Commits
mailing list