X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsensors.c;h=ff8b580de0a688e51bf6e02c6541de1d636b54ca;hb=2403dd00be7ee359a1da567ec1a3d1dddf179a58;hp=940120c6af89b1ab4217948fd01a9f27303d6c2f;hpb=601abecb59b6041e84f11877345a98efba7b651b;p=collectd.git diff --git a/src/sensors.c b/src/sensors.c index 940120c6..ff8b580d 100644 --- a/src/sensors.c +++ b/src/sensors.c @@ -18,13 +18,26 @@ * * Authors: * Florian octo Forster + * + * Lubos Stanek Wed Oct 27, 2006 + * - config ExtendedSensorNaming option + * - precise sensor feature selection (chip-bus-address/type-feature) + * with ExtendedSensorNaming + * - more sensor features (finite list) + * - honor sensors.conf's ignored + * - config Sensor option + * - config IgnoreSelected option **/ #include "collectd.h" #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 @@ -40,8 +53,7 @@ #define BUFSIZE 512 -static char *filename_format = "sensors-%s.rrd"; - +/* temperature and fan sensors */ static char *ds_def[] = { "DS:value:GAUGE:"COLLECTD_HEARTBEAT":U:U", @@ -49,20 +61,176 @@ static char *ds_def[] = }; static int ds_num = 1; -#ifdef HAVE_LIBSENSORS +/* voltage sensors */ +static char *sensor_voltage_ds_def[] = +{ + "DS:voltage:GAUGE:"COLLECTD_HEARTBEAT":U:U", + NULL +}; +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 create chip-feature + * 1 => use new naming scheme chip-bus-address/type-feature + */ +static int sensor_extended_naming = 0; + +#if SENSORS_HAVE_READ typedef struct featurelist { const sensors_chip_name *chip; const sensors_feature_data *data; + 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) +{ + if (sensor_list == NULL) + sensor_list = ignorelist_create (1); + + if (strcasecmp (key, "Sensor") == 0) + { + if (ignorelist_add (sensor_list, value)) + { + syslog (LOG_EMERG, "Cannot add value to ignorelist."); + return (1); + } + } + 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)) + ignorelist_set_invert (sensor_list, 0); + } + else if (strcasecmp (key, "ExtendedSensorNaming") == 0) + { + if ((strcasecmp (value, "True") == 0) + || (strcasecmp (value, "Yes") == 0) + || (strcasecmp (value, "On") == 0)) + sensor_extended_naming = 1; + else + sensor_extended_naming = 0; + } + else + { + return (-1); + } + + return (0); +} static void collectd_sensors_init (void) { -#ifdef HAVE_LIBSENSORS +#if SENSORS_HAVE_READ FILE *fh; featurelist_t *last_feature = NULL; featurelist_t *new_feature; @@ -92,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; } @@ -104,49 +273,106 @@ 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 temperature for now.. */ - if (strncmp (data->name, "temp", 4) - && strncmp (data->name, "fan", 3)) - continue; - - if ((new_feature = (featurelist_t *) malloc (sizeof (featurelist_t))) == NULL) + /* Only known features */ + for (i = 0; known_features[i].type >= 0; i++) { - perror ("malloc"); - continue; - } + 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) + { + DBG ("sensors plugin: malloc: %s", + strerror (errno)); + syslog (LOG_ERR, "sensors plugin: malloc: %s", + strerror (errno)); + break; + } + + 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 */ - /* - syslog (LOG_INFO, "sensors: Adding feature: %s/%s", chip->prefix, data->name); - */ + if (first_feature == NULL) + sensors_cleanup (); +#endif /* if SENSORS_HAVE_READ */ - new_feature->chip = chip; - new_feature->data = data; - new_feature->next = NULL; + return; +} - if (first_feature == NULL) - { - first_feature = new_feature; - last_feature = new_feature; - } - else - { - last_feature->next = new_feature; - last_feature = new_feature; - } - } +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; } - if (first_feature == NULL) - sensors_cleanup (); -#endif /* defined(HAVE_LIBSENSORS) */ + sensors_cleanup (); +#endif /* if SENSORS_HAVE_READ */ - return; + ignorelist_free (sensor_list); +} + +static void sensors_voltage_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 + status = snprintf (file, BUFSIZE, old_filename_format, inst); + + if ((status < 1) || (status >= BUFSIZE)) + return; + + rrd_update_file (host, file, val, sensor_voltage_ds_def, sensor_voltage_ds_num); } static void sensors_write (char *host, char *inst, char *val) @@ -154,41 +380,109 @@ static void sensors_write (char *host, char *inst, char *val) char file[BUFSIZE]; int status; - status = snprintf (file, BUFSIZE, filename_format, inst); - if (status < 1) + /* skip ignored in our config */ + if (ignorelist_match (sensor_list, inst)) return; - else if (status >= BUFSIZE) + + /* extended sensor naming */ + if (sensor_extended_naming) + status = snprintf (file, BUFSIZE, extended_filename_format, inst); + else + 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 (buf, BUFSIZE, "%u:%.3f", (unsigned int) curtime, value) >= BUFSIZE) + if (snprintf (inst, BUFSIZE, "%s-%s", chip_prefix, feat_name) + >= BUFSIZE) return; - if (snprintf (inst, BUFSIZE, "%s-%s", chip_prefix, feat_name) >= BUFSIZE) + /* skip ignored in our config */ + if (ignorelist_match (sensor_list, inst)) return; - plugin_submit (MODULE_NAME, inst, buf); + if (snprintf (buf, BUFSIZE, "%u:%.3f", (unsigned int) curtime, + value) >= BUFSIZE) + return; + + 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) { featurelist_t *feature; double value; + char chip_fullprefix[BUFSIZE]; for (feature = first_feature; feature != NULL; feature = feature->next) { if (sensors_get_feature (*feature->chip, feature->data->number, &value) < 0) continue; - sensors_submit (feature->data->name, feature->chip->prefix, value); + 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) + 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 + { + sensors_submit (feature->data->name, + feature->chip->prefix, + value, feature->type); + } } } #else @@ -198,6 +492,9 @@ 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); } #undef BUFSIZE