From: Ruben Kerkhof Date: Fri, 24 Feb 2017 16:28:28 +0000 (+0100) Subject: Merge branch 'collectd-5.6' into collectd-5.7 X-Git-Tag: collectd-5.7.2~15 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=004074af297a219208fa9e903db8c5dcdd7e1950;hp=14d94fb83e1e9487dc46415b4334e7217b9175e9 Merge branch 'collectd-5.6' into collectd-5.7 Conflicts: src/utils_match.c --- diff --git a/contrib/systemd.collectd.service b/contrib/systemd.collectd.service index d0f1bdea..7bc15d7c 100644 --- a/contrib/systemd.collectd.service +++ b/contrib/systemd.collectd.service @@ -20,6 +20,7 @@ ProtectHome=true # exec CAP_SETUID CAP_SETGID # iptables CAP_NET_ADMIN # ping CAP_NET_RAW +# smart CAP_SYS_RAWIO # turbostat CAP_SYS_RAWIO # # Example, if you use the iptables plugin alongside the dns or ping plugin: diff --git a/src/smart.c b/src/smart.c index 9395945b..3188d1c8 100644 --- a/src/smart.c +++ b/src/smart.c @@ -33,6 +33,10 @@ #include #include +#ifdef HAVE_SYS_CAPABILITY_H +#include +#endif + static const char *config_keys[] = {"Disk", "IgnoreSelected", "IgnoreSleepMode", "UseSerial"}; @@ -238,7 +242,25 @@ static int smart_read(void) { return (0); } /* int smart_read */ +static int smart_init(void) { +#if defined(HAVE_SYS_CAPABILITY_H) && defined(CAP_SYS_RAWIO) + if (check_capability(CAP_SYS_RAWIO) != 0) { + if (getuid() == 0) + WARNING("smart plugin: Running collectd as root, but the " + "CAP_SYS_RAWIO capability is missing. The plugin's read " + "function will probably fail. Is your init system dropping " + "capabilities?"); + else + WARNING("smart plugin: collectd doesn't have the CAP_SYS_RAWIO " + "capability. If you don't want to run collectd as root, try " + "running \"setcap cap_sys_rawio=ep\" on the collectd binary."); + } +#endif + return (0); +} /* int smart_init */ + void module_register(void) { plugin_register_config("smart", smart_config, config_keys, config_keys_num); + plugin_register_init("smart", smart_init); plugin_register_read("smart", smart_read); } /* void module_register */ diff --git a/src/utils_match.c b/src/utils_match.c index 2e487b59..11b3f74f 100644 --- a/src/utils_match.c +++ b/src/utils_match.c @@ -34,6 +34,7 @@ #include #define UTILS_MATCH_FLAGS_EXCLUDE_REGEX 0x02 +#define UTILS_MATCH_FLAGS_REGEX 0x04 struct cu_match_s { regex_t regex; @@ -234,6 +235,7 @@ match_create_callback(const char *regex, const char *excluderegex, sfree(obj); return (NULL); } + obj->flags |= UTILS_MATCH_FLAGS_REGEX; if (excluderegex && strcmp(excluderegex, "") != 0) { status = regcomp(&obj->excluderegex, excluderegex, REG_EXTENDED); @@ -301,6 +303,10 @@ void match_destroy(cu_match_t *obj) { if (obj == NULL) return; + if (obj->flags & UTILS_MATCH_FLAGS_REGEX) + regfree(&obj->regex); + if (obj->flags & UTILS_MATCH_FLAGS_EXCLUDE_REGEX) + regfree(&obj->excluderegex); if ((obj->user_data != NULL) && (obj->free != NULL)) (*obj->free)(obj->user_data);