X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsensors.c;h=ff8b580de0a688e51bf6e02c6541de1d636b54ca;hb=2403dd00be7ee359a1da567ec1a3d1dddf179a58;hp=4dd826e2907fdb94cc941a713e955591de83a40b;hpb=52835eb94a3e86ae0d050398ed139b6eecd0e3e1;p=collectd.git diff --git a/src/sensors.c b/src/sensors.c index 4dd826e2..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" @@ -80,6 +81,7 @@ static char *extended_filename_format = "lm_sensors-%s.rrd"; #define SENSOR_TYPE_FANSPEED 2 #define SENSOR_TYPE_TEMPERATURE 3 +#if SENSORS_HAVE_READ static char *sensor_type_prefix[] = { "unknown", @@ -88,6 +90,7 @@ static char *sensor_type_prefix[] = "temperature", NULL }; +#endif typedef struct sensors_labeltypes { char *label; @@ -97,6 +100,7 @@ typedef struct sensors_labeltypes { /* * finite list of known labels extracted from lm_sensors */ +#if SENSORS_HAVE_READ static sensors_labeltypes known_features[] = { { "fan1", SENSOR_TYPE_FANSPEED }, @@ -153,6 +157,7 @@ static sensors_labeltypes known_features[] = { "12V", SENSOR_TYPE_VOLTAGE }, { 0, -1 } }; +#endif /* end new naming */ static char *config_keys[] = @@ -164,14 +169,8 @@ static char *config_keys[] = }; static int config_keys_num = 3; -static char **sensor_list = NULL; -static int sensor_list_num = 0; -/* - * sensor_list_action: - * 0 => 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 @@ -179,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; @@ -189,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) { @@ -238,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; @@ -359,18 +330,37 @@ static void collectd_sensors_init (void) 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 */ @@ -391,7 +381,7 @@ 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 */ @@ -418,7 +408,7 @@ static void sensors_submit (const char *feat_name, 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, @@ -503,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); }