blob: d503c43e2c25b4882d8411aa779ba2c42a35e0db [file] [log] [blame]
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/agent/hardware/sensors.h>
#include <time.h>
#include <kstat.h>
#include </usr/platform/sun4u/include/sys/envctrl.h>
void netsnmp_sensor_arch_init( void ) {
DEBUGMSGTL(("sensors:arch", "Initialise KStat Sensors module\n"));
}
int
netsnmp_sensor_arch_load(netsnmp_cache *cache, void *vp) {
netsnmp_sensor_info *sp;
int i;
const char *fantypes[]={"CPU","PWR","AFB"};
char name[ 256 ];
kstat_ctl_t *kc;
kstat_t *kp;
envctrl_fan_t *fan_info;
envctrl_ps_t *power_info;
envctrl_encl_t *enc_info;
DEBUGMSGTL(("sensors:arch", "Reload KStat Sensors module\n"));
kc = kstat_open();
if ( kc == 0) {
DEBUGMSGTL(("sensors:arch", "Couldn't open kstat\n"));
return 1;
}
/*
* Retrieve fan information
*/
kp = kstat_lookup( kc, ENVCTRL_MODULE_NAME, 0, ENVCTRL_KSTAT_FANSTAT);
if (( kp == 0 ) || (kstat_read( kc, kp, 0 ) == -1 )) {
DEBUGMSGTL(("sensors:arch", "No fan information\n"));
} else {
fan_info = (envctrl_fan_t *)kp->ks_data;
for (i=0; i<kp->ks_ndata; i++) {
memset( name, 0, 256 );
snprintf( name, 255, "%s%d", fantypes[fan_info->type], fan_info->instance );
sp = sensor_by_name( name, NETSNMP_SENSOR_TYPE_RPM );
if ( sp ) {
sp->value = fan_info->fanspeed;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
snprintf( sp->descr, 255, "fan type %s number %d",
fantypes[fan_info->type], fan_info->instance );
}
fan_info++;
}
}
/*
* Retrieve Power Supply information
*/
kp = kstat_lookup( kc, ENVCTRL_MODULE_NAME, 0, ENVCTRL_KSTAT_PSNAME);
if (( kp == 0 ) || (kstat_read( kc, kp, 0 ) == -1 )) {
DEBUGMSGTL(("sensors:arch", "No PSU information\n"));
} else {
power_info = (envctrl_ps_t *)kp->ks_data;
for (i=0; i<kp->ks_ndata; i++) {
memset( name, 0, 256 );
snprintf( name, 255, "PSU%d", power_info->instance );
sp = sensor_by_name( name, NETSNMP_SENSOR_TYPE_TEMPERATURE);
if ( sp ) {
sp->value = power_info->ps_tempr;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
snprintf( sp->descr, 255, "power supply %d", power_info->instance );
}
power_info++;
}
}
/*
* Retrieve Enclosure information
*/
kp = kstat_lookup( kc, ENVCTRL_MODULE_NAME, 0, ENVCTRL_KSTAT_ENCL);
if (( kp == 0 ) || (kstat_read( kc, kp, 0 ) == -1 )) {
DEBUGMSGTL(("sensors:arch", "No enclosure information\n"));
} else {
enc_info = (envctrl_encl_t *)kp->ks_data;
for (i=0; i<kp->ks_ndata; i++) {
/*
* The enclosure information covers several different types of sensor
*/
switch ( enc_info->type ) {
case ENVCTRL_ENCL_FSP:
DEBUGMSGTL(("sensors:arch:detail", "Enclosure Front Panel\n"));
sp = sensor_by_name( "FSP", NETSNMP_SENSOR_TYPE_OTHER);
if ( sp ) {
sp->value = enc_info->value;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
}
break;
case ENVCTRL_ENCL_AMBTEMPR:
DEBUGMSGTL(("sensors:arch:detail", "Enclosure Ambient Temperature\n"));
sp = sensor_by_name( "Ambient", NETSNMP_SENSOR_TYPE_TEMPERATURE);
if ( sp ) {
sp->value = enc_info->value;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
}
break;
case ENVCTRL_ENCL_CPUTEMPR:
DEBUGMSGTL(("sensors:arch:detail", "Enclosure CPU Temperature\n"));
memset( name, 0, 256 );
snprintf( name, 255, "CPU%d", enc_info->instance );
sp = sensor_by_name( name, NETSNMP_SENSOR_TYPE_TEMPERATURE);
if ( sp ) {
sp->value = enc_info->value;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
snprintf( sp->descr, 255, "CPU%d temperature", enc_info->instance );
}
break;
case ENVCTRL_ENCL_BACKPLANE4:
DEBUGMSGTL(("sensors:arch:detail", "Enclosure Backplane4\n"));
sp = sensor_by_name( "Backplane4", NETSNMP_SENSOR_TYPE_OTHER);
if ( sp ) {
sp->value = enc_info->value;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
}
break;
case ENVCTRL_ENCL_BACKPLANE8:
DEBUGMSGTL(("sensors:arch:detail", "Enclosure Backplane4\n"));
sp = sensor_by_name( "Backplane4", NETSNMP_SENSOR_TYPE_OTHER);
if ( sp ) {
sp->value = enc_info->value;
sp->flags|= NETSNMP_SENSOR_FLAG_ACTIVE;
}
break;
default:
DEBUGMSGTL(("sensors:arch:detail", "Unrecognised Enclosure entry (%d)n",
enc_info->type));
}
enc_info++;
}
}
return 0;
}