From 1b0101fbde86c01590bec8e78fac3262b8542119 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20V=C3=B6lkel?= Date: Tue, 15 Dec 2009 10:25:58 +0000 Subject: [PATCH] ping plugin: Add MaxMissed option. Any host not replying to consecutive MaxMissed PING packets will get it's name re-resolved via DNS. This enables the use of dynamic DNS services (like dyndns.org) with the ping plugin. Prior to this patch, hostnames were resolved once on daemon start. The default is -1 (disabled). Signed-off-by: Florian Forster --- src/collectd.conf.pod | 7 +++++++ src/ping.c | 44 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 41597edd..e2cb799e 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -2787,6 +2787,13 @@ Sets the outgoing network device to be used. I has to specify an interface name (e.Eg. C). This might not be supported by all operating systems. +=item B I + +Trigger a DNS resolv after the host has not replied to I packets. This +enables the use of dynamic DNS services (like dyndns.org) with the ping plugin. + +Default: B<-1> (disabled) + =back =head2 Plugin C diff --git a/src/ping.c b/src/ping.c index e1540c37..5366b98f 100644 --- a/src/ping.c +++ b/src/ping.c @@ -49,6 +49,7 @@ struct hostlist_s uint32_t pkg_sent; uint32_t pkg_recv; + uint32_t pkg_missed; double latency_total; double latency_squared; @@ -69,6 +70,7 @@ static char *ping_device = NULL; static int ping_ttl = PING_DEF_TTL; static double ping_interval = 1.0; static double ping_timeout = 0.9; +static int ping_max_missed = -1; static int ping_thread_loop = 0; static int ping_thread_error = 0; @@ -85,7 +87,8 @@ static const char *config_keys[] = #endif "TTL", "Interval", - "Timeout" + "Timeout", + "MaxMissed" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -284,7 +287,37 @@ static void *ping_thread (void *arg) /* {{{ */ hl->pkg_recv++; hl->latency_total += latency; hl->latency_squared += (latency * latency); - } + + /* reset missed packages counter */ + hl->pkg_missed = 0; + } else + hl->pkg_missed++; + + /* if the host did not answer our last N packages, trigger a resolv. */ + if (ping_max_missed >= 0 && hl->pkg_missed >= ping_max_missed) + { /* {{{ */ + /* we reset the missed package counter here, since we only want to + * trigger a resolv every N packages and not every package _AFTER_ N + * missed packages */ + hl->pkg_missed = 0; + + WARNING ("ping plugin: host %s has not answered %d PING requests," + " triggering resolve", hl->host, ping_max_missed); + + /* we trigger the resolv simply be removeing and adding the host to our + * ping object */ + status = ping_host_remove (pingobj, hl->host); + if (status != 0) + { + WARNING ("ping plugin: ping_host_remove (%s) failed.", hl->host); + } + else + { + status = ping_host_add (pingobj, hl->host); + if (status != 0) + WARNING ("ping plugin: ping_host_add (%s) failed.", hl->host); + } + } /* }}} ping_max_missed */ } /* }}} for (iter) */ if (gettimeofday (&tv_end, NULL) < 0) @@ -436,6 +469,7 @@ static int ping_config (const char *key, const char *value) /* {{{ */ hl->host = host; hl->pkg_sent = 0; hl->pkg_recv = 0; + hl->pkg_missed = 0; hl->latency_total = 0.0; hl->latency_squared = 0.0; hl->next = hostlist_head; @@ -485,6 +519,12 @@ static int ping_config (const char *key, const char *value) /* {{{ */ WARNING ("ping plugin: Ignoring invalid timeout %g (%s)", tmp, value); } + else if (strcasecmp (key, "MaxMissed") == 0) + { + ping_max_missed = atoi (value); + if (ping_max_missed < 0) + INFO ("ping plugin: MaxMissed < 0, disabled re-resolving of hosts"); + } else { return (-1); -- 2.30.2