--- /dev/null
+/*
+ * This file was generated by mib2c and is intended for use as a mib module
+ * for the ucd-snmp snmpd agent.
+ */
+
+
+/*
+ * This should always be included first before anything else
+ */
+#include <net-snmp/net-snmp-config.h>
+
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+/*
+ * minimal include directives
+ */
+#include "util_funcs.h"
+
+
+#include <time.h>
+#include <sensors/sensors.h>
+
+#include "lmSensors.h"
+
+#define N_TYPES (4)
+#define MAX_NAME (64)
+#define MAX_SENSORS (32)
+
+/*
+ * lmSensors_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 lmSensors_variables_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2021, 13, 16 };
+
+/*
+ * variable4 lmSensors_variables:
+ * this variable defines function callbacks and type return information
+ * for the lmSensors mib section
+ */
+
+struct variable4 lmSensors_variables[] = {
+ /*
+ * magic number , variable type , ro/rw , callback fn , L, oidsuffix
+ */
+#define LMTEMPSENSORSINDEX 3
+ {LMTEMPSENSORSINDEX, ASN_INTEGER, RONLY, var_lmSensorsTable, 3,
+ {2, 1, 1}},
+#define LMTEMPSENSORSDEVICE 4
+ {LMTEMPSENSORSDEVICE, ASN_OCTET_STR, RONLY, var_lmSensorsTable, 3,
+ {2, 1, 2}},
+#define LMTEMPSENSORSVALUE 5
+ {LMTEMPSENSORSVALUE, ASN_GAUGE, RONLY, var_lmSensorsTable, 3,
+ {2, 1, 3}},
+#define LMFANSENSORSINDEX 8
+ {LMFANSENSORSINDEX, ASN_INTEGER, RONLY, var_lmSensorsTable, 3,
+ {3, 1, 1}},
+#define LMFANSENSORSDEVICE 9
+ {LMFANSENSORSDEVICE, ASN_OCTET_STR, RONLY, var_lmSensorsTable, 3,
+ {3, 1, 2}},
+#define LMFANSENSORSVALUE 10
+ {LMFANSENSORSVALUE, ASN_GAUGE, RONLY, var_lmSensorsTable, 3,
+ {3, 1, 3}},
+#define LMVOLTSENSORSINDEX 13
+ {LMVOLTSENSORSINDEX, ASN_INTEGER, RONLY, var_lmSensorsTable, 3,
+ {4, 1, 1}},
+#define LMVOLTSENSORSDEVICE 14
+ {LMVOLTSENSORSDEVICE, ASN_OCTET_STR, RONLY, var_lmSensorsTable, 3,
+ {4, 1, 2}},
+#define LMVOLTSENSORSVALUE 15
+ {LMVOLTSENSORSVALUE, ASN_GAUGE, RONLY, var_lmSensorsTable, 3,
+ {4, 1, 3}},
+#define LMMISCSENSORSINDEX 18
+ {LMMISCSENSORSINDEX, ASN_INTEGER, RONLY, var_lmSensorsTable, 3,
+ {5, 1, 1}},
+#define LMMISCSENSORSDEVICE 19
+ {LMMISCSENSORSDEVICE, ASN_OCTET_STR, RONLY, var_lmSensorsTable, 3,
+ {5, 1, 2}},
+#define LMMISCSENSORSVALUE 20
+ {LMMISCSENSORSVALUE, ASN_GAUGE, RONLY, var_lmSensorsTable, 3,
+ {5, 1, 3}},
+};
+
+typedef struct {
+ char name[MAX_NAME];
+ int value;
+} _sensor;
+
+typedef struct {
+ int n;
+ _sensor sensor[MAX_SENSORS];
+} _sensor_array;
+
+static _sensor_array sensor_array[N_TYPES];
+static clock_t timestamp;
+
+
+static int sensor_init(void);
+static void sensor_load(void);
+static void _sensor_load(clock_t t);
+
+#define CONFIG_FILE_NAME "/etc/sensors.conf"
+
+/*
+ * init_lmSensors():
+ * Initialization routine. This is called when the agent starts up.
+ * At a minimum, registration of your variables should take place here.
+ */
+void
+init_lmSensors(void)
+{
+ sensor_init();
+
+ /*
+ * register ourselves with the agent to handle our mib tree
+ */
+ REGISTER_MIB("lmSensors", lmSensors_variables, variable4,
+ lmSensors_variables_oid);
+}
+
+/*
+ * var_lmSensorsTable():
+ * Handle this table separately from the scalar value case.
+ * The workings of this are basically the same as for var_lmSensors above.
+ */
+unsigned char *
+var_lmSensorsTable(struct variable *vp,
+ oid * name,
+ size_t * length,
+ int exact,
+ size_t * var_len, WriteMethod ** write_method)
+{
+ static long long_ret;
+ static unsigned char string[SPRINT_MAX_LEN];
+ int i;
+
+ int s_index = name[*length - 1] - 1;
+ int s_type = -1;
+ int n_sensors;
+
+ _sensor s;
+
+ sensor_load();
+
+ switch (vp->magic) {
+ case LMTEMPSENSORSINDEX:
+ case LMTEMPSENSORSDEVICE:
+ case LMTEMPSENSORSVALUE:
+ s_type = 0;
+ n_sensors = sensor_array[0].n;
+ break;
+
+ case LMFANSENSORSINDEX:
+ case LMFANSENSORSDEVICE:
+ case LMFANSENSORSVALUE:
+ s_type = 1;
+ n_sensors = sensor_array[1].n;
+ break;
+
+ case LMVOLTSENSORSINDEX:
+ case LMVOLTSENSORSDEVICE:
+ case LMVOLTSENSORSVALUE:
+ s_type = 2;
+ n_sensors = sensor_array[2].n;
+ break;
+
+ case LMMISCSENSORSINDEX:
+ case LMMISCSENSORSDEVICE:
+ case LMMISCSENSORSVALUE:
+ s_type = 3;
+ n_sensors = sensor_array[3].n;
+ break;
+
+ default:
+ s_type = -1;
+ n_sensors = 0;
+ }
+
+ if (header_simple_table(vp, name, length, exact,
+ var_len, write_method,
+ n_sensors) == MATCH_FAILED)
+ return NULL;
+
+ if (s_type < 0)
+ return NULL;
+
+ s = sensor_array[s_type].sensor[s_index];
+
+ switch (vp->magic) {
+ case LMTEMPSENSORSINDEX:
+ case LMFANSENSORSINDEX:
+ case LMVOLTSENSORSINDEX:
+ case LMMISCSENSORSINDEX:
+ long_ret = s_index;
+ return (unsigned char *) &long_ret;
+
+ case LMTEMPSENSORSDEVICE:
+ case LMFANSENSORSDEVICE:
+ case LMVOLTSENSORSDEVICE:
+ case LMMISCSENSORSDEVICE:
+ strncpy(string, s.name, SPRINT_MAX_LEN - 1);
+ *var_len = strlen(string);
+ return (unsigned char *) string;
+
+ case LMTEMPSENSORSVALUE:
+ case LMFANSENSORSVALUE:
+ case LMVOLTSENSORSVALUE:
+ case LMMISCSENSORSVALUE:
+ long_ret = s.value;
+ return (unsigned char *) &long_ret;
+
+ default:
+ ERROR_MSG("Unable to handle table request");
+ }
+
+ return NULL;
+}
+
+static int
+sensor_init(void)
+{
+ int res;
+ char filename[] = CONFIG_FILE_NAME;
+ clock_t t = clock();
+
+ FILE *fp = fopen(filename, "r");
+ if (!fp)
+ return 1;
+
+ if (res = sensors_init(fp))
+ return 2;
+
+ _sensor_load(t);
+ return 0;
+}
+
+static void
+sensor_load(void)
+{
+ clock_t t = clock();
+
+ if (t > timestamp + 60)
+ _sensor_load(t);
+
+ return;
+}
+
+static void
+_sensor_load(clock_t t)
+{
+ const sensors_chip_name *chip;
+ const sensors_feature_data *data;
+ int chip_nr = 0;
+ int a = 0;
+ int b = 0;
+
+ int i;
+ for (i = 0; i < N_TYPES; i++)
+ sensor_array[i].n = 0;
+
+ while (chip = sensors_get_detected_chips(&chip_nr)) {
+ while (data = sensors_get_all_features(*chip, &a, &b)) {
+ char *label;
+ double val;
+
+ if ((data->mode & SENSORS_MODE_R) &&
+ (data->mapping == SENSORS_NO_MAPPING) &&
+ !sensors_get_label(*chip, data->number, &label) &&
+ !sensors_get_feature(*chip, data->number, &val)) {
+ int type;
+ float mul;
+ _sensor_array *array;
+
+ if (strstr(label, "temp")) {
+ type = 0;
+ mul = 1000.0;
+ } else if (strstr(label, "fan")) {
+ type = 1;
+ mul = 1.0;
+ } else if (strstr(label, "V")) {
+ type = 2;
+ mul = 1000.0;
+ } else {
+ type = 3;
+ mul = 1000.0;
+ }
+
+ array = &sensor_array[type];
+
+ strncpy(array->sensor[array->n].name, label, MAX_NAME);
+ array->sensor[array->n].value = (int) (val * mul);
+ array->n++;
+ }
+ }
+ }
+
+ timestamp = t;
+}