APCUPSD bug USB

Attenzione! Il post non è più aggiornato poiché il bug è stato risolto nella release 3.4.10 di apcupsd.

3.14.10 -- 13 September 2011         (Maintenance Release)
 
BUG FIXES
 
  * Fix missing status and spurrious incorrect status on newer BackUPS CS
    models using USB interface.
  [...]

APCUPSD è un comodissimo software per chi possiede un UPS della APC.
Esso permette di monitorare lo stato dell’UPS, inviare alert e email in caso di blackout, avviare lo spegnimento dei server collegati a seguito di un blackout prolungato, ecc…

Dall’ultima versione, la 3.14.8, è stato introdotto un bug che si viene a verificare nel caso di utilizzo del software in abbinamento ad un UPS APC BackUp CS collegato tramite USB: ogni qualvolta che il demone effettua il polling dell’unità viene generato un errore di controllo nel subsystem USB

[...]
USB disconnect, address 6
usb 3-2: ctrl urb status -62 received
[...]

causando tra l’altro la disconnessione e riconnessione della periferica HID (viene vista dal kernel come una HID).Questo ha come conseguenza la scrittura un enorme numero di messaggi di errore nel dmesg (una ad ogni poll, mediamente 10 minuti) e una continua segnalazione dal demone di mancato collegamento con l’unità monitorata (via mail e via wall).

Per ovviare a questo inconveniente è sufficiente scaricare il pacchetto con i sorgenti dal sito ufficiale e commentare la riga #68 situata in src/drivers/usb/usb.c

// {CI_VBATT,                   0x00840030, P_PWSUM,   T_UNITS,    true },  /* Battery Voltage (alternative) */

Risultante nella patch

--- usb.c.old    2011-07-20 23:54:37.202683558 +0200
+++ usb.c    2011-07-13 11:33:03.642333310 +0200
@@ -65,7 +65,7 @@
{CI_VLINE,                   0x00840030, P_INPUT,   T_UNITS,    true },  /* Line Voltage */
{CI_VOUT,                    0x00840030, P_OUTPUT,  T_UNITS,    true },  /* Output Voltage */
{CI_VBATT,                   0x00840030, P_BATTERY, T_UNITS,    true },  /* Battery Voltage */
-   {CI_VBATT,                   0x00840030, P_PWSUM,   T_UNITS,    true },  /* Battery Voltage (alternative) */
+   // {CI_VBATT,                   0x00840030, P_PWSUM,   T_UNITS,    true },  /* Battery Voltage (alternative) */
{CI_NONE,                    0x00840031, P_ANY,     T_UNITS,    false},  /* Current */
{CI_FREQ,                    0x00840032, P_OUTPUT,  T_UNITS,    true },  /* Frequency */
{CI_NONE,                    0x00840033, P_ANY,     T_UNITS,    false},  /* ApparentPower */

a questo punto è possibile compilare i sorgenti con il classico metodo.

Per prima cosa eseguire il ./configure. Utilizzando solo la funzione USB ho utilizzato i parametri in modo da disattivare tutto ciò che non mi serviva; una lista esaustiva delle opzioni è disponibile eseguendo

./configure --help

Ovviamente controllate di avere le corrette dipendenze: gcc, make… su Fedora/CentOS è sufficiente un

yum install -y gcc gcc-c++ make

Quindi nel mio caso ho eseguito

./configure --disable-apcsmart --disable-dumb --enable-usb --disable-net --disable-snmp --disable-net-snmp --disable-testb --disable-pcnet --with-upscable=usb --with-upstype=usb --with-dev=/dev/usb/hiddev0

Nota: parametri upscable, upstype e dev possono essere cambiati successivamente attraverso il file di configurazione del demone.

Eseguire il comando make

make

e infine da root o con sudo

sudo make install

A questo punto il problema sarà risolto e il vostro server/pc sarà al sicuro e monitorato.

APCUPS dispone anche di un interfaccia web attraverso cgi.

Per abilitarla è necessario eseguire il ./configure con ulteriori opzioni (i path vanno regolati di conseguenza)

./configure --disable-apcsmart --disable-dumb --enable-usb --disable-net --disable-snmp --disable-net-snmp --disable-testb --disable-pcnet --with-upscable=usb --with-upstype=usb --with-dev=/dev/usb/hiddev0 --with-cgi-bin=/var/www/cgi-bin --with-css-dir=/var/www/cgi-bin

a patto di avere installato il pacchetto gd-devel

yum install -y gd-devel

Al termine della compilazione, su Fedora/CentOS è possibile fare pulizia dei dev tools con

yum erase -y --remove-leaves gcc gcc-c++ make gd-devel

(avendo l’ottimo plugin di yum remove-with-leaves)

Riferimenti:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=611082