X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fsmart.c;h=9395945b5bccdec64edee835d225631a50ac87ed;hp=373839e13fb7ea565cdcf68685c7b0b5d985cc0a;hb=3fb6fe5776c14f41879249f4147c0b8924b39cc1;hpb=b8b1e35f503af693b8c53ddd32ffd41981a82dd5 diff --git a/src/smart.c b/src/smart.c index 373839e1..9395945b 100644 --- a/src/smart.c +++ b/src/smart.c @@ -82,10 +82,9 @@ static void smart_submit(const char *dev, const char *type, 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; if (!a->current_value_valid || !a->worst_value_valid) return; @@ -101,7 +100,7 @@ static void smart_handle_disk_attribute(SkDisk *d, vl.values = values; vl.values_len = STATIC_ARRAY_SIZE(values); 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)); @@ -111,7 +110,7 @@ static void smart_handle_disk_attribute(SkDisk *d, 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, @@ -120,86 +119,87 @@ static void smart_handle_disk_attribute(SkDisk *d, } } -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); }