From: Florian Forster Date: Fri, 6 Oct 2017 07:50:40 +0000 (+0200) Subject: Merge branch 'collectd-5.7' X-Git-Tag: collectd-5.8.0~57 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=5dbb7471b0a7ca7506f56f4c6dbaf58e790c6b7c;hp=3bd15a49e44e568449ea2909be986ef6940eaffb Merge branch 'collectd-5.7' --- diff --git a/ChangeLog b/ChangeLog index b8755d99..f990dd46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -134,6 +134,77 @@ embedded HTTP server, in a format compatible with Prometheus' collectd_exporter. Thanks to Florian Forster. #1967 +2017-10-06, Version 5.6.3 + * collectd: support for boolean string config values has been + reintroduced. Thanks to Sebastian Harl. #2083, #2098 + * collectd: The capability checking has been changed to use + "cap_get_proc()". Thanks to Marc Fournier. #2151 + * Documentation: A section documenting ignore lists has been added to + collectd.conf(5). Thanks to Florian Forster. + * AMQP plugin: The "ExchangeType" option is now also valid for + publishers. Thanks to Florian Forster. #2286 + * Apache, Ascent, BIND, cURL, cURL-JSON, cURL-XML, nginx, Write HTTP + plugins: Handling of URLs that redirect elsewhere has been fixed. + Thanks to Pavel Rochnyack. #2328 + * BIND plugin: Fix parsing of the sample time provided by BIND. + Previously, the time was assumed to be in the local time zone when in + fact it was in UTC. Thanks to Ed Ravin. #1268 + * BIND plugin: Memory leaks have been fixed. Thanks to Ruben Kerkhof. + #2303 + * Chrony plugin: Build flags have been fixed. Thanks to Thomas Jost and + Marc Fournier. #2133 + * cURL-JSON plugin: The timeout value has been changed to default to the + collection interval. This fixes a regression. Thanks to Marc Fournier. + * cURL-JSON plugin: Handling of arrays has been fixed. Thanks to Florian + Forster. #2266 + * DBI plugin: Memory leaks at shutdown have been fixes. Thanks to Pavel + Rochnyack and Florian Forster. + * E-Mail, Exec, UnixSock plugins: Group ID lookup on systems with many + groups has been fixed. Thanks to Ruben Kerkhof and Florian Forster. + #2208 + * IPC plugin: A compilation error on AIX has been fixed. Thanks to Pavel + Rochnyack. #2305 + * LogFile plugin: If writing to the file fails, print log messages on + "STDERR" instead. Thanks to Marc Fournier. + * Log Logstash plugin: If writing the log entry fails, print it to + "STDERR" instead. Thanks to Marc Fournier. + * memcachec, Tail plugins: A resource leak in the matching + infrastructure has been fixed. Thanks to Krzysztof Matczak. #2192 + * MQTT plugin: Invalid symbols in topic names are now replaced and a + resource leak has been fixed. Thanks to Denys Fedoryshchenko. #2123 + * Network plugin: A potential endless-loop has been fixed. This can be + triggered remotely by sending a signed network packet to a server + which is not set up to check signatures. Thanks to Marcin Kozlowski + and Pavel Rochnyack. #2174, #2233, CVE-2017-7401 + * Network plugin: A use-after-free has been fixed. Thanks to Pavel + Rochnyack. #2375 + * Notify Email plugin: The plugin is no longer explicitly linked against + libssl and libcrypto, relies on libesmtp being linked correctly. + Thanks to Marc Fournier. Debian#852924 + * NTPd plugin: Calculation of loop offset and error has been fixed. + Thanks to Neil Wilson. #2188 + * OpenLDAP plugin: An incorrect use of the ldap library, leading to a + crash, has been fixed. Thanks to Marc Fournier. #2331 + * Perl plugin: A potential double-free has been fixed. Thanks to Florian + Forster. #2278 + * Perl plugin: Print an error when an incorrect configuration is + encountered. Thanks to Pavel Rochnyack. #927 + * RRDtool plugin: Incorrect handling of the flushes timeout option has + been fixed. Handling of the "RandomTimeout" has been fixed. Thanks to + Pavel Rochnyack. #2363 + * SMART plugin: Some warning messages have been removed and the code has + been cleaned up. Thanks to Florian Forster. #2062 + * SMART plugin: A check for the "CAP_SYS_RAWIO" capability has been + added. Thanks to Marc Fournier. + * SNMP plugin: A double free has been fixed. Thanks to Pavel Rochnyack. + #2291 + * Write Graphite plugin: Error handling in the case that calculating a + metric's rate fails has been improved. Previously, the raw counter + values were sent to Graphite. Thanks to Iain Buclaw. #2209 + * Write Kafka plugin: A 32 bit random number is now used when formatting + a random key. Thanks to Florian Forster. #2074 + + 2016-11-30, Version 5.6.2 * collectd: A compile error on AIX has been fixed: "MSG_DONTWAIT" is not available on AIX. Thanks to Chao Yang. diff --git a/src/write_prometheus.c b/src/write_prometheus.c index eac0d68e..a005ffb2 100644 --- a/src/write_prometheus.c +++ b/src/write_prometheus.c @@ -36,6 +36,10 @@ #include +#include +#include +#include + #ifndef PROMETHEUS_DEFAULT_STALENESS_DELTA #define PROMETHEUS_DEFAULT_STALENESS_DELTA TIME_T_TO_CDTIME_T_STATIC(300) #endif @@ -727,6 +731,90 @@ metric_family_get(data_set_t const *ds, value_list_t const *vl, size_t ds_index, } /* }}} */ +#if MHD_VERSION >= 0x00090000 +static int prom_open_socket(int addrfamily) { + /* {{{ */ + char service[NI_MAXSERV]; + snprintf(service, sizeof(service), "%hu", httpd_port); + + struct addrinfo *res; + int status = getaddrinfo(NULL, service, + &(struct addrinfo){ + .ai_flags = AI_PASSIVE | AI_ADDRCONFIG, + .ai_family = addrfamily, + .ai_socktype = SOCK_STREAM, + }, + &res); + if (status != 0) { + return -1; + } + + int fd = -1; + for (struct addrinfo *ai = res; ai != NULL; ai = ai->ai_next) { + fd = socket(ai->ai_family, ai->ai_socktype | SOCK_CLOEXEC, 0); + if (fd == -1) + continue; + + if (bind(fd, ai->ai_addr, ai->ai_addrlen) != 0) { + close(fd); + fd = -1; + continue; + } + + if (listen(fd, /* backlog = */ 16) != 0) { + close(fd); + fd = -1; + continue; + } + + break; + } + + freeaddrinfo(res); + + return fd; +} /* }}} int prom_open_socket */ + +static struct MHD_Daemon *prom_start_daemon() { + /* {{{ */ + int fd = prom_open_socket(PF_INET6); + if (fd == -1) + fd = prom_open_socket(PF_INET); + if (fd == -1) { + ERROR("write_prometheus plugin: Opening a listening socket failed."); + return NULL; + } + + struct MHD_Daemon *d = + MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION, 0, + /* MHD_AcceptPolicyCallback = */ NULL, + /* MHD_AcceptPolicyCallback arg = */ NULL, http_handler, + NULL, MHD_OPTION_LISTEN_SOCKET, fd, MHD_OPTION_END); + if (d == NULL) { + ERROR("write_prometheus plugin: MHD_start_daemon() failed."); + close(fd); + return NULL; + } + + return d; +} /* }}} struct MHD_Daemon *prom_start_daemon */ +#else /* if MHD_VERSION < 0x00090000 */ +static struct MHD_Daemon *prom_start_daemon() { + /* {{{ */ + struct MHD_Daemon *d = + MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION, 0, + /* MHD_AcceptPolicyCallback = */ NULL, + /* MHD_AcceptPolicyCallback arg = */ NULL, http_handler, + NULL, MHD_OPTION_END); + if (d == NULL) { + ERROR("write_prometheus plugin: MHD_start_daemon() failed."); + return NULL; + } + + return d; +} /* }}} struct MHD_Daemon *prom_start_daemon */ +#endif + /* * collectd callbacks */ @@ -760,15 +848,7 @@ static int prom_init() { } if (httpd == NULL) { - unsigned int flags = MHD_USE_THREAD_PER_CONNECTION; -#if MHD_VERSION >= 0x00093300 - flags |= MHD_USE_DUAL_STACK; -#endif - - httpd = MHD_start_daemon(flags, httpd_port, - /* MHD_AcceptPolicyCallback = */ NULL, - /* MHD_AcceptPolicyCallback arg = */ NULL, - http_handler, NULL, MHD_OPTION_END); + httpd = prom_start_daemon(); if (httpd == NULL) { ERROR("write_prometheus plugin: MHD_start_daemon() failed."); return -1;