476 lines
13 KiB
Diff
476 lines
13 KiB
Diff
|
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 <net-snmp/net-snmp-config.h>
|
||
|
+
|
||
|
+#include <stdio.h>
|
||
|
+#if HAVE_STDLIB_H
|
||
|
+#include <stdlib.h>
|
||
|
+#endif
|
||
|
+#if HAVE_STRING_H
|
||
|
+#include <string.h>
|
||
|
+#else
|
||
|
+#include <strings.h>
|
||
|
+#endif
|
||
|
+
|
||
|
+#include <getopt.h>
|
||
|
+#include <errno.h>
|
||
|
+#include <dlfcn.h>
|
||
|
+
|
||
|
+#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
|