2012/3/9 Greg A. Woods <[email protected]>: > From: "Greg A. Woods" <[email protected]> > > The "ups.temperature" and "ambient.temperature" values are monitored, if > available, and if either exceeds the configured "maxtemp" variable's > value, or 150 by default, the UPS reports that it is DYING so that NUT > can shut everything down and then turn it off with the > upsdrv_shutdown(epo=1) call. > --- > docs/man/snmp-ups.txt | 28 ++++++++++++++++++++++++++++ > drivers/snmp-ups.c | 24 +++++++++++++++++++++++- > drivers/snmp-ups.h | 3 ++- > 3 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/docs/man/snmp-ups.txt b/docs/man/snmp-ups.txt > index 5512fa0..c087aad 100644 > --- a/docs/man/snmp-ups.txt > +++ b/docs/man/snmp-ups.txt > @@ -70,6 +70,15 @@ Set SNMP version (default = v1, the other allowed value is > v2c) > *pollfreq*='value':: > Set polling frequency in seconds, to reduce network flow (default=30) > > +*maxtemp*='value':: > +Set the maximum temperature for the *ups.temperature* and > +*ambient.temperature* variables, above which point the UPS will report > +the emergency *DYING* state (default=150 (in degrees Celsius)). This > +option takes a numeric value in the range of 1 to 150. Typically this > +will cause connected systems to be safely shut down and the monitored > +UPS to be powered down completely (if possible) so that human > +intervention will be required to restart things. > + > *notransferoids*:: > Disable the monitoring of the low and high voltage transfer OIDs in > the hardware. This will remove input.transfer.low and input.transfer.high > @@ -148,6 +157,25 @@ The hostname of the UPS is specified with the "port" > value in > privPassword = myprivatepassphrase > desc = "Example SNMP v3 device, with the highest security > level" > > +MONITORING FOR UNHEALTHY ENVIRONMENTS > +------------------------------------- > + > +Many SNMP-capable UPS units can report on their internal temperature > +(see the *ups.temperature* and *ambient.temperature* variables). The > +driver will report a *DYING* state if this temperature exceeds some > +pre-set value. The default maximum temperature is set to 150 degrees > +Celsius, the point where many plastics begin to melt, but far past the > +point where the batteries have probably already self-destructed. A > +reasonable value to use may be somewhere between 45 and 50. Most > +battery specifications warn that operating over 40 C for long will > +seriously lower the battery's expected lifetime. Note that the battery > +may not be at the same temperature as the sensor. > + > +You may wish to observe the normal operating temperature of your UPS as > +reported by this driver, and perhaps measure it independently by hand as > +well, before setting a maximum temperature which will protect your UPS > +and nearby systems from certain physical damage. > + > AUTHORS > ------- > Arnaud Quette, Dmitry Frolov > diff --git a/drivers/snmp-ups.c b/drivers/snmp-ups.c > index ebf0cab..842fbdf 100644 > --- a/drivers/snmp-ups.c > +++ b/drivers/snmp-ups.c > @@ -274,6 +274,8 @@ void upsdrv_makevartable(void) > "Set the authentication protocol (MD5 or SHA) used for > authenticated SNMPv3 messages (default=MD5)"); > addvar(VAR_VALUE, SU_VAR_PRIVPROT, > "Set the privacy protocol (DES or AES) used for encrypted > SNMPv3 messages (default=DES)"); > + addvar(VAR_VALUE, SU_VAR_MAXTEMP, > + "Set the maximum allowed operating temperature (in degrees C, > default=150)"); > #if 0 /* XXX unused */ > addvar(VAR_VALUE, SU_VAR_SDTYPE, > "Set the shutdown mode (3 or 2, default=3)"); > @@ -1331,6 +1333,23 @@ bool_t snmp_ups_walk(int mode) > return status; > } > > +static void check_temperature(const char *type, int curtemp) > +{ > + char *val; > + int maxtemp = 150; /* 150 is far too high for sure... */ > + > + /* should */ > + > + if ((val = getval("maxtemp"))) { > + maxtemp = atoi(val); > + } > + if (curtemp > maxtemp) { > + upslogx(LOG_EMERG, "current value of %s at %d C exceeds > maximum temperature of %d C", type, curtemp, maxtemp); > + > + status_set("DYING"); /* dying! */ > + } > +} > + > bool_t su_ups_get(snmp_info_t *su_info_p) > { > static char buf[SU_INFOSIZE]; > @@ -1353,7 +1372,8 @@ bool_t su_ups_get(snmp_info_t *su_info_p) > } > > /* another special case */ > - if (!strcasecmp(su_info_p->info_type, "ambient.temperature")) { > + if (!strcasecmp(su_info_p->info_type, "ups.temperature") || > + !strcasecmp(su_info_p->info_type, "ambient.temperature")) { > float temp=0; > > status = nut_snmp_get_int(su_info_p->OID, &value); > @@ -1382,6 +1402,8 @@ bool_t su_ups_get(snmp_info_t *su_info_p) > snprintf(buf, sizeof(buf), "%.1f", temp); > su_setinfo(su_info_p, buf); > > + check_temperature(su_info_p->info_type, temp); > + > return TRUE; > } > > diff --git a/drivers/snmp-ups.h b/drivers/snmp-ups.h > index 2fd0400..b1d5e5b 100644 > --- a/drivers/snmp-ups.h > +++ b/drivers/snmp-ups.h > @@ -172,6 +172,8 @@ typedef struct { > #define SU_VAR_MIBS "mibs" > #define SU_VAR_POLLFREQ "pollfreq" > #define SU_VAR_SDTYPE "sdtype" /* XXX unused */ > +#define SU_VAR_WARNTEMP "warntemp" /* XXX unused -- for > alarms */ > +#define SU_VAR_MAXTEMP "maxtemp" > /* SNMP v3 related parameters */ > #define SU_VAR_SECLEVEL "secLevel" > #define SU_VAR_SECNAME "secName" > @@ -181,7 +183,6 @@ typedef struct { > #define SU_VAR_PRIVPROT "privProtocol" > #define SU_VAR_MAGIC "magic" > > - > #define SU_INFOSIZE 128 > #define SU_BUFSIZE 32 > #define SU_LARGEBUF 256
this one is very interesting, and part of the things I wanted to do for years. I've however postponed it for now for 2 reasons: - DYING is postponed for now, - I would really prefer a generic implementation in upsmon / upssched, and provide this to any driver, not just snmp-ups. And this will (probably) require some discussions and investigations... cheers, Arnaud -- Linux / Unix Expert R&D - Eaton - http://powerquality.eaton.com Network UPS Tools (NUT) Project Leader - http://www.networkupstools.org/ Debian Developer - http://www.debian.org Free Software Developer - http://arnaud.quette.free.fr/ _______________________________________________ Nut-upsdev mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/nut-upsdev
