summaryrefslogtreecommitdiff
path: root/app-metrics/collectd
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2018-04-05 21:52:00 +0100
committerV3n3RiX <venerix@redcorelinux.org>2018-04-05 21:52:00 +0100
commit2d446203bcf1a0db08e99abca43513d246dfa73d (patch)
treeec623bb5f1f389976977e375342ec59ff441eab7 /app-metrics/collectd
parent171a011ad3a131671aeb5a98b9e3adf219ad2865 (diff)
gentoo resync : 05.04.2018
Diffstat (limited to 'app-metrics/collectd')
-rw-r--r--app-metrics/collectd/Manifest11
-rw-r--r--app-metrics/collectd/collectd-5.7.2-r3.ebuild548
-rw-r--r--app-metrics/collectd/files/collectd-5.6.0-gentoo.patch153
-rw-r--r--app-metrics/collectd/files/collectd-5.7.2-CVE-2017-16820.patch39
-rw-r--r--app-metrics/collectd/files/collectd-5.7.2-issue-2443.patch160
-rw-r--r--app-metrics/collectd/files/collectd-5.7.2-varnish-5.2+.patch1018
-rw-r--r--app-metrics/collectd/files/collectd.confd-r249
-rw-r--r--app-metrics/collectd/files/collectd.initd-r270
-rw-r--r--app-metrics/collectd/files/collectd.logrotate9
-rw-r--r--app-metrics/collectd/files/collectd.tmpfile1
-rw-r--r--app-metrics/collectd/metadata.xml27
11 files changed, 2085 insertions, 0 deletions
diff --git a/app-metrics/collectd/Manifest b/app-metrics/collectd/Manifest
new file mode 100644
index 000000000000..f4e1eb48e744
--- /dev/null
+++ b/app-metrics/collectd/Manifest
@@ -0,0 +1,11 @@
+AUX collectd-5.6.0-gentoo.patch 4294 BLAKE2B 99274b5a2734910a35ab6a0003d6fe257e239fc0a3b1f3ca398c82b0e28b9365729980999af0db417b3818c7b4de47f48c0118eea88a43f8de162ae40eeb68be SHA512 088f65e2d90c29092621693847f165be7024caa2237a2129dbffcedba3c1f93baa8169de9d3c2979c709219ec12ee0d3b6dd36586ede92062d1a14a28b8611c8
+AUX collectd-5.7.2-CVE-2017-16820.patch 1326 BLAKE2B 0dbd15e6c52531423b47d25b0fab0319c867482fbcd7f9e5a59c9ae6908ce1844f9ed41590a048ff247acf2bfdb8ddd34723dd289074269fb8bd7133ae324d40 SHA512 13e7ad198c88538a8bdcdd1d0ee8ed3ebe7b8ac00df98341a1248a4e5fd02b44b24d239c6c3ac70fce6492674163371755f126e2f4a0099159032514a842ea0b
+AUX collectd-5.7.2-issue-2443.patch 4628 BLAKE2B 357f4171c4cc5e13e43da0709bcecff8d9c7d529c1c2c910e14ec2502ea4abd3df2e1be591b2d98b06d6dd5f984e9dd5615f7cd7e14cad79d49adc6f369cf37b SHA512 16c7bc99a6401c96fb3b2cda5ad6e540024ae13d66268b4d5ada4c65c456a5dbd210ea58d116463381dbac953f9f8d4907d2185a24195a304e0f5a645829755e
+AUX collectd-5.7.2-varnish-5.2+.patch 40982 BLAKE2B a1f90a27e95b2665626fc2112646f5fb092472f32b58fb6bcc2a6a15e2916bb067b7f8aa7c85fba12eaf839d10b94004a1847f537d5f5535d9a7aac0fe2fe5a7 SHA512 eea0fd89f65b14ba6012160c4d2560e8c6339f7aeb873d93ed35b9c3551d76d6087c6cdbe986610502e8a73b144fba945f1efd1db31e5be792b9ecead2d0eeec
+AUX collectd.confd-r2 2001 BLAKE2B fbf1a64aab6ec60111553466c3a8b725200ab13d0e09c1ba1d71e68213e8f978c3cad0dfc5eb2c536ced8213f172804f0596b3494f9b42b0cacf3432105cab5a SHA512 729f2b4e06c4a8c95d32c03c6f3f292eaa4895780ace180b74fcf139a949e9c28a2b3ae823bdebec0014f9b4d919adb399bc7f019c68c0e268b263326959edb7
+AUX collectd.initd-r2 1843 BLAKE2B ccb12e55de72565aa7b6bb0f2c4e7a5a6d15ff23d5bc75e9cb36e1f2dba85b3b2b587336f976059af165ae89333d681ffe0cf53bbcd8098eaeff75228cb80b68 SHA512 8f0a73f0f2b2280c0f2e35894a9dfa38af937930eb090eab52cbe81089a146bd974f6a2a3062b7147611f9c13b770a945a1a9228a026405d31578e27a3fd3b80
+AUX collectd.logrotate 115 BLAKE2B ce2a79787096b04af6ecd128633dde68fb868a02cc1d246c3e512c1733133fcc8da41b3ab2a0051b4da78c53e6629b2ad8085872dec1d4c28e397c88cafe3a90 SHA512 87ec01784d415f00834c2b20614f11f7e08b70f88d7c87509a8b8fd7e1af8758565b9ed6a6840af7bf1006cb941a61a6ff4f3176f6ded722728f24483b08bc8e
+AUX collectd.tmpfile 39 BLAKE2B 0d1ee2f02e539e854b62b47032308d08505fa31d8428e98f8d150c924201074c5edae22eea3990edf3a7837f1473193fe009a501645bf064638c532ec53a36cc SHA512 55fb70da9ece74b143c3e971b890954842230691039f8ad2240cc4c8d699e4e7a21efcbfd0b3cb2503e90af0bbdd0c7d886e09baf9fc86ec26c115a0bce6a668
+DIST collectd-5.7.2.tar.bz2 1798777 BLAKE2B 4af359a773457bb9c05b6a301d7728eea7598c200f7ca534875b07d1d011b280ab138f680d9607723f14523dd71dcbec3a41e0d8d183848c8ef809cef86c2b8f SHA512 8844b67159f8da2203b5ac57ef19fce0a01050a016174d196b48b5fb24925ad2935af9bdd9af06097ff663499abc496cdcc2d9e9a10f403f8d707c465c1a88f3
+EBUILD collectd-5.7.2-r3.ebuild 19603 BLAKE2B a30d9303b3c0f523491b2a78311532ed3b7a9ddb6f8a110946005d6e94a1fd204e3a62ce051be9ba9a299e66df04f1a8aaf647ce1b13c300a1041240da42fd06 SHA512 d6f9ea901a5e9449a2d8e54a21881ec7dcb980d6b7d4aee8dd02bf5006e874d5221080e6688e91fcebe65ef1ea5e1aeb77e42c82f19c10249e550992a1ca5454
+MISC metadata.xml 1515 BLAKE2B 5525766b822463f94f7c2cddbdf78b4c4ea5a473880a473d0b51481d948569cfc7f51bd2e74eb67065ab2be1b23e4fb7ee99512d018c6e6b5ac1ee7331eae9eb SHA512 51c17c16d27b722d729d036d67c562ab76e212dac9bcd004a7e43c2c5e041b8c46e74f9a130f30c2e18cc95ca1b367034246eff02cfaf55f6f9375ff836749e5
diff --git a/app-metrics/collectd/collectd-5.7.2-r3.ebuild b/app-metrics/collectd/collectd-5.7.2-r3.ebuild
new file mode 100644
index 000000000000..090a6bb64c94
--- /dev/null
+++ b/app-metrics/collectd/collectd-5.7.2-r3.ebuild
@@ -0,0 +1,548 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="6"
+
+PYTHON_COMPAT=( python{2_7,3_4,3_5,3_6} )
+JAVA_PKG_OPT_USE="collectd_plugins_java"
+
+inherit autotools fcaps flag-o-matic java-pkg-opt-2 linux-info multilib perl-functions python-single-r1 systemd tmpfiles user
+
+DESCRIPTION="Collects system statistics and provides mechanisms to store the values"
+
+HOMEPAGE="https://collectd.org/"
+SRC_URI="${HOMEPAGE%/}/files/${P}.tar.bz2"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="alpha amd64 arm x86"
+IUSE="contrib debug java kernel_Darwin kernel_FreeBSD kernel_linux perl selinux static-libs udev xfs"
+
+# The plugin lists have to follow here since they extend IUSE
+
+# Plugins that don't build (e.g. dependencies not in Gentoo)
+# apple_sensors: Requires libIOKit
+# aquaero: Requires aerotools-ng/libaquaero5
+# barometer: Requires libi2c (i2c_smbus_read_i2c_block_data)
+# dpdkstat: Requires dpdk
+# grpc: Requires libgrpc
+# intel_rdt Requires libpqos from intel-cmt-cat project
+# lpar: Requires libperfstat (AIX only)
+# mic: Requires Intel Many Integrated Core Architecture API
+# (part of Intel's Xeon Phi software)
+# netapp: Requires libnetapp (http://communities.netapp.com/docs/DOC-1110)
+# pf: Requires BSD packet filter
+# pinba: Requires MySQL Pinba engine (http://pinba.org/)
+# tape: Requires libkstat (Solaris only)
+# write_mongodb: https://github.com/collectd/collectd/issues/492
+# write_riemann: Requires riemann-c-client
+# xmms: Requires libxmms (v1)
+# zone: Solaris only...
+COLLECTD_IMPOSSIBLE_PLUGINS="apple_sensors aquaero barometer dpdkstat grpc
+ intel_rdt lpar mic netapp pf pinba tape write_mongodb
+ write_riemann xmms zone"
+
+# Plugins that have been (compile) tested and can be enabled via COLLECTD_PLUGINS
+COLLECTD_TESTED_PLUGINS="aggregation amqp apache apcups ascent battery bind
+ ceph cgroups chrony conntrack contextswitch cpu cpufreq cpusleep
+ csv curl curl_json curl_xml dbi df disk dns drbd email
+ entropy ethstat exec fhcount filecount fscache gmond gps hddtemp
+ hugepages interface ipc ipmi iptables ipvs irq java lua
+ load logfile log_logstash lvm madwifi match_empty_counter
+ match_hashed match_regex match_timediff match_value mbmon md
+ memcachec memcached memory modbus mqtt multimeter mysql netlink
+ network network nfs nginx notify_desktop notify_email notify_nagios
+ ntpd numa nut olsrd onewire openldap openvpn oracle perl ping
+ postgresql powerdns processes protocols python python redis
+ routeros rrdcached rrdtool sensors serial sigrok smart snmp statsd
+ swap syslog table tail tail_csv target_notification target_replace
+ target_scale target_set tcpconns teamspeak2 ted thermal threshold
+ tokyotyrant turbostat unixsock uptime users uuid varnish virt
+ vmem vserver wireless write_graphite write_http write_kafka
+ write_log write_prometheus write_redis write_sensu write_tsdb
+ xencpu zfs_arc zookeeper"
+
+COLLECTD_DISABLED_PLUGINS="${COLLECTD_IMPOSSIBLE_PLUGINS}"
+
+COLLECTD_ALL_PLUGINS=${COLLECTD_TESTED_PLUGINS}
+
+for plugin in ${COLLECTD_ALL_PLUGINS}; do
+ IUSE="${IUSE} collectd_plugins_${plugin}"
+done
+unset plugin
+
+# Now come the dependencies.
+
+COMMON_DEPEND="
+ dev-libs/libgcrypt:=
+ dev-libs/libltdl:0=
+ perl? ( dev-lang/perl:=[ithreads] )
+ udev? ( virtual/udev )
+ xfs? ( sys-fs/xfsprogs )
+ collectd_plugins_amqp? ( net-libs/rabbitmq-c )
+ collectd_plugins_apache? ( net-misc/curl:0= )
+ collectd_plugins_ascent? ( net-misc/curl:0= dev-libs/libxml2:2= )
+ collectd_plugins_bind? ( net-misc/curl:0= dev-libs/libxml2:2= )
+ collectd_plugins_ceph? ( dev-libs/yajl:= )
+ collectd_plugins_curl? ( net-misc/curl:0= )
+ collectd_plugins_curl_json? ( net-misc/curl:0= dev-libs/yajl:= )
+ collectd_plugins_curl_xml? ( net-misc/curl:0= dev-libs/libxml2:2= )
+ collectd_plugins_dbi? ( dev-db/libdbi )
+ collectd_plugins_dns? ( net-libs/libpcap )
+ collectd_plugins_gmond? ( sys-cluster/ganglia )
+ collectd_plugins_gps? ( sci-geosciences/gpsd:= )
+ collectd_plugins_ipmi? ( >=sys-libs/openipmi-2.0.16-r1 )
+ collectd_plugins_iptables? ( >=net-firewall/iptables-1.4.13:0= )
+ collectd_plugins_log_logstash? ( dev-libs/yajl:= )
+ collectd_plugins_lua? ( dev-lang/lua:0= )
+ collectd_plugins_lvm? ( sys-fs/lvm2 )
+ collectd_plugins_memcachec? ( dev-libs/libmemcached )
+ collectd_plugins_modbus? ( dev-libs/libmodbus )
+ collectd_plugins_mqtt? ( app-misc/mosquitto )
+ collectd_plugins_mysql? ( virtual/libmysqlclient:= )
+ collectd_plugins_netlink? ( net-libs/libmnl )
+ collectd_plugins_nginx? ( net-misc/curl:0= )
+ collectd_plugins_notify_desktop? ( x11-libs/libnotify )
+ collectd_plugins_notify_email? ( net-libs/libesmtp )
+ collectd_plugins_nut? ( >=sys-power/nut-2.7.2-r2 )
+ collectd_plugins_openldap? ( net-nds/openldap )
+ collectd_plugins_onewire? ( >=sys-fs/owfs-3.1:= )
+ collectd_plugins_oracle? ( dev-db/oracle-instantclient-basic )
+ collectd_plugins_perl? ( dev-lang/perl:=[ithreads] )
+ collectd_plugins_ping? ( net-libs/liboping )
+ collectd_plugins_postgresql? ( dev-db/postgresql:= )
+ collectd_plugins_python? ( ${PYTHON_DEPS} )
+ collectd_plugins_redis? ( dev-libs/hiredis:= )
+ collectd_plugins_routeros? ( net-libs/librouteros )
+ collectd_plugins_rrdcached? ( net-analyzer/rrdtool:= )
+ collectd_plugins_rrdtool? ( net-analyzer/rrdtool:= )
+ collectd_plugins_sensors? ( sys-apps/lm_sensors )
+ collectd_plugins_sigrok? ( <sci-libs/libsigrok-0.4:= dev-libs/glib:2 )
+ collectd_plugins_smart? ( dev-libs/libatasmart )
+ collectd_plugins_snmp? ( net-analyzer/net-snmp )
+ collectd_plugins_tokyotyrant? ( net-misc/tokyotyrant )
+ collectd_plugins_varnish? ( www-servers/varnish )
+ collectd_plugins_virt? ( app-emulation/libvirt:= dev-libs/libxml2:2= )
+ collectd_plugins_write_http? ( net-misc/curl:0= dev-libs/yajl:= )
+ collectd_plugins_write_kafka? ( >=dev-libs/librdkafka-0.9.0.99:= dev-libs/yajl:= )
+ collectd_plugins_write_prometheus? ( >=dev-libs/protobuf-c-1.2.1-r1:= net-libs/libmicrohttpd:= )
+ collectd_plugins_write_redis? ( dev-libs/hiredis:= )
+ collectd_plugins_xencpu? ( app-emulation/xen-tools:= )
+
+ kernel_FreeBSD? (
+ collectd_plugins_disk? ( sys-libs/libstatgrab:= )
+ collectd_plugins_interface? ( sys-libs/libstatgrab:= )
+ collectd_plugins_load? ( sys-libs/libstatgrab:= )
+ collectd_plugins_memory? ( sys-libs/libstatgrab:= )
+ collectd_plugins_swap? ( sys-libs/libstatgrab:= )
+ collectd_plugins_users? ( sys-libs/libstatgrab:= )
+ )"
+
+# Enforcing !=sys-kernel/linux-headers-4.5 > due to #577846
+DEPEND="${COMMON_DEPEND}
+ collectd_plugins_iptables? ( || ( <=sys-kernel/linux-headers-4.4 >=sys-kernel/linux-headers-4.6 ) )
+ collectd_plugins_java? ( >=virtual/jdk-1.6 )
+ virtual/pkgconfig"
+
+RDEPEND="${COMMON_DEPEND}
+ collectd_plugins_java? ( >=virtual/jre-1.6 )
+ collectd_plugins_syslog? ( virtual/logger )
+ selinux? ( sec-policy/selinux-collectd )
+ !<sys-apps/openrc-0.18.2"
+
+REQUIRED_USE="
+ collectd_plugins_python? ( ${PYTHON_REQUIRED_USE} )
+ collectd_plugins_smart? ( udev )"
+
+PATCHES=(
+ "${FILESDIR}"/${PN}-5.6.0-gentoo.patch
+ "${FILESDIR}"/${PN}-5.7.2-issue-2443.patch
+ "${FILESDIR}"/${PN}-5.7.2-CVE-2017-16820.patch
+ "${FILESDIR}"/${PN}-5.7.2-varnish-5.2+.patch
+)
+
+# @FUNCTION: collectd_plugin_kernel_linux
+# @DESCRIPTION:
+# USAGE: <plugin name> <kernel_options> <severity>
+# kernel_options is a list of kernel configurations options; the check tests whether at least
+# one of them is enabled. If no, depending on the third argument an elog, ewarn, or eerror message
+# is emitted.
+collectd_plugin_kernel_linux() {
+ local multi_opt opt
+ if has ${1} ${COLLECTD_ALL_PLUGINS}; then
+ if use collectd_plugins_${1}; then
+ for opt in ${2}; do
+ if linux_chkconfig_present ${opt}; then
+ return 0;
+ fi
+ done
+ multi_opt=${2//\ /\ or\ }
+ case ${3} in
+ (info)
+ elog "The ${1} plugin can use kernel features that are disabled now; enable ${multi_opt} in your kernel"
+ ;;
+ (warn)
+ ewarn "The ${1} plugin uses kernel features that are disabled now; enable ${multi_opt} in your kernel"
+ ;;
+ (error)
+ eerror "The ${1} plugin needs kernel features that are disabled now; enable ${multi_opt} in your kernel"
+ ;;
+ (*)
+ die "function collectd_plugin_kernel_linux called with invalid third argument"
+ ;;
+ esac
+ fi
+ fi
+}
+
+collectd_linux_kernel_checks() {
+ if ! linux_chkconfig_present PROC_FS; then
+ ewarn "/proc file system support is disabled, many plugins will not be able to read any statistics from your system unless you enable PROC_FS in your kernel"
+ fi
+
+ if ! linux_chkconfig_present SYSFS; then
+ ewarn "/sys file system support is disabled, many plugins will not be able to read any statistics from your system unless you enable SYSFS in your kernel"
+ fi
+
+ # battery.c: /proc/pmu/battery_%i
+ # battery.c: /proc/acpi/battery
+ collectd_plugin_kernel_linux battery ACPI_BATTERY warn
+
+ # cgroups.c: /sys/fs/cgroup/
+ collectd_plugin_kernel_linux cgroups CGROUPS warn
+
+ # cpufreq.c: /sys/devices/system/cpu/cpu%d/cpufreq/
+ collectd_plugin_kernel_linux cpufreq SYSFS warn
+ collectd_plugin_kernel_linux cpufreq CPU_FREQ_STAT warn
+
+ # drbd.c: /proc/drbd
+ collectd_plugin_kernel_linux drbd BLK_DEV_DRBD warn
+
+ # conntrack.c: /proc/sys/net/netfilter/*
+ collectd_plugin_kernel_linux conntrack NETFILTER warn
+
+ # fscache.c: /proc/fs/fscache/stats
+ collectd_plugin_kernel_linux fscache FSCACHE warn
+
+ # nfs.c: /proc/net/rpc/nfs
+ # nfs.c: /proc/net/rpc/nfsd
+ collectd_plugin_kernel_linux nfs NFS_COMMON warn
+
+ # serial.c: /proc/tty/driver/serial
+ # serial.c: /proc/tty/driver/ttyS
+ collectd_plugin_kernel_linux serial SERIAL_CORE warn
+
+ # swap.c: /proc/meminfo
+ collectd_plugin_kernel_linux swap SWAP warn
+
+ # thermal.c: /proc/acpi/thermal_zone
+ # thermal.c: /sys/class/thermal
+ collectd_plugin_kernel_linux thermal ACPI_THERMAL warn
+
+ # turbostat.c: /dev/cpu/%d/msr
+ collectd_plugin_kernel_linux turbostat X86_MSR warn
+
+ # vmem.c: /proc/vmstat
+ collectd_plugin_kernel_linux vmem VM_EVENT_COUNTERS warn
+
+ # vserver.c: /proc/virtual
+ collectd_plugin_kernel_linux vserver VSERVER warn
+
+ # uuid.c: /sys/hypervisor/uuid
+ collectd_plugin_kernel_linux uuid SYSFS info
+
+ # wireless.c: /proc/net/wireless
+ collectd_plugin_kernel_linux wireless "WIRELESS MAC80211 IEEE80211" warn
+
+ # zfs_arc.c: /proc/spl/kstat/zfs/arcstats
+ collectd_plugin_kernel_linux zfs_arc "SPL ZFS" warn
+}
+
+pkg_setup() {
+ if use kernel_linux; then
+ linux-info_pkg_setup
+
+ if linux_config_exists; then
+ einfo "Checking your linux kernel configuration:"
+ collectd_linux_kernel_checks
+ else
+ elog "Cannot find a linux kernel configuration. Continuing anyway."
+ fi
+ fi
+
+ if use collectd_plugins_java; then
+ java-pkg-opt-2_pkg_setup
+ fi
+
+ use collectd_plugins_python && python-single-r1_pkg_setup
+
+ enewgroup collectd
+ enewuser collectd -1 -1 /var/lib/collectd collectd
+}
+
+src_prepare() {
+ default
+
+ # There's some strange prefix handling in the default config file, resulting in
+ # paths like "/usr/var/..."
+ sed -i -e "s:@prefix@/var:/var:g" src/collectd.conf.in || die
+
+ # fix installdirs for perl, bug 444360
+ sed -i -e 's/INSTALL_BASE=$(DESTDIR)$(prefix) //' bindings/Makefile.am || die
+
+ # Adjust upstream's systemd unit
+ # - Get rid of EnvironmentFile directive; These files don't exist on Gentoo!
+ # - Add User=collectd to run collectd as user "collectd" per default
+ sed -i \
+ -e '/^EnvironmentFile=.*/d' \
+ -e '/^\[Service\]/aUser=collectd' \
+ contrib/systemd.${PN}.service || die
+
+ if use collectd_plugins_java; then
+ # Set javac -source and -target flags according to (R)DEPEND.
+ sed -i -e "s/\$(JAVAC)/\0 $(java-pkg_javac-args)/g" bindings/java/Makefile.am || die
+ fi
+
+ ebegin "Removing bundled libltdl"
+ rm -rf libltdl || die
+ eend 0
+
+ eautoreconf
+}
+
+src_configure() {
+ # Now come the lists of os-dependent plugins. Any plugin that is not listed anywhere here
+ # should work independent of the operating system.
+
+ local linux_plugins="barometer battery cpu cpufreq disk
+ drbd entropy ethstat hugepages interface iptables
+ ipvs irq ipc load memory md netlink nfs numa processes
+ serial swap tcpconns thermal turbostat users vmem wireless
+ zfc_arc"
+
+ local need_libstatgrab=0
+ local libstatgrab_plugins="cpu disk interface load memory swap users"
+ local bsd_plugins="cpu tcpconns ${libstatgrab_plugins} zfc_arc"
+
+ local darwin_plugins="apple_sensors battery cpu disk interface memory processes tcpconns"
+
+ local osdependent_plugins="${linux_plugins} ${bsd_plugins} ${darwin_plugins}"
+ local myos_plugins=""
+ if use kernel_linux; then
+ einfo "Enabling Linux plugins."
+ myos_plugins=${linux_plugins}
+ elif use kernel_FreeBSD; then
+ einfo "Enabling FreeBSD plugins."
+ myos_plugins=${bsd_plugins}
+ elif use kernel_Darwin; then
+ einfo "Enabling Darwin plugins."
+ myos_plugins=${darwin_plugins}
+ fi
+
+ local myconf="--disable-werror"
+
+ # Do we debug?
+ myconf+=" $(use_enable debug)"
+
+ # udev support?
+ # Required for smart plugin via REQUIRED_USE; Optional for disk plugin
+ if use udev; then
+ myconf+=" --with-libudev"
+ else
+ myconf+=" --without-libudev"
+ fi
+
+ local plugin
+
+ # Disable what needs to be disabled.
+ for plugin in ${COLLECTD_DISABLED_PLUGINS}; do
+ myconf+=" --disable-${plugin}"
+ done
+
+ # Set enable/disable for each single plugin.
+ for plugin in ${COLLECTD_ALL_PLUGINS}; do
+ if has ${plugin} ${osdependent_plugins}; then
+ # plugin is os-dependent ...
+ if has ${plugin} ${myos_plugins}; then
+ # ... and available in this os
+ myconf+=" $(use_enable collectd_plugins_${plugin} ${plugin})"
+ # ... must we link against libstatgrab? Bug #541518
+ if use kernel_FreeBSD && has ${plugin} ${libstatgrab_plugins}; then
+ einfo "We must link against libstatgrab due to plugin \"${plugin}\" ..."
+ need_libstatgrab=1
+ fi
+ else
+ # ... and NOT available in this os
+ if use collectd_plugins_${plugin}; then
+ ewarn "You try to enable the ${plugin} plugin, but it is not available for this"
+ ewarn "kernel. Disabling it automatically."
+ fi
+ myconf+=" --disable-${plugin}"
+ fi
+ elif [[ "${plugin}" = "collectd_plugins_perl" ]]; then
+ if use collectd_plugins_perl && ! use perl; then
+ ewarn "Perl plugin disabled as perl bindings disabled by -perl use flag"
+ myconf+= --disable-perl
+ else
+ myconf+=" $(use_enable collectd_plugins_${plugin} ${plugin})"
+ fi
+ else
+ myconf+=" $(use_enable collectd_plugins_${plugin} ${plugin})"
+ fi
+ done
+
+ if [ "${need_libstatgrab}" -eq 1 ]; then
+ myconf+=" --with-libstatgrab"
+ else
+ myconf+=" --without-libstatgrab"
+ fi
+
+ # JAVA_HOME is set by eclasses.
+ if use collectd_plugins_java; then
+ myconf+=" --with-java"
+ fi
+
+ # Need libiptc ONLY for iptables. If we try to use it otherwise bug 340109 happens.
+ # lots of libs are only needed for plugins, if they are disabled, also disable the lib
+ use collectd_plugins_iptables || myconf+=" --with-libiptc=no"
+ use collectd_plugins_openldap || myconf+=" --with-libldap=no"
+ use collectd_plugins_redis || use collectd_plugins_write_redis || myconf+=" --with-libhiredis=no"
+ use collectd_plugins_smart || myconf+=" --with-libatasmart=no"
+ use collectd_plugins_gps || myconf+=" --with-libgps=no"
+
+ if use perl; then
+ myconf+=" --with-perl-bindings=INSTALLDIRS=vendor"
+ else
+ myconf+=" --without-perl-bindings"
+ fi
+
+ # No need for v5upgrade
+ myconf+=" --disable-target_v5upgrade"
+
+ # Python
+ if use collectd_plugins_python; then
+ myconf+=" --with-libpython=yes"
+ export PYTHON_CONFIG=$(python_get_PYTHON_CONFIG)
+ else
+ myconf+=" --with-libpython=no"
+ fi
+
+ # XFS support
+ myconf+=" $(use_enable xfs)"
+
+ # Finally, run econf.
+ KERNEL_DIR="${KERNEL_DIR}" econf --config-cache \
+ $(use_enable static-libs static) \
+ --localstatedir=/var ${myconf}
+}
+
+src_install() {
+ emake DESTDIR="${D%/}" install
+
+ perl_delete_localpod
+
+ find "${ED}"usr/ -name "*.la" -delete || die
+
+ if use collectd_plugins_java; then
+ java-pkg_regjar "${ED}"usr/share/${PN}/java/*.jar
+ fi
+
+ fowners root:collectd /etc/collectd.conf
+ fperms u=rw,g=r,o= /etc/collectd.conf
+
+ dodoc AUTHORS ChangeLog README
+
+ if use contrib ; then
+ insinto /usr/share/doc/${PF}
+ doins -r contrib
+ fi
+
+ keepdir /var/lib/${PN}
+ fowners collectd:collectd /var/lib/${PN}
+
+ newinitd "${FILESDIR}/${PN}.initd-r2" ${PN}
+ newconfd "${FILESDIR}/${PN}.confd-r2" ${PN}
+ systemd_newunit "contrib/systemd.${PN}.service" ${PN}.service
+
+ insinto /etc/logrotate.d
+ newins "${FILESDIR}/${PN}.logrotate" ${PN}
+
+ newtmpfiles "${FILESDIR}"/${PN}.tmpfile ${PN}.conf
+
+ sed -i -e 's:^.*PIDFile "/var/run/collectd.pid":#PIDFile "/run/collectd.pid":' "${ED}"etc/collectd.conf || die
+ sed -i -e 's:^# SocketFile "/var/run/collectd-unixsock":# SocketFile "/run/collectd/collectd.socket":' "${ED}"etc/collectd.conf || die
+ sed -i -e 's:^.*LoadPlugin perl$:# The new, correct way to load the perl plugin -- \n# <LoadPlugin perl>\n# Globals true\n# </LoadPlugin>:' "${ED}"etc/collectd.conf || die
+ sed -i -e 's:^.*LoadPlugin python$:# The new, correct way to load the python plugin -- \n# <LoadPlugin python>\n# Globals true\n# </LoadPlugin>:' "${ED}"etc/collectd.conf || die
+}
+
+pkg_postinst() {
+ tmpfiles_process "${PN}.conf"
+
+ if use filecaps; then
+ local caps=()
+ use collectd_plugins_ceph && caps+=('CAP_DAC_OVERRIDE')
+ use collectd_plugins_exec && caps+=('CAP_SETUID' 'CAP_SETGID')
+ use collectd_plugins_iptables && caps+=('CAP_NET_ADMIN')
+ use collectd_plugins_filecount && caps+=('CAP_DAC_READ_SEARCH')
+
+ if use collectd_plugins_dns || use collectd_plugins_ping; then
+ caps+=('CAP_NET_RAW')
+ fi
+
+ if use collectd_plugins_turbostat || use collectd_plugins_smart; then
+ caps+=('CAP_SYS_RAWIO')
+ fi
+
+ if [ ${#caps[@]} -gt 0 ]; then
+ local caps_str=$(IFS=","; echo "${caps[*]}")
+ fcaps ${caps_str} usr/sbin/collectd
+ elog "Capabilities for ${EROOT}usr/sbin/collectd set to:"
+ elog " ${caps_str}+EP"
+ elog
+
+ local systemd_unit="$(systemd_get_systemunitdir)/collectd.service"
+ if [[ -e "${systemd_unit}" ]]; then
+ caps_str="${caps[*]}"
+ sed -i -e "s:^CapabilityBoundingSet=.*:CapabilityBoundingSet=${caps_str}:" "${systemd_unit}" || \
+ die "Failed to set CapabilityBoundingSet in '${systemd_unit}'"
+
+ elog "CapabilityBoundingSet in '${systemd_unit}'"
+ elog "updated to match capabilities set above."
+ elog
+ else
+ if has_version "sys-apps/systemd"; then
+ # Bug 596852
+ ewarn "Failed to update CapabilityBondingSet in '${systemd_unit}'"
+ ewarn "because unit was not found. Please file a bug about this."
+ fi
+ fi
+ fi
+ fi
+
+ elog "Note: Collectd is only the collector."
+ elog " You need to install 'data' sources (applications) locally or"
+ elog " remotely on your own."
+
+ elog
+ elog "Collectd is configured to run as unprivileged user by default."
+ elog "You may want to revisit the configuration."
+ elog
+
+ if use collectd_plugins_email; then
+ ewarn "The email plug-in is deprecated. To submit statistics please use the unixsock plugin."
+ fi
+
+ if use collectd_plugins_smart; then
+ elog ""
+ elog "If you are using smart plugin and don't run collectd as root make sure"
+ elog "that the collectd user is allowed to access the disk you want to monitor"
+ elog "(can be done via udev rule for example) and that collectd has the required"
+ elog "capabilities set (which is the default when package was emerged with"
+ elog "'filecaps' USE flag set)."
+ fi
+
+ if use contrib; then
+ elog "The scripts in /usr/share/doc/${PF}/collection3 for generating graphs need dev-perl/HTML-Parser,"
+ elog "dev-perl/config-general, dev-perl/regexp-common, and net-analyzer/rrdtool[perl] to be installed."
+ fi
+}
diff --git a/app-metrics/collectd/files/collectd-5.6.0-gentoo.patch b/app-metrics/collectd/files/collectd-5.6.0-gentoo.patch
new file mode 100644
index 000000000000..dd8c1576354c
--- /dev/null
+++ b/app-metrics/collectd/files/collectd-5.6.0-gentoo.patch
@@ -0,0 +1,153 @@
+From 8fe20883e248572690798e4dd1423511aa2f4e5d Mon Sep 17 00:00:00 2001
+From: Thomas Deutschmann <whissi@gentoo.org>
+Date: Thu, 22 Sep 2016 00:53:58 +0200
+Subject: [PATCH 1/3] Remove bundled libltdl
+
+---
+ Makefile.am | 6 ------
+ configure.ac | 8 ++++----
+ 2 files changed, 4 insertions(+), 10 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 03bdd39..ad04a3c 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1,11 +1,5 @@
+-ACLOCAL_AMFLAGS = -I libltdl/m4
+-
+ SUBDIRS =
+
+-if BUILD_INCLUDED_LTDL
+-SUBDIRS += libltdl
+-endif
+-
+ SUBDIRS += proto src bindings .
+
+ AM_CPPFLAGS = $(LTDLINCL)
+diff --git a/configure.ac b/configure.ac
+index 9a6da11..68e15e0 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -3,7 +3,6 @@ AC_PREREQ([2.60])
+ AC_INIT([collectd],[m4_esyscmd(./version-gen.sh)])
+ AC_CONFIG_SRCDIR(src/target_set.c)
+ AC_CONFIG_HEADERS(src/config.h)
+-AC_CONFIG_AUX_DIR([libltdl/config])
+
+ dnl older automake's default of ARFLAGS=cru is noisy on newer binutils;
+ dnl we don't really need the 'u' even in older toolchains. Then there is
+@@ -13,7 +12,6 @@ m4_divert_text([DEFAULTS], [: "${ARFLAGS=cr} ${AR_FLAGS=cr}"])
+ m4_ifdef([LT_PACKAGE_VERSION],
+ # libtool >= 2.2
+ [
+- LT_CONFIG_LTDL_DIR([libltdl])
+ LT_INIT([dlopen])
+ LTDL_INIT([convenience])
+ AC_DEFINE(LIBTOOL_VERSION, 2, [Define to used libtool version.])
+@@ -25,12 +23,14 @@ m4_ifdef([LT_PACKAGE_VERSION],
+ AC_SUBST(LTDLINCL)
+ AC_SUBST(LIBLTDL)
+ AC_LIBTOOL_DLOPEN
+- AC_CONFIG_SUBDIRS(libltdl)
+ AC_DEFINE(LIBTOOL_VERSION, 1, [Define to used libtool version.])
+ ]
+ )
+
+-AM_CONDITIONAL([BUILD_INCLUDED_LTDL], [test "x$LTDLDEPS" != "x"])
++if test "x$LTDLDEPS" != "x"
++then
++ AC_MSG_ERROR(["system's libltdl is too old! Should never happen. Please file a bug at https://bugs.gentoo.org"])
++fi
+
+ AM_INIT_AUTOMAKE([subdir-objects tar-pax dist-bzip2 no-dist-gzip foreign])
+ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+--
+2.10.0
+
+
+From 0b00f519ce183b8ceaab5cf8e56f574ecd2cb7c4 Mon Sep 17 00:00:00 2001
+From: Thomas Deutschmann <whissi@gentoo.org>
+Date: Thu, 22 Sep 2016 00:54:08 +0200
+Subject: [PATCH 2/3] Remove libhal dependency
+
+X-Gentoo-Bug: 353839
+X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=353839
+---
+ configure.ac | 24 ------------------------
+ 1 file changed, 24 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 68e15e0..1700c44 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1663,30 +1663,6 @@ AM_CONDITIONAL(BUILD_WITH_LIBRESOLV, test "x$with_libresolv" = "xyes")
+
+ dnl Check for HAL (hardware abstraction library)
+ with_libhal="no"
+-PKG_CHECK_MODULES([HAL], [hal],
+- [
+- SAVE_LIBS="$LIBS"
+- LIBS="$HAL_LIBS $LIBS"
+- AC_CHECK_LIB([hal], [libhal_device_property_exists],
+- [
+- SAVE_CPPFLAGS="$CPPFLAGS"
+- CPPFLAGS="$HAL_CFLAGS $CPPFLAGS"
+- AC_CHECK_HEADERS([libhal.h],
+- [
+- with_libhal="yes"
+- BUILD_WITH_LIBHAL_CFLAGS="$HAL_CFLAGS"
+- BUILD_WITH_LIBHAL_LIBS="$HAL_LIBS"
+- ])
+- CPPFLAGS="$SAVE_CPPFLAGS"
+- ],
+- [ : ]
+- )
+- LIBS="$SAVE_LIBS"
+- ],
+- [ : ]
+-)
+-AC_SUBST(BUILD_WITH_LIBHAL_CFLAGS)
+-AC_SUBST(BUILD_WITH_LIBHAL_LIBS)
+
+
+ SAVE_LIBS="$LIBS"
+--
+2.10.0
+
+
+From 380c61888bed5856319fa32816d8f2f4c88ee7bc Mon Sep 17 00:00:00 2001
+From: Thomas Deutschmann <whissi@gentoo.org>
+Date: Thu, 22 Sep 2016 00:54:19 +0200
+Subject: [PATCH 3/3] Link Oracle plug-in against libocci
+
+Author: Aurelien Minet
+X-Gentoo-Bug: 347607
+X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=347607
+---
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 1700c44..83909a0 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -3587,14 +3587,14 @@ AC_ARG_WITH(oracle, [AS_HELP_STRING([--with-oracle@<:@=ORACLE_HOME@:>@], [Path t
+ ])
+ if test "x$ORACLE_HOME" != "x"
+ then
+- with_oracle_cppflags="-I$ORACLE_HOME/rdbms/public"
++ with_oracle_cppflags="-I$ORACLE_HOME/rdbms/public -locci"
+
+ if test -e "$ORACLE_HOME/lib/ldflags"
+ then
+ with_oracle_libs=`cat "$ORACLE_HOME/lib/ldflags"`
+ fi
+ #with_oracle_libs="-L$ORACLE_HOME/lib $with_oracle_libs -lclntsh"
+- with_oracle_libs="-L$ORACLE_HOME/lib -lclntsh"
++ with_oracle_libs="-L$ORACLE_HOME/lib -lclntsh -locci"
+ fi
+ if test "x$with_oracle" = "xyes"
+ then
+--
+2.10.0
+
diff --git a/app-metrics/collectd/files/collectd-5.7.2-CVE-2017-16820.patch b/app-metrics/collectd/files/collectd-5.7.2-CVE-2017-16820.patch
new file mode 100644
index 000000000000..0090f2940bf6
--- /dev/null
+++ b/app-metrics/collectd/files/collectd-5.7.2-CVE-2017-16820.patch
@@ -0,0 +1,39 @@
+CVE-2017-16820: Fix double free of request PDU
+
+https://github.com/collectd/collectd/commit/d16c24542b2f96a194d43a73c2e5778822b9cb47
+
+--- a/src/snmp.c
++++ b/src/snmp.c
+@@ -1357,11 +1357,13 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
+ if (oid_list_todo_num == 0) {
+ /* The request is still empty - so we are finished */
+ DEBUG("snmp plugin: all variables have left their subtree");
++ snmp_free_pdu(req);
+ status = 0;
+ break;
+ }
+
+ res = NULL;
++ /* snmp_sess_synch_response always frees our req PDU */
+ status = snmp_sess_synch_response(host->sess_handle, req, &res);
+ if ((status != STAT_SUCCESS) || (res == NULL)) {
+ char *errstr = NULL;
+@@ -1376,8 +1378,6 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
+ snmp_free_pdu(res);
+ res = NULL;
+
+- /* snmp_synch_response already freed our PDU */
+- req = NULL;
+ sfree(errstr);
+ csnmp_host_close_session(host);
+
+@@ -1492,9 +1492,6 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
+ snmp_free_pdu(res);
+ res = NULL;
+
+- if (req != NULL)
+- snmp_free_pdu(req);
+- req = NULL;
+
+ if (status == 0)
+ csnmp_dispatch_table(host, data, instance_list_head, value_list_head);
diff --git a/app-metrics/collectd/files/collectd-5.7.2-issue-2443.patch b/app-metrics/collectd/files/collectd-5.7.2-issue-2443.patch
new file mode 100644
index 000000000000..19410c139b0a
--- /dev/null
+++ b/app-metrics/collectd/files/collectd-5.7.2-issue-2443.patch
@@ -0,0 +1,160 @@
+turbostat: import msr-index header from linux to allow building against
+ >=linux-4.12
+
+Backport of https://github.com/collectd/collectd/pull/2446
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -805,28 +805,6 @@ AC_CACHE_CHECK([whether clock_boottime and clock_monotonic are supported],
+
+
+ # For the turbostat plugin
+-have_asm_msrindex_h="no"
+-AC_CHECK_HEADERS(asm/msr-index.h, [have_asm_msrindex_h="yes"])
+-
+-if test "x$have_asm_msrindex_h" = "xyes"
+-then
+- AC_CACHE_CHECK([whether asm/msr-index.h has MSR_PKG_C10_RESIDENCY],
+- [c_cv_have_usable_asm_msrindex_h],
+- AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+-[[[
+-#include<asm/msr-index.h>
+-]]],
+-[[[
+-int y = MSR_PKG_C10_RESIDENCY;
+-return(y);
+-]]]
+- )],
+- [c_cv_have_usable_asm_msrindex_h="yes"],
+- [c_cv_have_usable_asm_msrindex_h="no"],
+- )
+- )
+-fi
+-
+ have_cpuid_h="no"
+ AC_CHECK_HEADERS(cpuid.h, [have_cpuid_h="yes"])
+
+@@ -6108,7 +6086,7 @@ then
+ then
+ plugin_ipvs="yes"
+ fi
+- if test "x$c_cv_have_usable_asm_msrindex_h" = "xyes" && test "x$have_cpuid_h" = "xyes"
++ if test "x$have_cpuid_h" = "xyes"
+ then
+ plugin_turbostat="yes"
+ fi
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -1212,7 +1212,9 @@ endif
+
+ if BUILD_PLUGIN_TURBOSTAT
+ pkglib_LTLIBRARIES += turbostat.la
+-turbostat_la_SOURCES = turbostat.c
++turbostat_la_SOURCES = \
++ turbostat.c \
++ msr-index.h
+ turbostat_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+ endif
+
+--- /dev/null
++++ b/src/msr-index.h
+@@ -0,0 +1,88 @@
++/*
++ * Partial header file imported from the linux kernel
++ * (arch/x86/include/asm/msr-index.h)
++ * as it is not provided by the kernel sources anymore
++ *
++ * Only the minimal blocks of macro have been included
++ * ----
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc.,
++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
++ * ----
++ */
++
++#ifndef _ASM_X86_MSR_INDEX_H
++#define _ASM_X86_MSR_INDEX_H
++
++/*
++ * CPU model specific register (MSR) numbers.
++ *
++ * Do not add new entries to this file unless the definitions are shared
++ * between multiple compilation units.
++ */
++
++/* Intel MSRs. Some also available on other CPUs */
++
++/* C-state Residency Counters */
++#define MSR_PKG_C3_RESIDENCY 0x000003f8
++#define MSR_PKG_C6_RESIDENCY 0x000003f9
++#define MSR_ATOM_PKG_C6_RESIDENCY 0x000003fa
++#define MSR_PKG_C7_RESIDENCY 0x000003fa
++#define MSR_CORE_C3_RESIDENCY 0x000003fc
++#define MSR_CORE_C6_RESIDENCY 0x000003fd
++#define MSR_CORE_C7_RESIDENCY 0x000003fe
++#define MSR_KNL_CORE_C6_RESIDENCY 0x000003ff
++#define MSR_PKG_C2_RESIDENCY 0x0000060d
++#define MSR_PKG_C8_RESIDENCY 0x00000630
++#define MSR_PKG_C9_RESIDENCY 0x00000631
++#define MSR_PKG_C10_RESIDENCY 0x00000632
++
++/* Run Time Average Power Limiting (RAPL) Interface */
++
++#define MSR_RAPL_POWER_UNIT 0x00000606
++
++#define MSR_PKG_POWER_LIMIT 0x00000610
++#define MSR_PKG_ENERGY_STATUS 0x00000611
++#define MSR_PKG_PERF_STATUS 0x00000613
++#define MSR_PKG_POWER_INFO 0x00000614
++
++#define MSR_DRAM_POWER_LIMIT 0x00000618
++#define MSR_DRAM_ENERGY_STATUS 0x00000619
++#define MSR_DRAM_PERF_STATUS 0x0000061b
++#define MSR_DRAM_POWER_INFO 0x0000061c
++
++#define MSR_PP0_POWER_LIMIT 0x00000638
++#define MSR_PP0_ENERGY_STATUS 0x00000639
++#define MSR_PP0_POLICY 0x0000063a
++#define MSR_PP0_PERF_STATUS 0x0000063b
++
++#define MSR_PP1_POWER_LIMIT 0x00000640
++#define MSR_PP1_ENERGY_STATUS 0x00000641
++#define MSR_PP1_POLICY 0x00000642
++
++
++
++/* Intel defined MSRs. */
++#define MSR_IA32_TSC 0x00000010
++#define MSR_SMI_COUNT 0x00000034
++
++#define MSR_IA32_MPERF 0x000000e7
++#define MSR_IA32_APERF 0x000000e8
++
++#define MSR_IA32_THERM_STATUS 0x0000019c
++
++#define MSR_IA32_TEMPERATURE_TARGET 0x000001a2
++
++#define MSR_IA32_PACKAGE_THERM_STATUS 0x000001b1
++
++
++#endif /* _ASM_X86_MSR_INDEX_H */
+--- a/src/turbostat.c
++++ b/src/turbostat.c
+@@ -41,7 +41,7 @@
+ #include "plugin.h"
+ #include "utils_time.h"
+
+-#include <asm/msr-index.h>
++#include "msr-index.h"
+ #include <cpuid.h>
+ #ifdef HAVE_SYS_CAPABILITY_H
+ #include <sys/capability.h>
diff --git a/app-metrics/collectd/files/collectd-5.7.2-varnish-5.2+.patch b/app-metrics/collectd/files/collectd-5.7.2-varnish-5.2+.patch
new file mode 100644
index 000000000000..60830042fa6a
--- /dev/null
+++ b/app-metrics/collectd/files/collectd-5.7.2-varnish-5.2+.patch
@@ -0,0 +1,1018 @@
+Fix building against >=www-servers/varnish-5.2
+
+https://github.com/collectd/collectd/commit/3c42182e912e3d634fe8c4f6a636053959fcde49
+https://github.com/collectd/collectd/commit/3ab73ae8b23b9816fb69fde630c5ad667aa1e09f
+https://github.com/collectd/collectd/commit/7978b43670472a000831f7ff37a6a30771a6ee6f
+https://github.com/collectd/collectd/commit/68123637814ea09efff5bf56f3209eefbe41287a
+https://github.com/collectd/collectd/commit/8192bfcf975ff6275505c99193a23e2a066927d0
+https://github.com/collectd/collectd/commit/c1e2bf3d2bfa1a1da3a6b42186577f635795e7f8
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -5614,13 +5614,18 @@ then
+
+ CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
+
+- AC_CHECK_HEADERS(vapi/vsc.h,
+- [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
+- [AC_CHECK_HEADERS(vsc.h,
+- [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
+- [AC_CHECK_HEADERS(varnishapi.h,
+- [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
+- [with_libvarnish="no (found none of the varnish header files)"])])])
++ $PKG_CONFIG --atleast-version=5.2 'varnishapi' 2>/dev/null
++ if test $? -eq 0; then
++ AC_DEFINE([HAVE_VARNISH_V5], [1], [Varnish 5 API support])
++ else
++ AC_CHECK_HEADERS(vapi/vsc.h,
++ [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
++ [AC_CHECK_HEADERS(vsc.h,
++ [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
++ [AC_CHECK_HEADERS(varnishapi.h,
++ [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
++ [with_libvarnish="no (found none of the varnish header files)"])])])
++ fi
+
+ CPPFLAGS="$SAVE_CPPFLAGS"
+ fi
+--- a/src/varnish.c
++++ b/src/varnish.c
+@@ -21,6 +21,7 @@
+ * Jérôme Renard <jerome.renard at gmail.com>
+ * Marc Fournier <marc.fournier at camptocamp.com>
+ * Florian octo Forster <octo at collectd.org>
++ * Denes Matetelki <dmatetelki at varnish-software.com>
+ **/
+
+ #include "collectd.h"
+@@ -28,7 +29,7 @@
+ #include "common.h"
+ #include "plugin.h"
+
+-#if HAVE_VARNISH_V4
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ #include <vapi/vsc.h>
+ #include <vapi/vsm.h>
+ typedef struct VSC_C_main c_varnish_stats_t;
+@@ -69,17 +70,25 @@ struct user_config_s {
+ _Bool collect_sms;
+ #if HAVE_VARNISH_V2
+ _Bool collect_sm;
++#endif
++#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ _Bool collect_sma;
+ #endif
+ _Bool collect_struct;
+ _Bool collect_totals;
+-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ _Bool collect_uptime;
+ #endif
+ _Bool collect_vcl;
+ _Bool collect_workers;
+-#if HAVE_VARNISH_V4
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ _Bool collect_vsm;
++ _Bool collect_lck;
++ _Bool collect_mempool;
++ _Bool collect_mgt;
++ _Bool collect_smf;
++ _Bool collect_vbe;
++ _Bool collect_mse;
+ #endif
+ };
+ typedef struct user_config_s user_config_t; /* }}} */
+@@ -98,60 +107,70 @@ static int varnish_submit(const char *plugin_instance, /* {{{ */
+
+ if (plugin_instance == NULL)
+ plugin_instance = "default";
+- ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s-%s",
+- plugin_instance, category);
++ snprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s-%s",
++ plugin_instance, category);
+
+ sstrncpy(vl.type, type, sizeof(vl.type));
+
+ if (type_instance != NULL)
+ sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
+
+- return (plugin_dispatch_values(&vl));
++ return plugin_dispatch_values(&vl);
+ } /* }}} int varnish_submit */
+
+ static int varnish_submit_gauge(const char *plugin_instance, /* {{{ */
+ const char *category, const char *type,
+ const char *type_instance,
+ uint64_t gauge_value) {
+- return (varnish_submit(plugin_instance, category, type, type_instance,
+- (value_t){.gauge = (gauge_t)gauge_value}));
++ return varnish_submit(plugin_instance, category, type, type_instance,
++ (value_t){
++ .gauge = (gauge_t)gauge_value,
++ });
+ } /* }}} int varnish_submit_gauge */
+
+ static int varnish_submit_derive(const char *plugin_instance, /* {{{ */
+ const char *category, const char *type,
+ const char *type_instance,
+ uint64_t derive_value) {
+- return (varnish_submit(plugin_instance, category, type, type_instance,
+- (value_t){.derive = (derive_t)derive_value}));
++ return varnish_submit(plugin_instance, category, type, type_instance,
++ (value_t){
++ .derive = (derive_t)derive_value,
++ });
+ } /* }}} int varnish_submit_derive */
+
+-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ static int varnish_monitor(void *priv,
+ const struct VSC_point *const pt) /* {{{ */
+ {
+ uint64_t val;
+ const user_config_t *conf;
+- const char *class;
+ const char *name;
+
+ if (pt == NULL)
+- return (0);
++ return 0;
+
+ conf = priv;
+
+-#if HAVE_VARNISH_V4
+- class = pt->section->fantom->type;
+- name = pt->desc->name;
++#if HAVE_VARNISH_V5
++ char namebuff[DATA_MAX_NAME_LEN];
+
+- if (strcmp(class, "MAIN") != 0)
+- return (0);
++ char const *c = strrchr(pt->name, '.');
++ if (c == NULL) {
++ return EINVAL;
++ }
++ sstrncpy(namebuff, c + 1, sizeof(namebuff));
++ name = namebuff;
++
++#elif HAVE_VARNISH_V4
++ if (strcmp(pt->section->fantom->type, "MAIN") != 0)
++ return 0;
+
++ name = pt->desc->name;
+ #elif HAVE_VARNISH_V3
+- class = pt->class;
+- name = pt->name;
++ if (strcmp(pt->class, "") != 0)
++ return 0;
+
+- if (strcmp(class, "") != 0)
+- return (0);
++ name = pt->name;
+ #endif
+
+ val = *(const volatile uint64_t *)pt->ptr;
+@@ -178,6 +197,14 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "client_req") == 0)
+ return varnish_submit_derive(conf->instance, "connections", "connections",
+ "received", val);
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ else if (strcmp(name, "client_req_400") == 0)
++ return varnish_submit_derive(conf->instance, "connections", "connections",
++ "error_400", val);
++ else if (strcmp(name, "client_req_417") == 0)
++ return varnish_submit_derive(conf->instance, "connections", "connections",
++ "error_417", val);
++#endif
+ }
+
+ #ifdef HAVE_VARNISH_V3
+@@ -207,6 +234,9 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "esi_warnings") == 0)
+ return varnish_submit_derive(conf->instance, "esi", "total_operations",
+ "warning", val);
++ else if (strcmp(name, "esi_maxdepth") == 0)
++ return varnish_submit_derive(conf->instance, "esi", "total_operations",
++ "max_depth", val);
+ }
+
+ if (conf->collect_backend) {
+@@ -282,6 +312,20 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "fetch_304") == 0)
+ return varnish_submit_derive(conf->instance, "fetch", "http_requests",
+ "no_body_304", val);
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ else if (strcmp(name, "fetch_no_thread") == 0)
++ return varnish_submit_derive(conf->instance, "fetch", "http_requests",
++ "no_thread", val);
++ else if (strcmp(name, "fetch_none") == 0)
++ return varnish_submit_derive(conf->instance, "fetch", "http_requests",
++ "none", val);
++ else if (strcmp(name, "busy_sleep") == 0)
++ return varnish_submit_derive(conf->instance, "fetch", "http_requests",
++ "busy_sleep", val);
++ else if (strcmp(name, "busy_wakeup") == 0)
++ return varnish_submit_derive(conf->instance, "fetch", "http_requests",
++ "busy_wakeup", val);
++#endif
+ }
+
+ if (conf->collect_hcb) {
+@@ -327,6 +371,14 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "n_objoverflow") == 0)
+ return varnish_submit_derive(conf->instance, "objects", "total_objects",
+ "workspace_overflow", val);
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ else if (strcmp(name, "exp_mailed") == 0)
++ return varnish_submit_gauge(conf->instance, "struct", "objects",
++ "exp_mailed", val);
++ else if (strcmp(name, "exp_received") == 0)
++ return varnish_submit_gauge(conf->instance, "struct", "objects",
++ "exp_received", val);
++#endif
+ }
+
+ #if HAVE_VARNISH_V3
+@@ -351,7 +403,7 @@ static int varnish_monitor(void *priv,
+ "duplicate", val);
+ }
+ #endif
+-#if HAVE_VARNISH_V4
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ if (conf->collect_ban) {
+ if (strcmp(name, "bans") == 0)
+ return varnish_submit_derive(conf->instance, "ban", "total_operations",
+@@ -377,6 +429,33 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "bans_dups") == 0)
+ return varnish_submit_derive(conf->instance, "ban", "total_operations",
+ "duplicate", val);
++ else if (strcmp(name, "bans_tested") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "tested", val);
++ else if (strcmp(name, "bans_lurker_contention") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "lurker_contention", val);
++ else if (strcmp(name, "bans_lurker_obj_killed") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "lurker_obj_killed", val);
++ else if (strcmp(name, "bans_lurker_tested") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "lurker_tested", val);
++ else if (strcmp(name, "bans_lurker_tests_tested") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "lurker_tests_tested", val);
++ else if (strcmp(name, "bans_obj_killed") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "obj_killed", val);
++ else if (strcmp(name, "bans_persisted_bytes") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_bytes",
++ "persisted_bytes", val);
++ else if (strcmp(name, "bans_persisted_fragmentation") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_bytes",
++ "persisted_fragmentation", val);
++ else if (strcmp(name, "bans_tests_tested") == 0)
++ return varnish_submit_derive(conf->instance, "ban", "total_operations",
++ "tests_tested", val);
+ }
+ #endif
+
+@@ -411,6 +490,15 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "sess_herd") == 0)
+ return varnish_submit_derive(conf->instance, "session",
+ "total_operations", "herd", val);
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ else if (strcmp(name, "sess_closed_err") == 0)
++ return varnish_submit_derive(conf->instance, "session",
++ "total_operations", "closed_err", val);
++ else if (strcmp(name, "sess_dropped") == 0)
++ return varnish_submit_derive(conf->instance, "session",
++ "total_operations", "dropped_for_thread",
++ val);
++#endif
+ }
+
+ if (conf->collect_shm) {
+@@ -510,12 +598,18 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "s_req_bodybytes") == 0)
+ return varnish_submit_derive(conf->instance, "totals", "total_bytes",
+ "req_body", val);
++ else if (strcmp(name, "s_req_protobytes") == 0)
++ return varnish_submit_derive(conf->instance, "totals", "total_bytes",
++ "req_proto", val);
+ else if (strcmp(name, "s_resp_hdrbytes") == 0)
+ return varnish_submit_derive(conf->instance, "totals", "total_bytes",
+ "resp_header", val);
+ else if (strcmp(name, "s_resp_bodybytes") == 0)
+ return varnish_submit_derive(conf->instance, "totals", "total_bytes",
+ "resp_body", val);
++ else if (strcmp(name, "s_resp_protobytes") == 0)
++ return varnish_submit_derive(conf->instance, "totals", "total_bytes",
++ "resp_proto", val);
+ else if (strcmp(name, "s_pipe_hdrbytes") == 0)
+ return varnish_submit_derive(conf->instance, "totals", "total_bytes",
+ "pipe_header", val);
+@@ -580,8 +674,8 @@ static int varnish_monitor(void *priv,
+ return varnish_submit_derive(conf->instance, "workers", "total_threads",
+ "dropped", val);
+ else if (strcmp(name, "thread_queue_len") == 0)
+- return varnish_submit_derive(conf->instance, "workers", "queue_length",
+- "threads", val);
++ return varnish_submit_gauge(conf->instance, "workers", "queue_length",
++ "threads", val);
+ else if (strcmp(name, "n_wrk") == 0)
+ return varnish_submit_gauge(conf->instance, "workers", "threads",
+ "worker", val);
+@@ -609,9 +703,17 @@ static int varnish_monitor(void *priv,
+ else if (strcmp(name, "n_wrk_lqueue") == 0)
+ return varnish_submit_derive(conf->instance, "workers", "total_requests",
+ "queue_length", val);
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ else if (strcmp(name, "pools") == 0)
++ return varnish_submit_gauge(conf->instance, "workers", "pools", "pools",
++ val);
++ else if (strcmp(name, "busy_killed") == 0)
++ return varnish_submit_derive(conf->instance, "workers", "http_requests",
++ "busy_killed", val);
++#endif
+ }
+
+-#if HAVE_VARNISH_V4
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ if (conf->collect_vsm) {
+ if (strcmp(name, "vsm_free") == 0)
+ return varnish_submit_gauge(conf->instance, "vsm", "bytes", "free", val);
+@@ -627,9 +729,262 @@ static int varnish_monitor(void *priv,
+ return varnish_submit_derive(conf->instance, "vsm", "total_bytes",
+ "overflowed", val);
+ }
++
++ if (conf->collect_vbe) {
++ /* @TODO figure out the collectd type for bitmap
++ if (strcmp(name, "happy") == 0)
++ return varnish_submit_derive(conf->instance, "vbe",
++ "bitmap", "happy_hprobes", val);
++ */
++ if (strcmp(name, "bereq_hdrbytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "bereq_hdrbytes", val);
++ else if (strcmp(name, "bereq_bodybytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "bereq_bodybytes", val);
++ else if (strcmp(name, "bereq_protobytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "bereq_protobytes", val);
++ else if (strcmp(name, "beresp_hdrbytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "beresp_hdrbytes", val);
++ else if (strcmp(name, "beresp_bodybytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "beresp_bodybytes", val);
++ else if (strcmp(name, "beresp_protobytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "beresp_protobytes", val);
++ else if (strcmp(name, "pipe_hdrbytes") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "pipe_hdrbytes", val);
++ else if (strcmp(name, "pipe_out") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "pipe_out", val);
++ else if (strcmp(name, "pipe_in") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
++ "pipe_in", val);
++ else if (strcmp(name, "conn") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "connections",
++ "c_conns", val);
++ else if (strcmp(name, "req") == 0)
++ return varnish_submit_derive(conf->instance, "vbe", "http_requests",
++ "b_reqs", val);
++ }
++
++ /* All Stevedores support these counters */
++ if (conf->collect_sma || conf->collect_smf || conf->collect_mse) {
++
++ char category[4];
++ if (conf->collect_sma)
++ strncpy(category, "sma", 4);
++ else if (conf->collect_smf)
++ strncpy(category, "smf", 4);
++ else
++ strncpy(category, "mse", 4);
++
++ if (strcmp(name, "c_req") == 0)
++ return varnish_submit_derive(conf->instance, category, "total_operations",
++ "alloc_req", val);
++ else if (strcmp(name, "c_fail") == 0)
++ return varnish_submit_derive(conf->instance, category, "total_operations",
++ "alloc_fail", val);
++ else if (strcmp(name, "c_bytes") == 0)
++ return varnish_submit_derive(conf->instance, category, "total_bytes",
++ "bytes_allocated", val);
++ else if (strcmp(name, "c_freed") == 0)
++ return varnish_submit_derive(conf->instance, category, "total_bytes",
++ "bytes_freed", val);
++ else if (strcmp(name, "g_alloc") == 0)
++ return varnish_submit_derive(conf->instance, category, "total_operations",
++ "alloc_outstanding", val);
++ else if (strcmp(name, "g_bytes") == 0)
++ return varnish_submit_gauge(conf->instance, category, "bytes",
++ "bytes_outstanding", val);
++ else if (strcmp(name, "g_space") == 0)
++ return varnish_submit_gauge(conf->instance, category, "bytes",
++ "bytes_available", val);
++ }
++
++ /* No SMA specific counters */
++
++ if (conf->collect_smf) {
++ if (strcmp(name, "g_smf") == 0)
++ return varnish_submit_gauge(conf->instance, "smf", "objects",
++ "n_struct_smf", val);
++ else if (strcmp(name, "g_smf_frag") == 0)
++ return varnish_submit_gauge(conf->instance, "smf", "objects",
++ "n_small_free_smf", val);
++ else if (strcmp(name, "g_smf_large") == 0)
++ return varnish_submit_gauge(conf->instance, "smf", "objects",
++ "n_large_free_smf", val);
++ }
++
++ if (conf->collect_mgt) {
++ if (strcmp(name, "uptime") == 0)
++ return varnish_submit_gauge(conf->instance, "mgt", "uptime",
++ "mgt_proc_uptime", val);
++ else if (strcmp(name, "child_start") == 0)
++ return varnish_submit_derive(conf->instance, "mgt", "total_operations",
++ "child_start", val);
++ else if (strcmp(name, "child_exit") == 0)
++ return varnish_submit_derive(conf->instance, "mgt", "total_operations",
++ "child_exit", val);
++ else if (strcmp(name, "child_stop") == 0)
++ return varnish_submit_derive(conf->instance, "mgt", "total_operations",
++ "child_stop", val);
++ else if (strcmp(name, "child_died") == 0)
++ return varnish_submit_derive(conf->instance, "mgt", "total_operations",
++ "child_died", val);
++ else if (strcmp(name, "child_dump") == 0)
++ return varnish_submit_derive(conf->instance, "mgt", "total_operations",
++ "child_dump", val);
++ else if (strcmp(name, "child_panic") == 0)
++ return varnish_submit_derive(conf->instance, "mgt", "total_operations",
++ "child_panic", val);
++ }
++
++ if (conf->collect_lck) {
++ if (strcmp(name, "creat") == 0)
++ return varnish_submit_gauge(conf->instance, "lck", "objects", "created",
++ val);
++ else if (strcmp(name, "destroy") == 0)
++ return varnish_submit_gauge(conf->instance, "lck", "objects", "destroyed",
++ val);
++ else if (strcmp(name, "locks") == 0)
++ return varnish_submit_derive(conf->instance, "lck", "total_operations",
++ "lock_ops", val);
++ }
++
++ if (conf->collect_mempool) {
++ if (strcmp(name, "live") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "in_use", val);
++ else if (strcmp(name, "pool") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "in_pool", val);
++ else if (strcmp(name, "sz_wanted") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "bytes",
++ "size_requested", val);
++ else if (strcmp(name, "sz_actual") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "bytes",
++ "size_allocated", val);
++ else if (strcmp(name, "allocs") == 0)
++ return varnish_submit_derive(conf->instance, "mempool",
++ "total_operations", "allocations", val);
++ else if (strcmp(name, "frees") == 0)
++ return varnish_submit_derive(conf->instance, "mempool",
++ "total_operations", "frees", val);
++ else if (strcmp(name, "recycle") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "recycled", val);
++ else if (strcmp(name, "timeout") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "timed_out", val);
++ else if (strcmp(name, "toosmall") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "too_small", val);
++ else if (strcmp(name, "surplus") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "surplus", val);
++ else if (strcmp(name, "randry") == 0)
++ return varnish_submit_gauge(conf->instance, "mempool", "objects",
++ "ran_dry", val);
++ }
++
++ if (conf->collect_mse) {
++ if (strcmp(name, "c_full") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "full_allocs", val);
++ else if (strcmp(name, "c_truncated") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "truncated_allocs", val);
++ else if (strcmp(name, "c_expanded") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "expanded_allocs", val);
++ else if (strcmp(name, "c_failed") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "failed_allocs", val);
++ else if (strcmp(name, "c_bytes") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_bytes",
++ "bytes_allocated", val);
++ else if (strcmp(name, "c_freed") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_bytes",
++ "bytes_freed", val);
++ else if (strcmp(name, "g_fo_alloc") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "fo_allocs_outstanding", val);
++ else if (strcmp(name, "g_fo_bytes") == 0)
++ return varnish_submit_gauge(conf->instance, "mse", "bytes",
++ "fo_bytes_outstanding", val);
++ else if (strcmp(name, "g_membuf_alloc") == 0)
++ return varnish_submit_gauge(conf->instance, "mse", "objects",
++ "membufs_allocated", val);
++ else if (strcmp(name, "g_membuf_inuse") == 0)
++ return varnish_submit_gauge(conf->instance, "mse", "objects",
++ "membufs_inuse", val);
++ else if (strcmp(name, "g_bans_bytes") == 0)
++ return varnish_submit_gauge(conf->instance, "mse", "bytes",
++ "persisted_banspace_used", val);
++ else if (strcmp(name, "g_bans_space") == 0)
++ return varnish_submit_gauge(conf->instance, "mse", "bytes",
++ "persisted_banspace_available", val);
++ else if (strcmp(name, "g_bans_persisted") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "bans_persisted", val);
++ else if (strcmp(name, "g_bans_lost") == 0)
++ return varnish_submit_derive(conf->instance, "mse", "total_operations",
++ "bans_lost", val);
++
++ /* mse seg */
++ else if (strcmp(name, "g_journal_bytes") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_reg", "bytes",
++ "journal_bytes_used", val);
++ else if (strcmp(name, "g_journal_space") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_reg", "bytes",
++ "journal_bytes_free", val);
++
++ /* mse segagg */
++ else if (strcmp(name, "g_bigspace") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_segagg", "bytes",
++ "big_extents_bytes_available", val);
++ else if (strcmp(name, "g_extfree") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
++ "free_extents", val);
++ else if (strcmp(name, "g_sparenode") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
++ "spare_nodes_available", val);
++ else if (strcmp(name, "g_objnode") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
++ "object_nodes_in_use", val);
++ else if (strcmp(name, "g_extnode") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
++ "extent_nodes_in_use", val);
++ else if (strcmp(name, "g_bigextfree") == 0)
++ return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
++ "free_big_extents", val);
++ else if (strcmp(name, "c_pruneloop") == 0)
++ return varnish_submit_derive(conf->instance, "mse_segagg",
++ "total_operations", "prune_loops", val);
++ else if (strcmp(name, "c_pruned") == 0)
++ return varnish_submit_derive(conf->instance, "mse_segagg",
++ "total_objects", "pruned_objects", val);
++ else if (strcmp(name, "c_spared") == 0)
++ return varnish_submit_derive(conf->instance, "mse_segagg",
++ "total_operations", "spared_objects", val);
++ else if (strcmp(name, "c_skipped") == 0)
++ return varnish_submit_derive(conf->instance, "mse_segagg",
++ "total_operations", "missed_objects", val);
++ else if (strcmp(name, "c_nuked") == 0)
++ return varnish_submit_derive(conf->instance, "mse_segagg",
++ "total_operations", "nuked_objects", val);
++ else if (strcmp(name, "c_sniped") == 0)
++ return varnish_submit_derive(conf->instance, "mse_segagg",
++ "total_operations", "sniped_objects", val);
++ }
++
+ #endif
+
+- return (0);
++ return 0;
+
+ } /* }}} static int varnish_monitor */
+ #else /* if HAVE_VARNISH_V2 */
+@@ -971,21 +1326,32 @@ static void varnish_monitor(const user_config_t *conf, /* {{{ */
+ } /* }}} void varnish_monitor */
+ #endif
+
+-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ static int varnish_read(user_data_t *ud) /* {{{ */
+ {
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+ struct VSM_data *vd;
+- const c_varnish_stats_t *stats;
+ _Bool ok;
++ const c_varnish_stats_t *stats;
++#elif HAVE_VARNISH_V5
++ struct vsm *vd;
++ struct vsc *vsc;
++ int vsm_status;
++#endif
+
+ user_config_t *conf;
+
+ if ((ud == NULL) || (ud->data == NULL))
+- return (EINVAL);
++ return EINVAL;
+
+ conf = ud->data;
+
+ vd = VSM_New();
++
++#if HAVE_VARNISH_V5
++ vsc = VSC_New();
++#endif
++
+ #if HAVE_VARNISH_V3
+ VSC_Setup(vd);
+ #endif
+@@ -993,48 +1359,85 @@ static int varnish_read(user_data_t *ud) /* {{{ */
+ if (conf->instance != NULL) {
+ int status;
+
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+ status = VSM_n_Arg(vd, conf->instance);
++#elif HAVE_VARNISH_V5
++ status = VSM_Arg(vd, 'n', conf->instance);
++#endif
++
+ if (status < 0) {
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+ VSM_Delete(vd);
+- ERROR("varnish plugin: VSM_n_Arg (\"%s\") failed "
++#elif HAVE_VARNISH_V5
++ VSC_Destroy(&vsc, vd);
++ VSM_Destroy(&vd);
++#endif
++ ERROR("varnish plugin: VSM_Arg (\"%s\") failed "
+ "with status %i.",
+ conf->instance, status);
+- return (-1);
++ return -1;
+ }
+ }
+
+ #if HAVE_VARNISH_V3
+ ok = (VSC_Open(vd, /* diag = */ 1) == 0);
+-#else /* if HAVE_VARNISH_V4 */
++#elif HAVE_VARNISH_V4
+ ok = (VSM_Open(vd) == 0);
+ #endif
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+ if (!ok) {
+ VSM_Delete(vd);
+ ERROR("varnish plugin: Unable to open connection.");
+-
+- return (-1);
++ return -1;
+ }
++#endif
+
+ #if HAVE_VARNISH_V3
+ stats = VSC_Main(vd);
+-#else /* if HAVE_VARNISH_V4 */
++#elif HAVE_VARNISH_V4
+ stats = VSC_Main(vd, NULL);
+ #endif
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+ if (!stats) {
+ VSM_Delete(vd);
+ ERROR("varnish plugin: Unable to get statistics.");
++ return -1;
++ }
++#endif
++
++#if HAVE_VARNISH_V5
++ if (VSM_Attach(vd, STDERR_FILENO)) {
++ ERROR("varnish plugin: Cannot attach to varnish. %s", VSM_Error(vd));
++ VSC_Destroy(&vsc, vd);
++ VSM_Destroy(&vd);
++ return -1;
++ }
+
+- return (-1);
++ vsm_status = VSM_Status(vd);
++ if (vsm_status & ~(VSM_MGT_RUNNING | VSM_WRK_RUNNING)) {
++ ERROR("varnish plugin: Unable to get statistics.");
++ VSC_Destroy(&vsc, vd);
++ VSM_Destroy(&vd);
++ return -1;
+ }
++#endif
+
+ #if HAVE_VARNISH_V3
+ VSC_Iter(vd, varnish_monitor, conf);
+-#else /* if HAVE_VARNISH_V4 */
++#elif HAVE_VARNISH_V4
+ VSC_Iter(vd, NULL, varnish_monitor, conf);
++#elif HAVE_VARNISH_V5
++ VSC_Iter(vsc, vd, varnish_monitor, conf);
+ #endif
++
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+ VSM_Delete(vd);
++#elif HAVE_VARNISH_V5
++ VSC_Destroy(&vsc, vd);
++ VSM_Destroy(&vd);
++#endif
+
+- return (0);
++ return 0;
+ } /* }}} */
+ #else /* if HAVE_VARNISH_V2 */
+ static int varnish_read(user_data_t *ud) /* {{{ */
+@@ -1044,7 +1447,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
+ user_config_t *conf;
+
+ if ((ud == NULL) || (ud->data == NULL))
+- return (EINVAL);
++ return EINVAL;
+
+ conf = ud->data;
+
+@@ -1052,12 +1455,12 @@ static int varnish_read(user_data_t *ud) /* {{{ */
+ if (stats == NULL) {
+ ERROR("Varnish plugin : unable to load statistics");
+
+- return (-1);
++ return -1;
+ }
+
+ varnish_monitor(conf, stats);
+
+- return (0);
++ return 0;
+ } /* }}} */
+ #endif
+
+@@ -1075,7 +1478,7 @@ static void varnish_config_free(void *ptr) /* {{{ */
+ static int varnish_config_apply_default(user_config_t *conf) /* {{{ */
+ {
+ if (conf == NULL)
+- return (EINVAL);
++ return EINVAL;
+
+ conf->collect_backend = 1;
+ conf->collect_cache = 1;
+@@ -1096,21 +1499,29 @@ static int varnish_config_apply_default(user_config_t *conf) /* {{{ */
+ conf->collect_shm = 1;
+ #if HAVE_VARNISH_V2
+ conf->collect_sm = 0;
++#endif
++#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ conf->collect_sma = 0;
+ #endif
+ conf->collect_sms = 0;
+ conf->collect_struct = 0;
+ conf->collect_totals = 0;
+-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ conf->collect_uptime = 0;
+ #endif
+ conf->collect_vcl = 0;
+ conf->collect_workers = 0;
+-#if HAVE_VARNISH_V4
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ conf->collect_vsm = 0;
++ conf->collect_lck = 0;
++ conf->collect_mempool = 0;
++ conf->collect_mgt = 0;
++ conf->collect_smf = 0;
++ conf->collect_vbe = 0;
++ conf->collect_mse = 0;
+ #endif
+
+- return (0);
++ return 0;
+ } /* }}} int varnish_config_apply_default */
+
+ static int varnish_init(void) /* {{{ */
+@@ -1118,11 +1529,11 @@ static int varnish_init(void) /* {{{ */
+ user_config_t *conf;
+
+ if (have_instance)
+- return (0);
++ return 0;
+
+ conf = calloc(1, sizeof(*conf));
+ if (conf == NULL)
+- return (ENOMEM);
++ return ENOMEM;
+
+ /* Default settings: */
+ conf->instance = NULL;
+@@ -1133,11 +1544,12 @@ static int varnish_init(void) /* {{{ */
+ /* group = */ "varnish",
+ /* name = */ "varnish/localhost",
+ /* callback = */ varnish_read,
+- /* interval = */ 0, &(user_data_t){
+- .data = conf, .free_func = varnish_config_free,
+- });
++ /* interval = */ 0,
++ &(user_data_t){
++ .data = conf, .free_func = varnish_config_free,
++ });
+
+- return (0);
++ return 0;
+ } /* }}} int varnish_init */
+
+ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+@@ -1147,7 +1559,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+
+ conf = calloc(1, sizeof(*conf));
+ if (conf == NULL)
+- return (ENOMEM);
++ return ENOMEM;
+ conf->instance = NULL;
+
+ varnish_config_apply_default(conf);
+@@ -1158,7 +1570,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+ status = cf_util_get_string(ci, &conf->instance);
+ if (status != 0) {
+ sfree(conf);
+- return (status);
++ return status;
+ }
+ assert(conf->instance != NULL);
+
+@@ -1170,7 +1582,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+ WARNING("Varnish plugin: \"Instance\" blocks accept only "
+ "one argument.");
+ sfree(conf);
+- return (EINVAL);
++ return EINVAL;
+ }
+
+ for (int i = 0; i < ci->children_num; i++) {
+@@ -1218,11 +1630,11 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+ else if (strcasecmp("CollectSMS", child->key) == 0)
+ cf_util_get_boolean(child, &conf->collect_sms);
+ else if (strcasecmp("CollectSMA", child->key) == 0)
+-#if HAVE_VARNISH_V2
++#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ cf_util_get_boolean(child, &conf->collect_sma);
+ #else
+ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
+- child->key, "v2");
++ child->key, "v2 and v4");
+ #endif
+ else if (strcasecmp("CollectSM", child->key) == 0)
+ #if HAVE_VARNISH_V2
+@@ -1236,7 +1648,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+ else if (strcasecmp("CollectTotals", child->key) == 0)
+ cf_util_get_boolean(child, &conf->collect_totals);
+ else if (strcasecmp("CollectUptime", child->key) == 0)
+-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ cf_util_get_boolean(child, &conf->collect_uptime);
+ #else
+ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
+@@ -1247,11 +1659,60 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+ else if (strcasecmp("CollectWorkers", child->key) == 0)
+ cf_util_get_boolean(child, &conf->collect_workers);
+ else if (strcasecmp("CollectVSM", child->key) == 0)
+-#if HAVE_VARNISH_V4
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ cf_util_get_boolean(child, &conf->collect_vsm);
+ #else
+ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
+ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectLock", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_lck);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectMempool", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_mempool);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectManagement", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_mgt);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectSMF", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_smf);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectSMF", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_smf);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectVBE", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_vbe);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "v4");
++#endif
++ else if (strcasecmp("CollectMSE", child->key) == 0)
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ cf_util_get_boolean(child, &conf->collect_mse);
++#else
++ WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
++ child->key, "Plus v4");
+ #endif
+ else {
+ WARNING("Varnish plugin: Ignoring unknown "
+@@ -1275,38 +1736,44 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
+ #endif
+ && !conf->collect_session && !conf->collect_shm && !conf->collect_sms
+ #if HAVE_VARNISH_V2
+- && !conf->collect_sma && !conf->collect_sm
++ && !conf->collect_sm
++#endif
++#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ && !conf->collect_sma
+ #endif
+ && !conf->collect_struct && !conf->collect_totals
+-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
++#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+ && !conf->collect_uptime
+ #endif
+ && !conf->collect_vcl && !conf->collect_workers
+-#if HAVE_VARNISH_V4
+- && !conf->collect_vsm
++#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
++ && !conf->collect_vsm && !conf->collect_vbe && !conf->collect_smf &&
++ !conf->collect_mgt && !conf->collect_lck && !conf->collect_mempool &&
++ !conf->collect_mse
+ #endif
+ ) {
+ WARNING("Varnish plugin: No metric has been configured for "
+ "instance \"%s\". Disabling this instance.",
+ (conf->instance == NULL) ? "localhost" : conf->instance);
+ sfree(conf);
+- return (EINVAL);
++ return EINVAL;
+ }
+
+- ssnprintf(callback_name, sizeof(callback_name), "varnish/%s",
+- (conf->instance == NULL) ? "localhost" : conf->instance);
++ snprintf(callback_name, sizeof(callback_name), "varnish/%s",
++ (conf->instance == NULL) ? "localhost" : conf->instance);
+
+ plugin_register_complex_read(
+ /* group = */ "varnish",
+ /* name = */ callback_name,
+ /* callback = */ varnish_read,
+- /* interval = */ 0, &(user_data_t){
+- .data = conf, .free_func = varnish_config_free,
+- });
++ /* interval = */ 0,
++ &(user_data_t){
++ .data = conf, .free_func = varnish_config_free,
++ });
+
+ have_instance = 1;
+
+- return (0);
++ return 0;
+ } /* }}} int varnish_config_instance */
+
+ static int varnish_config(oconfig_item_t *ci) /* {{{ */
+@@ -1323,7 +1790,7 @@ static int varnish_config(oconfig_item_t *ci) /* {{{ */
+ }
+ }
+
+- return (0);
++ return 0;
+ } /* }}} int varnish_config */
+
+ void module_register(void) /* {{{ */
+@@ -1331,5 +1798,3 @@ void module_register(void) /* {{{ */
+ plugin_register_complex_config("varnish", varnish_config);
+ plugin_register_init("varnish", varnish_init);
+ } /* }}} */
+-
+-/* vim: set sw=8 noet fdm=marker : */
diff --git a/app-metrics/collectd/files/collectd.confd-r2 b/app-metrics/collectd/files/collectd.confd-r2
new file mode 100644
index 000000000000..835936d5bce2
--- /dev/null
+++ b/app-metrics/collectd/files/collectd.confd-r2
@@ -0,0 +1,49 @@
+# Distributed under the terms of the GNU General Public License v2
+
+# Nice value used to launch collectd, to change priority of the process. As
+# you usually we want to run it in background, a default of 5 is used.
+#
+#COLLECTD_NICELEVEL=5
+
+# Location of configuration file. Modify if you don't like the standard
+# one.
+#
+#COLLECTD_CONFIGFILE="/etc/collectd.conf"
+
+# File used to store the PID file. Usually you won't need to touch it.
+# If you are going to change PID file location make sure that *only*
+# root is allowed to write into that directory.
+#
+#COLLECTD_PIDFILE="/run/collectd.pid"
+
+# User to run collectd as (default is collectd, change to root or give
+# collectd user appropriate privileges if you use one of the plugins that
+# require it, as e.g. ping or iptables plugins)
+#
+#COLLECTD_USER="collectd"
+
+# The default collectd UNIX socket location in /run/collectd is now
+# maintained via tmpfiles service. Therefore, the COLLECTD_GROUP setting
+# isn't used anymore.
+# If you are going to change UNIX socket location or change COLLECTD_USER
+# setting above, make sure you overwrite /usr/lib/tmpfiles.d/collectd.conf
+# via copy in /etc/tmpfiles.d/collectd.conf to match your setup.
+#COLLECTD_GROUP="collectd"
+
+# You can use this configuration option to pass additional options to the
+# start-stop-daemon, see start-stop-daemon(8) for more details.
+# Per default we wait 1000ms after we have started the service to ensure
+# that the daemon is really up and running.
+#COLLECTD_SSDARGS="--wait 1000"
+
+# The termination timeout (start-stop-daemon parameter "retry") ensures
+# that the service will be terminated within a given time (25 + 5 seconds
+# per default) when you are stopping the service.
+#COLLECTD_TERMTIMEOUT="TERM/25/KILL/5"
+
+# Options to collectd
+# See collectd(8) for more details
+# Notes:
+# * Do not specify another PIDFILE but use the variable above to change the location
+# * Do not specify another CONFIGFILE but use the variable above to change the location
+#COLLECTD_OPTS=""
diff --git a/app-metrics/collectd/files/collectd.initd-r2 b/app-metrics/collectd/files/collectd.initd-r2
new file mode 100644
index 000000000000..0a4ca71494f6
--- /dev/null
+++ b/app-metrics/collectd/files/collectd.initd-r2
@@ -0,0 +1,70 @@
+#!/sbin/openrc-run
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+COLLECTD_CONFIGFILE=${COLLECTD_CONFIGFILE:-"/etc/collectd.conf"}
+COLLECTD_PIDFILE=${COLLECTD_PIDFILE:-"/run/collectd.pid"}
+COLLECTD_NICELEVEL=${COLLECTD_NICELEVEL:-5}
+COLLECTD_USER=${COLLECTD_USER:-"collectd"}
+COLLECTD_GROUP=${COLLECTD_GROUP:-"collectd"}
+COLLECTD_SSDARGS=${COLLECTD_SSDARGS:-"--wait 1000"}
+COLLECTD_TERMTIMEOUT=${COLLECTD_TERMTIMEOUT:-"TERM/25/KILL/5"}
+COLLECTD_OPTS=${COLLECTD_OPTS:-""}
+
+command="/usr/sbin/collectd"
+command_args="${COLLECTD_OPTS} -C \"${COLLECTD_CONFIGFILE}\" -f"
+command_background=true
+command_user="${COLLECTD_USER}"
+start_stop_daemon_args="${COLLECTD_SSDARGS} --nice ${COLLECTD_NICELEVEL}"
+pidfile="${COLLECTD_PIDFILE}"
+retry="${COLLECTD_TERMTIMEOUT}"
+
+extra_commands="configtest"
+description_configtest="Run collectd's internal config check."
+
+required_files="\"${COLLECTD_CONFIGFILE}\""
+
+depend() {
+ use dns
+}
+
+_checkconfig() {
+ if [ $(sed '/^$\|^#/d' "${COLLECTD_CONFIGFILE}" | grep 'LoadPlugin[[:space:]]\+oracle' | wc -l) -ge 1 ] ; then
+ if [ -e /etc/env.d/50oracle-instantclient-basic ] ; then
+ . /etc/env.d/50oracle-instantclient-basic
+ export ORACLE_HOME
+ export TNS_ADMIN
+ else
+ ewarn "Unable to set Oracle environment, Oracle plugin wont work"
+ fi
+ fi
+
+ local test_command="${command} -t -C \"${COLLECTD_CONFIGFILE}\""
+
+ eval ${test_command} 1>/dev/null 2>&1
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ eerror "${SVCNAME} has detected an error in your configuration:"
+ eval ${test_command}
+ fi
+
+ return $ret
+}
+
+configtest() {
+ ebegin "Checking ${SVCNAME} configuration"
+ _checkconfig
+ eend $?
+}
+
+start_pre() {
+ if [ "${RC_CMD}" != "restart" ]; then
+ configtest || return 1
+ fi
+}
+
+stop_pre() {
+ if [ "${RC_CMD}" = "restart" ]; then
+ configtest || return 1
+ fi
+}
diff --git a/app-metrics/collectd/files/collectd.logrotate b/app-metrics/collectd/files/collectd.logrotate
new file mode 100644
index 000000000000..5d344f6208f1
--- /dev/null
+++ b/app-metrics/collectd/files/collectd.logrotate
@@ -0,0 +1,9 @@
+#
+# /etc/logrotate.d/collectd
+#
+/var/log/collectd.log {
+ daily
+ rotate 5
+ notifempty
+ missingok
+}
diff --git a/app-metrics/collectd/files/collectd.tmpfile b/app-metrics/collectd/files/collectd.tmpfile
new file mode 100644
index 000000000000..4524a56ec183
--- /dev/null
+++ b/app-metrics/collectd/files/collectd.tmpfile
@@ -0,0 +1 @@
+d /run/collectd 0770 collectd collectd
diff --git a/app-metrics/collectd/metadata.xml b/app-metrics/collectd/metadata.xml
new file mode 100644
index 000000000000..5f027424cee4
--- /dev/null
+++ b/app-metrics/collectd/metadata.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>whissi@gentoo.org</email>
+ <name>Thomas Deutschmann</name>
+ </maintainer>
+ <longdescription lang="en">
+ Collectd gathers statistics about the system it is running on and stores this
+ information. Those statistics can then be used to find current performance
+ bottlenecks (i.e. performance analysis) and predict future system load (i.e.
+ capacity planning). Or if you just want pretty graphs of your private server
+ and are fed up with some homegrown solution you're at the right place.
+ </longdescription>
+ <upstream>
+ <bugs-to>https://github.com/collectd/collectd/issues</bugs-to>
+ <doc lang="en">https://collectd.org/documentation.shtml</doc>
+ <remote-id type="github">collectd/collectd</remote-id>
+ </upstream>
+ <use>
+ <flag name="contrib">Install user-contributed files in the doc directory</flag>
+ <flag name="filecaps">When set collectd daemon will have set required capabilities to run most plugins even if run as unprivileged user</flag>
+ <flag name="java">Must be set (workaround for java-pkg-opt-2 eclass limitation) when you want java or genericjmx plugin</flag>
+ <flag name="udev">Enable optional udev usage in disk plugin; Required for smart plugin</flag>
+ <flag name="xfs">Enable optional capability to filter on XFS file system in df plugin; Requires XFS headers from <pkg>sys-fs/xfsprogs</pkg></flag>
+ </use>
+</pkgmetadata>