summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 11011dc)
raw | patch | inline | side by side (parent: 11011dc)
author | Florian Forster <octo@collectd.org> | |
Tue, 6 Dec 2016 12:28:20 +0000 (13:28 +0100) | ||
committer | Florian Forster <octo@collectd.org> | |
Tue, 6 Dec 2016 12:28:20 +0000 (13:28 +0100) |
Fixes: #2062
src/smart.c | patch | blob | history |
diff --git a/src/smart.c b/src/smart.c
index eb6f1de8509b966a79268d657e8c5d78ec138788..93bfcbec8aff9cc9314b254a0e821fa585a899c9 100644 (file)
--- a/src/smart.c
+++ b/src/smart.c
plugin_dispatch_values(&vl);
}
-static void smart_handle_disk_attribute(SkDisk *d,
- const SkSmartAttributeParsedData *a,
- void *userdata) {
- const char *dev = userdata;
+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;
vl.values_len = 4;
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.plugin_instance, name, sizeof(vl.plugin_instance));
sstrncpy(vl.type, "smart_attribute", sizeof(vl.type));
sstrncpy(vl.type_instance, a->name, sizeof(vl.type_instance));
notification_t notif = {NOTIF_WARNING, cdtime(), "", "", "smart", "",
"smart_attribute", "", NULL};
sstrncpy(notif.host, hostname_g, sizeof(notif.host));
- sstrncpy(notif.plugin_instance, dev, sizeof(notif.plugin_instance));
+ 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,
}
}
-static void smart_handle_disk(const char *dev, const char *serial) {
- SkDisk *d = NULL;
- SkBool awake = FALSE;
+static void smart_read_disk(SkDisk *d, char const *name) {
SkBool available = FALSE;
- const char *shortname;
- const SkSmartParsedData *spd;
- uint64_t poweron, powercycles, badsectors, temperature;
-
- if (use_serial && serial) {
- shortname = serial;
- } else {
- shortname = strrchr(dev, '/');
- if (!shortname)
- return;
- shortname++;
- }
- if (ignorelist_match(ignorelist, shortname) != 0) {
- DEBUG("smart plugin: ignoring %s.", dev);
- return;
- }
-
- DEBUG("smart plugin: checking SMART status of %s.", dev);
-
- if (sk_disk_open(dev, &d) < 0) {
- ERROR("smart plugin: unable to open %s.", dev);
- return;
- }
if (sk_disk_identify_is_available(d, &available) < 0 || !available) {
- DEBUG("smart plugin: disk %s cannot be identified.", dev);
- goto end;
+ DEBUG("smart plugin: disk %s cannot be identified.", name);
+ return;
}
if (sk_disk_smart_is_available(d, &available) < 0 || !available) {
- DEBUG("smart plugin: disk %s has no SMART support.", dev);
- goto end;
+ DEBUG("smart plugin: disk %s has no SMART support.", name);
+ return;
}
if (!ignore_sleep_mode) {
+ SkBool awake = FALSE;
if (sk_disk_check_sleep_mode(d, &awake) < 0 || !awake) {
- DEBUG("smart plugin: disk %s is sleeping.", dev);
- goto end;
+ DEBUG("smart plugin: disk %s is sleeping.", name);
+ return;
}
}
if (sk_disk_smart_read_data(d) < 0) {
- ERROR("smart plugin: unable to get SMART data for disk %s.", dev);
- goto end;
+ ERROR("smart plugin: unable to get SMART data for disk %s.", name);
+ return;
}
- if (sk_disk_smart_parse(d, &spd) < 0) {
- ERROR("smart plugin: unable to parse SMART data for disk %s.", dev);
- goto end;
+
+ if (sk_disk_smart_parse(d, &(SkSmartParsedData const *){NULL}) < 0) {
+ ERROR("smart plugin: unable to parse SMART data for disk %s.", name);
+ return;
}
/* Get some specific values */
- if (sk_disk_smart_get_power_on(d, &poweron) < 0) {
- WARNING("smart plugin: unable to get milliseconds since power on for %s.",
- dev);
- } else
- smart_submit(shortname, "smart_poweron", "", poweron / 1000.);
-
- if (sk_disk_smart_get_power_cycle(d, &powercycles) < 0) {
- WARNING("smart plugin: unable to get number of power cycles for %s.", dev);
- } else
- smart_submit(shortname, "smart_powercycles", "", powercycles);
-
- if (sk_disk_smart_get_bad(d, &badsectors) < 0) {
- WARNING("smart plugin: unable to get number of bad sectors for %s.", dev);
- } else
- smart_submit(shortname, "smart_badsectors", "", badsectors);
-
- if (sk_disk_smart_get_temperature(d, &temperature) < 0) {
- WARNING("smart plugin: unable to get temperature for %s.", dev);
- } else
- smart_submit(shortname, "smart_temperature", "",
- temperature / 1000. - 273.15);
+ uint64_t value;
+ if (sk_disk_smart_get_power_on(d, &value) >= 0)
+ smart_submit(name, "smart_poweron", "", ((gauge_t)value) / 1000.);
+ else
+ DEBUG("smart plugin: unable to get milliseconds since power on for %s.",
+ name);
+
+ if (sk_disk_smart_get_power_cycle(d, &value) >= 0)
+ smart_submit(name, "smart_powercycles", "", (gauge_t)value);
+ else
+ DEBUG("smart plugin: unable to get number of power cycles for %s.", name);
+
+ if (sk_disk_smart_get_bad(d, &value) >= 0)
+ smart_submit(name, "smart_badsectors", "", (gauge_t)value);
+ else
+ DEBUG("smart plugin: unable to get number of bad sectors for %s.", name);
+
+ if (sk_disk_smart_get_temperature(d, &value) >= 0)
+ smart_submit(name, "smart_temperature", "",
+ ((gauge_t)value) / 1000. - 273.15);
+ else
+ DEBUG("smart plugin: unable to get temperature for %s.", name);
/* Grab all attributes */
- if (sk_disk_smart_parse_attributes(d, smart_handle_disk_attribute,
- (char *)shortname) < 0) {
- ERROR("smart plugin: unable to handle SMART attributes for %s.", dev);
+ if (sk_disk_smart_parse_attributes(d, handle_attribute, (void *)name) < 0) {
+ ERROR("smart plugin: unable to handle SMART attributes for %s.", name);
+ }
+}
+
+static void smart_handle_disk(const char *dev, const char *serial) {
+ SkDisk *d = NULL;
+ const char *name;
+
+ if (use_serial && serial) {
+ name = serial;
+ } else {
+ name = strrchr(dev, '/');
+ if (!name)
+ return;
+ name++;
+ }
+ if (ignorelist_match(ignorelist, name) != 0) {
+ DEBUG("smart plugin: ignoring %s.", dev);
+ return;
+ }
+
+ DEBUG("smart plugin: checking SMART status of %s.", dev);
+ if (sk_disk_open(dev, &d) < 0) {
+ ERROR("smart plugin: unable to open %s.", dev);
+ return;
}
-end:
+ smart_read_disk(d, name);
sk_disk_free(d);
}