X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fsmart.c;h=30680be6ed4b5d0565ea27a4a46c453e3f3c1051;hp=93bfcbec8aff9cc9314b254a0e821fa585a899c9;hb=1159cb5d383c55a80a0db100b8f7aadcf44740a5;hpb=bb1d857383b85dbc2c37098391d53e2b9261c830 diff --git a/src/smart.c b/src/smart.c index 93bfcbec..30680be6 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"}; @@ -46,7 +50,7 @@ static int smart_config(const char *key, const char *value) { if (ignorelist == NULL) ignorelist = ignorelist_create(/* invert = */ 1); if (ignorelist == NULL) - return (1); + return 1; if (strcasecmp("Disk", key) == 0) { ignorelist_add(ignorelist, value); @@ -62,22 +66,18 @@ static int smart_config(const char *key, const char *value) { if (IS_TRUE(value)) use_serial = 1; } else { - return (-1); + return -1; } - return (0); + return 0; } /* int smart_config */ static void smart_submit(const char *dev, const char *type, const char *type_inst, double value) { - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].gauge = value; - - vl.values = values; + vl.values = &(value_t){.gauge = value}; vl.values_len = 1; - sstrncpy(vl.host, hostname_g, sizeof(vl.host)); sstrncpy(vl.plugin, "smart", sizeof(vl.plugin)); sstrncpy(vl.plugin_instance, dev, sizeof(vl.plugin_instance)); sstrncpy(vl.type, type, sizeof(vl.type)); @@ -89,19 +89,20 @@ static void smart_submit(const char *dev, const char *type, static void handle_attribute(SkDisk *d, const SkSmartAttributeParsedData *a, void *userdata) { char const *name = userdata; - value_t values[4]; - value_list_t vl = VALUE_LIST_INIT; if (!a->current_value_valid || !a->worst_value_valid) return; - values[0].gauge = a->current_value; - values[1].gauge = a->worst_value; - values[2].gauge = a->threshold_valid ? a->threshold : 0; - values[3].gauge = a->pretty_value; + + value_list_t vl = VALUE_LIST_INIT; + value_t values[] = { + {.gauge = a->current_value}, + {.gauge = a->worst_value}, + {.gauge = a->threshold_valid ? a->threshold : 0}, + {.gauge = a->pretty_value}, + }; vl.values = values; - vl.values_len = 4; - sstrncpy(vl.host, hostname_g, sizeof(vl.host)); + vl.values_len = STATIC_ARRAY_SIZE(values); sstrncpy(vl.plugin, "smart", sizeof(vl.plugin)); sstrncpy(vl.plugin_instance, name, sizeof(vl.plugin_instance)); sstrncpy(vl.type, "smart_attribute", sizeof(vl.type)); @@ -115,9 +116,9 @@ static void handle_attribute(SkDisk *d, const SkSmartAttributeParsedData *a, sstrncpy(notif.host, hostname_g, sizeof(notif.host)); sstrncpy(notif.plugin_instance, name, sizeof(notif.plugin_instance)); sstrncpy(notif.type_instance, a->name, sizeof(notif.type_instance)); - ssnprintf(notif.message, sizeof(notif.message), - "attribute %s is below allowed threshold (%d < %d)", a->name, - a->current_value, a->threshold); + snprintf(notif.message, sizeof(notif.message), + "attribute %s is below allowed threshold (%d < %d)", a->name, + a->current_value, a->threshold); plugin_dispatch_notification(¬if); } } @@ -216,7 +217,7 @@ static int smart_read(void) { handle_udev = udev_new(); if (!handle_udev) { ERROR("smart plugin: unable to initialize udev."); - return (-1); + return -1; } enumerate = udev_enumerate_new(handle_udev); udev_enumerate_add_match_subsystem(enumerate, "block"); @@ -238,10 +239,28 @@ static int smart_read(void) { udev_enumerate_unref(enumerate); udev_unref(handle_udev); - return (0); + 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 */