X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsensors.c;h=ff8b580de0a688e51bf6e02c6541de1d636b54ca;hb=2403dd00be7ee359a1da567ec1a3d1dddf179a58;hp=9da222936ed17fecefac9aca1003488608e64202;hpb=d34937fbce27c7f70bb2699e206abd74348763ce;p=collectd.git diff --git a/src/sensors.c b/src/sensors.c index 9da22293..ff8b580d 100644 --- a/src/sensors.c +++ b/src/sensors.c @@ -33,6 +33,7 @@ #include "common.h" #include "plugin.h" #include "configfile.h" +#include "utils_ignorelist.h" #include "utils_debug.h" #define MODULE_NAME "sensors" @@ -52,7 +53,7 @@ #define BUFSIZE 512 -/** temperature and fan sensors */ +/* temperature and fan sensors */ static char *ds_def[] = { "DS:value:GAUGE:"COLLECTD_HEARTBEAT":U:U", @@ -69,17 +70,18 @@ static char *sensor_voltage_ds_def[] = static int sensor_voltage_ds_num = 1; /* old naming */ -static char *filename_format = "sensors-%s.rrd"; +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 @@ -181,7 +178,7 @@ 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; @@ -191,37 +188,28 @@ typedef struct featurelist } 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) { @@ -240,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; @@ -291,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; } @@ -303,80 +273,103 @@ 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-%s", chip->prefix, sensor_type_prefix[known_features[i].type], data->name); - 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_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; /* skip ignored in our config */ - if (config_get_ignored (inst)) + 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); + status = snprintf (file, BUFSIZE, old_filename_format, inst); - if (status < 1) - return; - else if (status >= BUFSIZE) + if ((status < 1) || (status >= BUFSIZE)) return; rrd_update_file (host, file, val, sensor_voltage_ds_def, sensor_voltage_ds_num); @@ -388,47 +381,50 @@ static void sensors_write (char *host, char *inst, char *val) int status; /* skip ignored in our config */ - if (config_get_ignored (inst)) + if (ignorelist_match (sensor_list, inst)) return; /* extended sensor naming */ - if(sensor_extended_naming) - status = snprintf (file, BUFSIZE, sensor_filename_format, inst); + if (sensor_extended_naming) + status = snprintf (file, BUFSIZE, extended_filename_format, inst); else - status = snprintf (file, BUFSIZE, filename_format, inst); + status = snprintf (file, BUFSIZE, old_filename_format, inst); - if (status < 1) - return; - else if (status >= BUFSIZE) + 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, int type) +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)) + 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; if (type == SENSOR_TYPE_VOLTAGE) { - DBG ("%s: %s/%s, %s", MODULE_NAME_VOLTAGE, sensor_type_prefix[type], inst, buf); + 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); + DBG ("%s: %s/%s, %s", MODULE_NAME, + sensor_type_prefix[type], inst, buf); plugin_submit (MODULE_NAME, inst, buf); } } @@ -444,7 +440,7 @@ static void sensors_read (void) if (sensors_get_feature (*feature->chip, feature->data->number, &value) < 0) continue; - if(sensor_extended_naming) + if (sensor_extended_naming) { /* full chip name logic borrowed from lm_sensors */ if (feature->chip->bus == SENSORS_CHIP_NAME_BUS_ISA) @@ -477,11 +473,15 @@ static void sensors_read (void) continue; } - sensors_submit (feature->data->name, (const char *)chip_fullprefix, value, feature->type); + sensors_submit (feature->data->name, + chip_fullprefix, + value, feature->type); } else { - sensors_submit (feature->data->name, feature->chip->prefix, value, feature->type); + sensors_submit (feature->data->name, + feature->chip->prefix, + value, feature->type); } } } @@ -493,6 +493,7 @@ 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); }