From de29c005c9faef953833331e709f67e95e6f9e1d Mon Sep 17 00:00:00 2001 From: Jakub Jankowski Date: Sat, 3 Nov 2018 02:51:29 +0100 Subject: [PATCH] curl plugin: add AddressFamily In situations when hostnames in URLs resolve to both IPv4 and IPv6 addresses, sometimes it's useful to have separate statistics for both of these separately. With this commit, within block you can set AddressFamily "ipv6" or AddressFamily "ipv4" to specifically use one or the other. Signed-off-by: Jakub Jankowski --- src/collectd.conf.in | 1 + src/collectd.conf.pod | 11 +++++++++++ src/curl.c | 19 ++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/collectd.conf.in b/src/collectd.conf.in index b7c1b278..335ec8c5 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -403,6 +403,7 @@ # # # URL "http://finance.google.com/finance?q=NYSE%3AAMD" +# AddressFamily "any" # User "foo" # Password "bar" # Digest false diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 03b163ef..f62417b8 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -1795,6 +1795,7 @@ finance page and dispatch the value to collectd. Plugin "quotes" URL "http://finance.google.com/finance?q=NYSE%3AAMD" + AddressFamily "any" User "foo" Password "bar" Digest false @@ -1835,6 +1836,16 @@ Defaults to C. URL of the web site to retrieve. Since a regular expression will be used to extract information from this data, non-binary data is a big plus here ;) +=item B I + +IP version to resolve URL to. Useful in cases when hostname in URL resolves +to both IPv4 and IPv6 addresses, and you are interested in using one of them +specifically. +Use C to enforce IPv4, C to enforce IPv6. If C is compiled +without IPv6 support, the latter will result in a warning, and fallback to C. +If C cannot be parsed, C will be used as well (all IP versions that +your system allows). + =item B I Username to use if authorization is required to read the page. diff --git a/src/curl.c b/src/curl.c index 4925ad09..5c30ab7d 100644 --- a/src/curl.c +++ b/src/curl.c @@ -57,6 +57,7 @@ struct web_page_s /* {{{ */ char *instance; char *url; + int address_family; char *user; char *pass; char *credentials; @@ -345,6 +346,7 @@ static int cc_page_init_curl(web_page_t *wp) /* {{{ */ curl_easy_setopt(wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf); curl_easy_setopt(wp->curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(wp->curl, CURLOPT_MAXREDIRS, 50L); + curl_easy_setopt(wp->curl, CURLOPT_IPRESOLVE, wp->address_family); if (wp->user != NULL) { #ifdef HAVE_CURLOPT_USERNAME @@ -398,6 +400,8 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ cdtime_t interval = 0; web_page_t *page; int status; + char *af = NULL; + curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW); if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("curl plugin: `Page' blocks need exactly one string argument."); @@ -411,6 +415,7 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ } page->plugin_name = NULL; page->url = NULL; + page->address_family = CURL_IPRESOLVE_WHATEVER; page->user = NULL; page->pass = NULL; page->digest = false; @@ -437,7 +442,19 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */ status = cf_util_get_string(child, &page->plugin_name); else if (strcasecmp("URL", child->key) == 0) status = cf_util_get_string(child, &page->url); - else if (strcasecmp("User", child->key) == 0) + else if (strcasecmp("AddressFamily", child->key) == 0) { + status = cf_util_get_string(child, &af); + if (status != 0 || af == NULL) { + page->address_family = CURL_IPRESOLVE_WHATEVER; + } else if (strcasecmp("inet4", af) == 0 || strcasecmp("ipv4", af) == 0) { + page->address_family = CURL_IPRESOLVE_V4; + } else if (strcasecmp("inet6", af) == 0 || strcasecmp("ipv6", af) == 0) { + if (curl_info->features & CURL_VERSION_IPV6) + page->address_family = CURL_IPRESOLVE_V6; + else + WARNING("curl plugin: IPv6 not supported by this libCURL."); + } + } else if (strcasecmp("User", child->key) == 0) status = cf_util_get_string(child, &page->user); else if (strcasecmp("Password", child->key) == 0) status = cf_util_get_string(child, &page->pass); -- 2.11.0