diff -Naur net-snmp-5.1.1.old/agent/mibgroup/host/hr_sensor.c net-snmp-5.1.1/agent/mibgroup/host/hr_sensor.c --- net-snmp-5.1.1.old/agent/mibgroup/host/hr_sensor.c 1970-01-01 02:00:00.000000000 +0200 +++ net-snmp-5.1.1/agent/mibgroup/host/hr_sensor.c 2003-10-21 12:49:57.000000000 +0300 @@ -0,0 +1,322 @@ +/* This file was generated by mib2c and is intended for use as a mib module + for the ucd-snmp snmpd agent. */ + +#include + +#include +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_STRING_H +#include +#else +#include +#endif + +#include +#include +#include + +#include "sensors/sensors.h" +#include "sensors/error.h" + +#include "host_res.h" +#include "hr_sensor.h" + + +/* + * hr_sensor_variables_oid: + * this is the top level oid that we want to register under. This + * is essentially a prefix, with the suffix appearing in the + * variable below. + */ + + +oid hr_sensor_variables_oid[] = { 1,3,6,1,2,1,25,8 }; + + +/* + * variable2 hr_sensor_variables: + * this variable defines function callbacks and type return information + * for the hr_sensor mib section + */ + + +struct variable2 hr_sensor_variables[] = { + /* magic number , variable type , ro/rw , callback fn , L, oidsuffix */ +#define HRSENSORMAPPING 2 + { HRSENSORMAPPING, ASN_INTEGER , RONLY , var_hr_sensor, 2, { 1,1 } }, +#define HRSENSORNUMBER 3 + { HRSENSORNUMBER, ASN_INTEGER , RONLY , var_hr_sensor, 2, { 1,2 } }, +#define HRSENSORNAME 4 + { HRSENSORNAME , ASN_OCTET_STR , RONLY , var_hr_sensor, 2, { 1,3 } }, +#define HRSENSORLABEL 5 + { HRSENSORLABEL , ASN_OCTET_STR , RONLY , var_hr_sensor, 2, { 1,4 } }, +#define HRSENSORVALUE 6 + { HRSENSORVALUE , ASN_OCTET_STR , RONLY , var_hr_sensor, 2, { 1,5 } }, + +}; +/* (L = length of the oidsuffix) */ + + +#define DEFAULT_CONFIG_FILE_NAME "sensors.conf" + +static char *config_file_name; +FILE *config_file; +static const char *config_file_path[] = +{ "/etc", "/usr/lib/sensors", "/usr/local/lib/sensors", "/usr/lib", + "/usr/local/lib", ".", 0 }; + +static void open_config_file(void); +static int open_this_config_file(char *filename); + + +/* + * functions that are dynamically loaded if the lm_sensors library is + * installed. + */ +static int (*sensors_get_label_dl)(sensors_chip_name name, int feature, + char **result); +static int (*sensors_init_dl)(FILE *input); +static int (*sensors_get_feature_dl)(sensors_chip_name name, int feature, + double *result); +static const sensors_feature_data *(*sensors_get_all_features_dl) + (sensors_chip_name name, int *nr1,int *nr2); +static const sensors_chip_name *(*sensors_get_detected_chips_dl)(int *nr); + +#define CHIPS_MAX 20 +static sensors_chip_name chips[CHIPS_MAX]; +static int chips_count=0; +static int do_sets; + +/* This examines global var config_file, and leaves the name there too. + It also opens config_file. */ +static void open_config_file(void) +{ +#define MAX_FILENAME_LEN 1024 + char *filename; + char buffer[MAX_FILENAME_LEN]; + int res,i; + + if (config_file_name && !strcmp(config_file_name,"-")) { + config_file = stdin; + return; + } else if (config_file_name && index(config_file_name,'/')) { + if ((res = open_this_config_file(config_file_name))) { + fprintf(stderr,"Could not locate or open config file\n"); + fprintf(stderr,"%s: %s\n",config_file_name,strerror(res)); + exit(1); + } + } + else { + if (config_file_name) + filename = config_file_name; + else + filename = strdup(DEFAULT_CONFIG_FILE_NAME); + for (i = 0; config_file_path[i]; i++) { + if ((snprintf(buffer,MAX_FILENAME_LEN, + "%s/%s",config_file_path[i],filename)) < 1) { + fprintf(stderr, + "open_config_file: ridiculous long config file name!\n"); + exit(1); + } + if (!open_this_config_file(buffer)) { + free(config_file_name); + config_file_name = strdup(buffer); + return; + } + } + fprintf(stderr,"Could not locate or open config file!\n"); + exit(1); + } +} + +static int open_this_config_file(char *filename) +{ + config_file = fopen(filename,"r"); + if (! config_file) + return -errno; + return 0; +} + +static long *sensor_tbl = 0; +sensors_chip_name *chip_tbl = 0; +static int sensor_maxnum = 0; + +static void do_register(sensors_chip_name name) +{ + const char *algo,*adap; + + { + const sensors_feature_data *sensor; + const char *map=0; + int index0 = 0, index1 = 0; + + printf("%s\n", name); + + while ((sensor = sensors_get_all_features_dl (name, &index0, &index1)) + != NULL) { + if(sensor_tbl = realloc(sensor_tbl, sizeof(long) * (sensor_maxnum+2))) + sensor_tbl[sensor_maxnum] = sensor->number; + if (chip_tbl = realloc(chip_tbl, sizeof(sensors_chip_name) * (sensor_maxnum+2))) + chip_tbl[sensor_maxnum] = name; + sensor_maxnum++; + } + } +} + +/* + * init_hr_sensor(): + * Initialization routine. This is called when the agent starts up. + * At a minimum, registration of your variables should take place here. + */ +void init_hr_sensor(void) { + + const sensors_chip_name *chip; + int chip_nr,i; + int c,res; + void *sensors_library; + + /* This could probably due with a bit more error reporting. */ + sensors_library=dlopen("libsensors.so",RTLD_LAZY); + if(sensors_library==NULL) + return; // return before anything is registered + + sensors_get_label_dl=dlsym(sensors_library,"sensors_get_label"); + sensors_init_dl=dlsym(sensors_library,"sensors_init"); + sensors_get_feature_dl=dlsym(sensors_library,"sensors_get_feature"); + sensors_get_all_features_dl=dlsym(sensors_library, + "sensors_get_all_features"); + sensors_get_detected_chips_dl=dlsym(sensors_library, + "sensors_get_detected_chips"); + if(sensors_get_label_dl==NULL || sensors_init_dl==NULL || + sensors_get_feature_dl==NULL || sensors_get_all_features_dl==NULL || + sensors_get_detected_chips_dl==NULL) + return; // return before anything is registered + + /* register ourselves with the agent to handle our mib tree */ + REGISTER_MIB("hr_sensor", hr_sensor_variables, variable2, + hr_sensor_variables_oid); + + + /* place any other initialization junk you need here */ + + + chips[0].prefix = SENSORS_CHIP_NAME_PREFIX_ANY; + chips[0].bus = SENSORS_CHIP_NAME_BUS_ANY; + chips[0].addr = SENSORS_CHIP_NAME_ADDR_ANY; + chips_count = 1; + + open_config_file(); + + if ((res = sensors_init_dl(config_file))) { + return; + } + + for (chip_nr = 0; (chip = sensors_get_detected_chips_dl(&chip_nr));) + do_register (*chip); +} + + +/* + * var_hr_sensor(): + * This function is called every time the agent gets a request for + * a scalar variable that might be found within your mib section + * registered above. It is up to you to do the right thing and + * return the correct value. + * You should also correct the value of "var_len" if necessary. + * + * Please see the documentation for more information about writing + * module extensions, and check out the examples in the examples + * and mibII directories. + */ +unsigned char * +var_hr_sensor(struct variable *vp, + oid *name, + size_t *length, + int exact, + size_t *var_len, + WriteMethod **write_method) +{ + /* variables we may use later */ + static long long_ret; + static char *string = 0; + static oid objid[MAX_OID_LEN]; + static struct counter64 c64; + + const sensors_feature_data *sensor; + const char *map=0; + int index0 = 0, index1 = 0; + int sensor_idx = 0, sensor_num = 0; + sensors_chip_name chip_name; + double value; + + + if (header_simple_table(vp,name,length,exact,var_len,write_method,sensor_maxnum) + == MATCH_FAILED ) + return NULL; + + sensor_idx = name[*length - 1] - 1; + sensor_num = sensor_tbl[sensor_idx]; + chip_name = chip_tbl[sensor_idx]; + + while ((sensor = sensors_get_all_features_dl (chip_name, &index0, &index1)) + != NULL) { + if(sensor_num == sensor->number) { + /* + * this is where we do the value assignments for the mib results. + */ + switch(vp->magic) { + + + case HRSENSORMAPPING: + + long_ret = sensor->mapping; + return (unsigned char *) &long_ret; + + case HRSENSORNUMBER: + + long_ret = sensor_num; + return (unsigned char *) &long_ret; + + case HRSENSORNAME: + + string = malloc(SPRINT_MAX_LEN); + strncpy(string, sensor->name, SPRINT_MAX_LEN); + *var_len = strlen(string); + return (unsigned char *) string; + + case HRSENSORLABEL: + + string = malloc(SPRINT_MAX_LEN); + + if (sensors_get_label_dl (chip_name, sensor->number, &string)) { + return 0; + } + + *var_len = strlen(string); + return (unsigned char *) string; + + case HRSENSORVALUE: + + if (!(sensor->mode & SENSORS_MODE_R)) { + return 0; + } else if (!(sensor->mode & SENSORS_MODE_R)) { + return 0; + } else if (sensors_get_feature_dl (chip_name, sensor->number, &value)){ + return 0; + } + string = malloc(SPRINT_MAX_LEN); + snprintf(string, SPRINT_MAX_LEN, "%f", value); + *var_len = strlen(string); + return (unsigned char *) string; + + default: + ERROR_MSG(""); + return NULL; + } + } + } + return NULL; +} + diff -Naur net-snmp-5.1.1.old/agent/mibgroup/host/hr_sensor.h net-snmp-5.1.1/agent/mibgroup/host/hr_sensor.h --- net-snmp-5.1.1.old/agent/mibgroup/host/hr_sensor.h 1970-01-01 02:00:00.000000000 +0200 +++ net-snmp-5.1.1/agent/mibgroup/host/hr_sensor.h 2003-10-21 12:47:04.000000000 +0300 @@ -0,0 +1,24 @@ +/* This file was generated by mib2c and is intended for use as a mib module + for the ucd-snmp snmpd agent. */ + + +#ifndef _MIBGROUP_HRSENSOR_H +#define _MIBGROUP_HRSENSOR_H + + +/* we may use header_generic and header_simple_table from the util_funcs module */ + + +config_require(util_funcs) + + +/* function prototypes */ + + +extern void init_hr_sensor(void); +extern FindVarMethod var_hr_sensor; + + + + +#endif /* _MIBGROUP_HRSENSOR_H */ diff -Naur net-snmp-5.1.1.old/agent/mibgroup/host.h net-snmp-5.1.1/agent/mibgroup/host.h --- net-snmp-5.1.1.old/agent/mibgroup/host.h 2002-04-20 10:30:00.000000000 +0300 +++ net-snmp-5.1.1/agent/mibgroup/host.h 2003-10-21 12:47:04.000000000 +0300 @@ -15,6 +15,7 @@ config_require(host/hr_filesys) config_require(host/hr_swrun) config_require(host/hr_swinst) + config_require(host/hr_sensor) /* add the host resources mib to the default mibs to load */ config_add_mib(HOST-RESOURCES-MIB) diff -Naur net-snmp-5.1.1.old/mibs/HOST-RESOURCES-MIB.txt net-snmp-5.1.1/mibs/HOST-RESOURCES-MIB.txt --- net-snmp-5.1.1.old/mibs/HOST-RESOURCES-MIB.txt 2002-04-20 10:30:15.000000000 +0300 +++ net-snmp-5.1.1/mibs/HOST-RESOURCES-MIB.txt 2003-10-21 12:47:04.000000000 +0300 @@ -106,6 +106,7 @@ hrSWRunPerf OBJECT IDENTIFIER ::= { host 5 } hrSWInstalled OBJECT IDENTIFIER ::= { host 6 } hrMIBAdminInfo OBJECT IDENTIFIER ::= { host 7 } +hrSensor OBJECT IDENTIFIER ::= { host 8 } -- textual conventions @@ -1390,6 +1391,66 @@ (hex)'00 00 01 01 00 00 00 00'." ::= { hrSWInstalledEntry 5 } + +hrSensorEntry OBJECT-TYPE + SYNTAX hrSensorEntry + MAX-ACCESS not-accessible + STATUS current + DESCRIPTION + "The CPU temperature sensor settings." + INDEX { hrSensor } + ::= { hrSensor 1 } + +hrSensorEntry ::= SEQUENCE { + hrSensorNumber Integer32, + hrSensorMapping Integer32, + hrSensorName DisplayString, + hrSensorLabel DisplayString, + hrSensorValue DisplayString + } + + + +hrSensorMapping OBJECT-TYPE + SYNTAX Integer32 (1..2147483647) + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The mapping" + ::= { hrSensorEntry 1 } + +hrSensorNumber OBJECT-TYPE + SYNTAX Integer32 (1..2147483647) + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The Number" + ::= { hrSensorEntry 2 } + +hrSensorName OBJECT-TYPE + SYNTAX DisplayString + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The name of the sensor." + ::= { hrSensorEntry 3 } + +hrSensorLabel OBJECT-TYPE + SYNTAX DisplayString + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The label of the sensor." + ::= { hrSensorEntry 4 } + +hrSensorValue OBJECT-TYPE + SYNTAX DisplayString + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The value of the sensor" + ::= { hrSensorEntry 5 } + -- Conformance information hrMIBCompliances OBJECT IDENTIFIER ::= { hrMIBAdminInfo 2 } @@ -1456,6 +1517,13 @@ "The Installed Software Group. Implementation of this group is at the discretion of the implementor." + + GROUP hrSensorGroup + DESCRIPTION + "The Sensors Group. + Implementation of this group is at the discretion + of the implementor." + ::= { hrMIBCompliances 1 } hrSystemGroup OBJECT-GROUP @@ -1537,4 +1605,17 @@ "The Host Resources Installed Software Group." ::= { hrMIBGroups 6 } + hrSensorGroup OBJECT-GROUP + OBJECTS { + hrSensorEntry, + hrSensorNumber, + hrSensorMapping, + hrSensorName, + hrSensorLabel, + hrSensorValue + } + STATUS current + DESCRIPTION + "The Sensor Resources Group." + ::= { hrMIBGroups 7 } END