X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsensors.c;h=ff8b580de0a688e51bf6e02c6541de1d636b54ca;hb=2403dd00be7ee359a1da567ec1a3d1dddf179a58;hp=940b4b4c256b7451810ef4a4ecd8fb4037087bee;hpb=def529326cb326ccc6ce33bbd6b39b92edbc0b76;p=collectd.git diff --git a/src/sensors.c b/src/sensors.c index 940b4b4c..ff8b580d 100644 --- a/src/sensors.c +++ b/src/sensors.c @@ -19,7 +19,7 @@ * Authors: * Florian octo Forster * - * Lubos Stanek Wed Oct 25, 2006 + * Lubos Stanek Wed Oct 27, 2006 * - config ExtendedSensorNaming option * - precise sensor feature selection (chip-bus-address/type-feature) * with ExtendedSensorNaming @@ -33,9 +33,11 @@ #include "common.h" #include "plugin.h" #include "configfile.h" +#include "utils_ignorelist.h" #include "utils_debug.h" #define MODULE_NAME "sensors" +#define MODULE_NAME_VOLTAGE MODULE_NAME"_voltage" #if defined(HAVE_SENSORS_SENSORS_H) # include @@ -51,6 +53,7 @@ #define BUFSIZE 512 +/* temperature and fan sensors */ static char *ds_def[] = { "DS:value:GAUGE:"COLLECTD_HEARTBEAT":U:U", @@ -58,13 +61,7 @@ static char *ds_def[] = }; static int ds_num = 1; -/* old naming */ -static char *filename_format = "sensors-%s.rrd"; -/* end old naming */ - -/* new naming */ -static char *sensor_filename_format = "lm_sensors-%s.rrd"; - +/* voltage sensors */ static char *sensor_voltage_ds_def[] = { "DS:voltage:GAUGE:"COLLECTD_HEARTBEAT":U:U", @@ -72,77 +69,95 @@ static char *sensor_voltage_ds_def[] = }; static int sensor_voltage_ds_num = 1; +/* old naming */ +static char *old_filename_format = "sensors-%s.rrd"; +/* end old naming */ + +/* new naming default is to collect selected sensors - * 1 => ignore selected sensors - */ -static int sensor_list_action = 0; +static ignorelist_t *sensor_list; + /* * sensor_extended_naming: * 0 => default is to create chip-feature @@ -169,47 +178,38 @@ static int sensor_list_action = 0; */ static int sensor_extended_naming = 0; -#ifdef HAVE_LIBSENSORS +#if SENSORS_HAVE_READ typedef struct featurelist { const sensors_chip_name *chip; const sensors_feature_data *data; - int type; + int type; struct featurelist *next; } featurelist_t; featurelist_t *first_feature = NULL; -#endif /* defined (HAVE_LIBSENSORS) */ +#endif /* if SENSORS_HAVE_READ */ static int sensors_config (char *key, char *value) { - char **temp; + if (sensor_list == NULL) + sensor_list = ignorelist_create (1); if (strcasecmp (key, "Sensor") == 0) { - temp = (char **) realloc (sensor_list, (sensor_list_num + 1) * sizeof (char *)); - if (temp == NULL) + if (ignorelist_add (sensor_list, value)) { - syslog (LOG_EMERG, "Cannot allocate more memory."); + syslog (LOG_EMERG, "Cannot add value to ignorelist."); return (1); } - sensor_list = temp; - - if ((sensor_list[sensor_list_num] = strdup (value)) == NULL) - { - syslog (LOG_EMERG, "Cannot allocate memory."); - return (1); - } - sensor_list_num++; } else if (strcasecmp (key, "IgnoreSelected") == 0) { + ignorelist_set_invert (sensor_list, 1); if ((strcasecmp (value, "True") == 0) || (strcasecmp (value, "Yes") == 0) || (strcasecmp (value, "On") == 0)) - sensor_list_action = 1; - else - sensor_list_action = 0; + ignorelist_set_invert (sensor_list, 0); } else if (strcasecmp (key, "ExtendedSensorNaming") == 0) { @@ -228,28 +228,9 @@ static int sensors_config (char *key, char *value) return (0); } -/* - * Check if this feature should be ignored. This is called from - * both, `submit' and `write' to give client and server - * the ability to ignore certain stuff... - */ -static int config_get_ignored (const char *inst) -{ - int i; - - /* If no ignored are given collect all features. */ - if (sensor_list_num < 1) - return (0); - - for (i = 0; i < sensor_list_num; i++) - if (strcasecmp (inst, sensor_list[i]) == 0) - return (sensor_list_action); - return (1 - sensor_list_action); -} - static void collectd_sensors_init (void) { -#ifdef HAVE_LIBSENSORS +#if SENSORS_HAVE_READ FILE *fh; featurelist_t *last_feature = NULL; featurelist_t *new_feature; @@ -279,7 +260,8 @@ static void collectd_sensors_init (void) if (sensors_init (fh)) { fclose (fh); - syslog (LOG_ERR, "sensors: Cannot initialize sensors. Data will not be collected."); + syslog (LOG_ERR, "sensors: Cannot initialize sensors. " + "Data will not be collected."); return; } @@ -291,117 +273,160 @@ static void collectd_sensors_init (void) data = NULL; data_num0 = data_num1 = 0; - while ((data = sensors_get_all_features (*chip, &data_num0, &data_num1)) != NULL) + while ((data = sensors_get_all_features (*chip, &data_num0, &data_num1)) + != NULL) { + int i; + /* "master features" only */ if (data->mapping != SENSORS_NO_MAPPING) continue; /* Only known features */ - int i = 0; - while (known_features[i].type >= 0) + for (i = 0; known_features[i].type >= 0; i++) { - if(strncmp(data->name, known_features[i].label, strlen(known_features[i].label)) == 0) + if (strcmp (data->name, known_features[i].label) != 0) + continue; + + /* skip ignored in sensors.conf */ + if (sensors_get_ignored (*chip, data->number) == 0) + break; + + DBG ("Adding feature: %s-%s-%s", + chip->prefix, + sensor_type_prefix[known_features[i].type], + data->name); + + if ((new_feature = (featurelist_t *) malloc (sizeof (featurelist_t))) == NULL) { - /* skip ignored in sensors.conf */ - if (sensors_get_ignored(*chip, data->number) == 0) - { - break; - } - - if ((new_feature = (featurelist_t *) malloc (sizeof (featurelist_t))) == NULL) - { - perror ("malloc"); - break; - } - - DBG ("Adding feature: %s/%s/%i", chip->prefix, data->name, known_features[i].type); - new_feature->chip = chip; - new_feature->data = data; - new_feature->type = known_features[i].type; - new_feature->next = NULL; - - if (first_feature == NULL) - { - first_feature = new_feature; - last_feature = new_feature; - } - else - { - last_feature->next = new_feature; - last_feature = new_feature; - } - - /* stop searching known features at first found */ + DBG ("sensors plugin: malloc: %s", + strerror (errno)); + syslog (LOG_ERR, "sensors plugin: malloc: %s", + strerror (errno)); break; } - i++; - } - } - } + + new_feature->chip = chip; + new_feature->data = data; + new_feature->type = known_features[i].type; + new_feature->next = NULL; + + if (first_feature == NULL) + { + first_feature = new_feature; + last_feature = new_feature; + } + else + { + last_feature->next = new_feature; + last_feature = new_feature; + } + + /* stop searching known features at first found */ + break; + } /* for i */ + } /* while sensors_get_all_features */ + } /* while sensors_get_detected_chips */ if (first_feature == NULL) sensors_cleanup (); -#endif /* defined(HAVE_LIBSENSORS) */ +#endif /* if SENSORS_HAVE_READ */ return; } -static void sensors_write (char *host, char *inst, char *val) +static void sensors_shutdown (void) +{ +#if SENSORS_HAVE_READ + featurelist_t *thisft = first_feature; + featurelist_t *nextft; + + while (thisft != NULL) + { + nextft = thisft->next; + sfree (thisft); + thisft = nextft; + } + + sensors_cleanup (); +#endif /* if SENSORS_HAVE_READ */ + + ignorelist_free (sensor_list); +} + +static void sensors_voltage_write (char *host, char *inst, char *val) { char file[BUFSIZE]; int status; - char *typestart; /* skip ignored in our config */ - if (config_get_ignored (inst)) - return; + if (ignorelist_match (sensor_list, inst)) + return; /* extended sensor naming */ if(sensor_extended_naming) - status = snprintf (file, BUFSIZE, sensor_filename_format, inst); + status = snprintf (file, BUFSIZE, extended_filename_format, inst); else - status = snprintf (file, BUFSIZE, filename_format, inst); - if (status < 1) - return; - else if (status >= BUFSIZE) + status = snprintf (file, BUFSIZE, old_filename_format, inst); + + if ((status < 1) || (status >= BUFSIZE)) return; - if(sensor_extended_naming) - { - typestart = strrchr(inst, '/'); - if(typestart != NULL) - { - if(strncmp(typestart, sensor_type_prefix[SENSOR_TYPE_VOLTAGE], strlen(sensor_type_prefix[SENSOR_TYPE_VOLTAGE])) == 0) - rrd_update_file (host, file, val, sensor_voltage_ds_def, sensor_voltage_ds_num); - else - rrd_update_file (host, file, val, ds_def, ds_num); - } - else + rrd_update_file (host, file, val, sensor_voltage_ds_def, sensor_voltage_ds_num); +} + +static void sensors_write (char *host, char *inst, char *val) +{ + char file[BUFSIZE]; + int status; + + /* skip ignored in our config */ + if (ignorelist_match (sensor_list, inst)) return; - } + + /* extended sensor naming */ + if (sensor_extended_naming) + status = snprintf (file, BUFSIZE, extended_filename_format, inst); else - rrd_update_file (host, file, val, ds_def, ds_num); + status = snprintf (file, BUFSIZE, old_filename_format, inst); + + if ((status < 1) || (status >= BUFSIZE)) + return; + + rrd_update_file (host, file, val, ds_def, ds_num); } #if SENSORS_HAVE_READ -static void sensors_submit (const char *feat_name, const char *chip_prefix, double value) +static void sensors_submit (const char *feat_name, + const char *chip_prefix, double value, int type) { char buf[BUFSIZE]; char inst[BUFSIZE]; - if (snprintf (inst, BUFSIZE, "%s-%s", chip_prefix, feat_name) >= BUFSIZE) + if (snprintf (inst, BUFSIZE, "%s-%s", chip_prefix, feat_name) + >= BUFSIZE) return; /* skip ignored in our config */ - if (config_get_ignored (inst)) - return; + if (ignorelist_match (sensor_list, inst)) + return; - if (snprintf (buf, BUFSIZE, "%u:%.3f", (unsigned int) curtime, value) >= BUFSIZE) + if (snprintf (buf, BUFSIZE, "%u:%.3f", (unsigned int) curtime, + value) >= BUFSIZE) return; - DBG ("%s, %s", inst, buf); - plugin_submit (MODULE_NAME, inst, buf); + if (type == SENSOR_TYPE_VOLTAGE) + { + DBG ("%s: %s/%s, %s", MODULE_NAME_VOLTAGE, + sensor_type_prefix[type], inst, buf); + plugin_submit (MODULE_NAME_VOLTAGE, inst, buf); + } + else + { + DBG ("%s: %s/%s, %s", MODULE_NAME, + sensor_type_prefix[type], inst, buf); + plugin_submit (MODULE_NAME, inst, buf); + } } static void sensors_read (void) @@ -412,33 +437,52 @@ static void sensors_read (void) for (feature = first_feature; feature != NULL; feature = feature->next) { - if (sensors_get_feature (*feature->chip, feature->data->number, &value) < 0) - continue; - - if(sensor_extended_naming) - { - /* full chip name logic borrowed from lm_sensors */ - if (feature->chip->bus == SENSORS_CHIP_NAME_BUS_ISA) - { - if (snprintf (chip_fullprefix, BUFSIZE, "%s-isa-%04x%s", feature->chip->prefix, feature->chip->addr, sensor_type_prefix[feature->type]) >= BUFSIZE) + if (sensors_get_feature (*feature->chip, feature->data->number, &value) < 0) continue; - } - else if (feature->chip->bus == SENSORS_CHIP_NAME_BUS_DUMMY) + + if (sensor_extended_naming) { - if (snprintf (chip_fullprefix, BUFSIZE, "%s-%s-%04x%s", feature->chip->prefix, feature->chip->busname, feature->chip->addr, sensor_type_prefix[feature->type]) >= BUFSIZE) - continue; + /* full chip name logic borrowed from lm_sensors */ + if (feature->chip->bus == SENSORS_CHIP_NAME_BUS_ISA) + { + if (snprintf (chip_fullprefix, BUFSIZE, "%s-isa-%04x/%s", + feature->chip->prefix, + feature->chip->addr, + sensor_type_prefix[feature->type]) + >= BUFSIZE) + continue; + } + else if (feature->chip->bus == SENSORS_CHIP_NAME_BUS_DUMMY) + { + if (snprintf (chip_fullprefix, BUFSIZE, "%s-%s-%04x/%s", + feature->chip->prefix, + feature->chip->busname, + feature->chip->addr, + sensor_type_prefix[feature->type]) + >= BUFSIZE) + continue; + } + else + { + if (snprintf (chip_fullprefix, BUFSIZE, "%s-i2c-%d-%02x/%s", + feature->chip->prefix, + feature->chip->bus, + feature->chip->addr, + sensor_type_prefix[feature->type]) + >= BUFSIZE) + continue; + } + + sensors_submit (feature->data->name, + chip_fullprefix, + value, feature->type); } else { - if (snprintf (chip_fullprefix, BUFSIZE, "%s-i2c-%d-%02x%s", feature->chip->prefix, feature->chip->bus, feature->chip->addr, sensor_type_prefix[feature->type]) >= BUFSIZE) - continue; + sensors_submit (feature->data->name, + feature->chip->prefix, + value, feature->type); } - sensors_submit (feature->data->name, (const char *)chip_fullprefix, value); - } - else - { - sensors_submit (feature->data->name, feature->chip->prefix, value); - } } } #else @@ -448,6 +492,8 @@ static void sensors_read (void) void module_register (void) { plugin_register (MODULE_NAME, collectd_sensors_init, sensors_read, sensors_write); + plugin_register (MODULE_NAME_VOLTAGE, NULL, NULL, sensors_voltage_write); + plugin_register_shutdown (MODULE_NAME, sensors_shutdown); cf_register (MODULE_NAME, sensors_config, config_keys, config_keys_num); }