X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsensors.c;h=209482e09f88e37a536641bda22d71e2d71810b4;hb=d0268299fc6a628f27667c22666f571cac839857;hp=9319f2048a46e8492e437af9d70f336d8461cdd2;hpb=c19cd5976b40f03d21215882f827b4ed96d012e9;p=collectd.git diff --git a/src/sensors.c b/src/sensors.c index 9319f204..209482e0 100644 --- a/src/sensors.c +++ b/src/sensors.c @@ -1,6 +1,7 @@ /** * collectd - src/sensors.c - * Copyright (C) 2005-2007 Florian octo Forster + * Copyright (C) 2005-2008 Florian octo Forster + * Copyright (C) 2006 Luboš Staněk * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -26,6 +27,10 @@ * - honor sensors.conf's ignored * - config Sensor option * - config IgnoreSelected option + * + * Henrique de Moraes Holschuh + * - use default libsensors config file on API 0x400 + * - config SensorConfigFile option **/ #include "collectd.h" @@ -42,17 +47,22 @@ # define SENSORS_API_VERSION 0x000 #endif -#define SENSOR_TYPE_VOLTAGE 0 -#define SENSOR_TYPE_FANSPEED 1 -#define SENSOR_TYPE_TEMPERATURE 2 -#define SENSOR_TYPE_UNKNOWN 3 - +/* + * The sensors library prior to version 3.0 (internal version 0x400) didn't + * report the type of values, only a name. The following lists are there to + * convert from the names to the type. They are not used with the new + * interface. + */ #if SENSORS_API_VERSION < 0x400 -static char *sensor_to_type[] = +static char *sensor_type_name_map[] = { +# define SENSOR_TYPE_VOLTAGE 0 "voltage", +# define SENSOR_TYPE_FANSPEED 1 "fanspeed", +# define SENSOR_TYPE_TEMPERATURE 2 "temperature", +# define SENSOR_TYPE_UNKNOWN 3 NULL }; @@ -63,9 +73,7 @@ struct sensors_labeltypes_s }; typedef struct sensors_labeltypes_s sensors_labeltypes_t; -/* - * finite list of known labels extracted from lm_sensors - */ +/* finite list of known labels extracted from lm_sensors */ static sensors_labeltypes_t known_features[] = { { "fan1", SENSOR_TYPE_FANSPEED }, @@ -129,9 +137,9 @@ static const char *config_keys[] = { "Sensor", "IgnoreSelected", - NULL + "SensorConfigFile" }; -static int config_keys_num = 2; +static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); #if SENSORS_API_VERSION < 0x400 typedef struct featurelist @@ -145,6 +153,7 @@ typedef struct featurelist # ifndef SENSORS_CONF_PATH # define SENSORS_CONF_PATH "/etc/sensors.conf" # endif +static char *conffile = SENSORS_CONF_PATH; /* #endif SENSORS_API_VERSION < 0x400 */ #elif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) @@ -156,9 +165,7 @@ typedef struct featurelist struct featurelist *next; } featurelist_t; -# ifndef SENSORS_CONF_PATH -# define SENSORS_CONF_PATH "/etc/sensors3.conf" -# endif +static char *conffile = NULL; /* #endif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */ #else /* if SENSORS_API_VERSION >= 0x500 */ @@ -166,17 +173,73 @@ typedef struct featurelist "as bug." #endif -static const char *conffile = SENSORS_CONF_PATH; featurelist_t *first_feature = NULL; static ignorelist_t *sensor_list; -static time_t sensors_config_mtime = 0; + +#if SENSORS_API_VERSION < 0x400 +/* full chip name logic borrowed from lm_sensors */ +static int sensors_snprintf_chip_name (char *buf, size_t buf_size, + const sensors_chip_name *chip) +{ + int status = -1; + + if (chip->bus == SENSORS_CHIP_NAME_BUS_ISA) + { + status = ssnprintf (buf, buf_size, + "%s-isa-%04x", + chip->prefix, + chip->addr); + } + else if (chip->bus == SENSORS_CHIP_NAME_BUS_DUMMY) + { + status = snprintf (buf, buf_size, "%s-%s-%04x", + chip->prefix, + chip->busname, + chip->addr); + } + else + { + status = snprintf (buf, buf_size, "%s-i2c-%d-%02x", + chip->prefix, + chip->bus, + chip->addr); + } + + return (status); +} /* int sensors_snprintf_chip_name */ + +static int sensors_feature_name_to_type (const char *name) +{ + int i; + + /* Yes, this is slow, but it's only ever done during initialization, so + * it's a one time cost.. */ + for (i = 0; i < known_features_num; i++) + if (strcasecmp (known_features[i].label, name) == 0) + return (known_features[i].type); + + return (SENSOR_TYPE_UNKNOWN); +} /* int sensors_feature_name_to_type */ +#endif static int sensors_config (const char *key, const char *value) { if (sensor_list == NULL) sensor_list = ignorelist_create (1); - if (strcasecmp (key, "Sensor") == 0) + /* TODO: This setting exists for compatibility with old versions of + * lm-sensors. Remove support for those ancient versions in the next + * major release. */ + if (strcasecmp (key, "SensorConfigFile") == 0) + { + char *tmp = strdup (value); + if (tmp != NULL) + { + sfree (conffile); + conffile = tmp; + } + } + else if (strcasecmp (key, "Sensor") == 0) { if (ignorelist_add (sensor_list, value)) { @@ -188,9 +251,7 @@ static int sensors_config (const char *key, const char *value) 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)) + if (IS_TRUE (value)) ignorelist_set_invert (sensor_list, 0); } else @@ -221,47 +282,37 @@ void sensors_free_features (void) static int sensors_load_conf (void) { - FILE *fh; + static int call_once = 0; + + FILE *fh = NULL; featurelist_t *last_feature = NULL; const sensors_chip_name *chip; int chip_num; - struct stat statbuf; int status; - - status = stat (conffile, &statbuf); - if (status != 0) - { - char errbuf[1024]; - ERROR ("sensors plugin: stat (%s) failed: %s", conffile, - sstrerror (errno, errbuf, sizeof (errbuf))); - sensors_config_mtime = 0; - } - if ((sensors_config_mtime != 0) - && (sensors_config_mtime == statbuf.st_mtime)) - return (0); + if (call_once) + return 0; - if (sensors_config_mtime != 0) - { - NOTICE ("sensors plugin: Reloading config from %s", - conffile); - sensors_free_features (); - sensors_config_mtime = 0; - } + call_once = 1; - fh = fopen (conffile, "r"); - if (fh == NULL) + if (conffile != NULL) { - char errbuf[1024]; - ERROR ("sensors plugin: fopen(%s) failed: %s", conffile, - sstrerror (errno, errbuf, sizeof (errbuf))); - return (-1); + fh = fopen (conffile, "r"); + if (fh == NULL) + { + char errbuf[1024]; + ERROR ("sensors plugin: fopen(%s) failed: %s", conffile, + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } } status = sensors_init (fh); - fclose (fh); + if (fh) + fclose (fh); + if (status != 0) { ERROR ("sensors plugin: Cannot initialize sensors. " @@ -269,8 +320,6 @@ static int sensors_load_conf (void) return (-1); } - sensors_config_mtime = statbuf.st_mtime; - #if SENSORS_API_VERSION < 0x400 chip_num = 0; while ((chip = sensors_get_detected_chips (&chip_num)) != NULL) @@ -281,7 +330,8 @@ static int sensors_load_conf (void) while (42) { const sensors_feature_data *feature; - int i; + int feature_type; + featurelist_t *fl; feature = sensors_get_all_features (*chip, &feature_num0, &feature_num1); @@ -292,65 +342,67 @@ static int sensors_load_conf (void) /* "master features" only */ if (feature->mapping != SENSORS_NO_MAPPING) + { + DEBUG ("sensors plugin: sensors_load_conf: " + "Ignoring subfeature `%s', " + "because (feature->mapping " + "!= SENSORS_NO_MAPPING).", + feature->name); continue; + } - /* Only known features */ - for (i = 0; i < known_features_num; i++) + /* skip ignored in sensors.conf */ + if (sensors_get_ignored (*chip, feature->number) == 0) { - featurelist_t *fl; - - if (strcasecmp (feature->name, - known_features[i].label) - != 0) - continue; - - /* skip ignored in sensors.conf */ - if (sensors_get_ignored (*chip, feature->number) == 0) - break; - - DEBUG ("Adding feature: %s-%s-%s", - chip->prefix, - sensor_to_type[known_features[i].type], + DEBUG ("sensors plugin: sensors_load_conf: " + "Ignoring subfeature `%s', " + "because " + "`sensors_get_ignored' told " + "me so.", feature->name); + continue; + } - fl = (featurelist_t *) malloc (sizeof (featurelist_t)); - if (fl == NULL) - { - ERROR ("sensors plugin: malloc failed."); - continue; - } - memset (fl, '\0', sizeof (featurelist_t)); - - fl->chip = chip; - fl->data = feature; - fl->type = known_features[i].type; - - if (first_feature == NULL) - first_feature = fl; - else - last_feature->next = fl; - last_feature = fl; + feature_type = sensors_feature_name_to_type ( + feature->name); + if (feature_type == SENSOR_TYPE_UNKNOWN) + { + DEBUG ("sensors plugin: sensors_load_conf: " + "Ignoring subfeature `%s', " + "because its type is " + "unknown.", + feature->name); + continue; + } - /* stop searching known features at first found */ - break; - } /* for i */ + fl = (featurelist_t *) malloc (sizeof (featurelist_t)); + if (fl == NULL) + { + ERROR ("sensors plugin: malloc failed."); + continue; + } + memset (fl, '\0', sizeof (featurelist_t)); + + fl->chip = chip; + fl->data = feature; + fl->type = feature_type; + + if (first_feature == NULL) + first_feature = fl; + else + last_feature->next = fl; + last_feature = fl; } /* while sensors_get_all_features */ } /* while sensors_get_detected_chips */ /* #endif SENSORS_API_VERSION < 0x400 */ #elif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) chip_num = 0; - DEBUG ("sensors plugin: Calling sensors_get_detected_chips (NULL, %p)..", (void *) &chip_num); while ((chip = sensors_get_detected_chips (NULL, &chip_num)) != NULL) { const sensors_feature *feature; int feature_num = 0; - DEBUG ("sensors plugin: Handling chip with prefix `%s'", - (chip->prefix == NULL) - ? "(nil)" - : chip->prefix); - while ((feature = sensors_get_features (chip, &feature_num)) != NULL) { const sensors_subfeature *subfeature; @@ -360,7 +412,13 @@ static int sensors_load_conf (void) if ((feature->type != SENSORS_FEATURE_IN) && (feature->type != SENSORS_FEATURE_FAN) && (feature->type != SENSORS_FEATURE_TEMP)) + { + DEBUG ("sensors plugin: sensors_load_conf: " + "Ignoring feature `%s', " + "because its type is not " + "supported.", feature->name); continue; + } while ((subfeature = sensors_get_all_subfeatures (chip, feature, &subfeature_num)) != NULL) @@ -423,11 +481,10 @@ static void sensors_submit (const char *plugin_instance, value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - status = snprintf (match_key, sizeof (match_key), "%s/%s-%s", + status = ssnprintf (match_key, sizeof (match_key), "%s/%s-%s", plugin_instance, type, type_instance); - if ((status < 1) || (status >= sizeof (match_key))) + if (status < 1) return; - match_key[sizeof (match_key) - 1] = '\0'; if (sensor_list != NULL) { @@ -440,13 +497,15 @@ static void sensors_submit (const char *plugin_instance, vl.values = values; vl.values_len = 1; - vl.time = time (NULL); - strcpy (vl.host, hostname_g); - strcpy (vl.plugin, "sensors"); - strcpy (vl.plugin_instance, plugin_instance); - strcpy (vl.type_instance, type_instance); - plugin_dispatch_values (type, &vl); + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + sstrncpy (vl.plugin, "sensors", sizeof (vl.plugin)); + sstrncpy (vl.plugin_instance, plugin_instance, + sizeof (vl.plugin_instance)); + sstrncpy (vl.type, type, sizeof (vl.type)); + sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); + + plugin_dispatch_values (&vl); } /* void sensors_submit */ static int sensors_read (void) @@ -469,35 +528,16 @@ static int sensors_read (void) if (status < 0) continue; - /* full chip name logic borrowed from lm_sensors */ - if (fl->chip->bus == SENSORS_CHIP_NAME_BUS_ISA) - { - snprintf (plugin_instance, DATA_MAX_NAME_LEN, - "%s-isa-%04x", - fl->chip->prefix, - fl->chip->addr); - } - else if (fl->chip->bus == SENSORS_CHIP_NAME_BUS_DUMMY) - { - snprintf (plugin_instance, 512, "%s-%s-%04x", - fl->chip->prefix, - fl->chip->busname, - fl->chip->addr); - } - else - { - snprintf (plugin_instance, 512, "%s-i2c-%d-%02x", - fl->chip->prefix, - fl->chip->bus, - fl->chip->addr); - } - plugin_instance[sizeof (plugin_instance) - 1] = '\0'; + status = sensors_snprintf_chip_name (plugin_instance, + sizeof (plugin_instance), fl->chip); + if (status < 0) + continue; - strncpy (type_instance, fl->data->name, sizeof (type_instance)); - type_instance[sizeof (type_instance) - 1] = '\0'; + sstrncpy (type_instance, fl->data->name, + sizeof (type_instance)); sensors_submit (plugin_instance, - sensor_to_type[fl->type], + sensor_type_name_map[fl->type], type_instance, value); } /* for fl = first_feature .. NULL */ @@ -521,11 +561,9 @@ static int sensors_read (void) sizeof (plugin_instance), fl->chip); if (status < 0) continue; - plugin_instance[sizeof (plugin_instance) - 1] = '\0'; - strncpy (type_instance, fl->feature->name, + sstrncpy (type_instance, fl->feature->name, sizeof (type_instance)); - type_instance[sizeof (type_instance) - 1] = '\0'; if (fl->feature->type == SENSORS_FEATURE_IN) type = "voltage"; @@ -534,7 +572,7 @@ static int sensors_read (void) type = "fanspeed"; else if (fl->feature->type == SENSORS_FEATURE_TEMP) - type = "input"; + type = "temperature"; else continue;