Qualche mese fa ho comprato una unità UPS della APC, e per la precisione il modello RS 1000va.
E’ un’unità molto compatta, con un design particolarmente curato, che si può installare sia in orizzontale che in verticale, ma è pensata per un uso “desktop” e per questo a corredo viene fornito solo il software per Windows PowerChute Personal Edition.
Io invece la uso per assicurare l’alimentazione del mio server con s.o. FreeBSD.
La prima cosa che ho fatto è stato di esplorare l’albero dei ports e cercare un software per svolgere un compito molto, molto semplice: segnalare nel log ogni evento che ineteressi l’UPS (in pratica interruzione/ripristino della rete elettrica) e shutdown programmato in caso di interruzione prolungata dell’alimentazione.
Ho provato alcuni ports che a prima vista sembravano interessanti ma, non ho avuto molta fortuna: non sono riuscito a far funzionare i software che ho provato con questa unità.
Mi sono inoltre accorto che quasi tutti questi software offrivano molte più funzionalità di quelle che servono a me!
Una breve ricerca in rete mi ha confermato che anche altri utenti FreeBSD non erano riusciti a trovare un software, che funzionasse con unità UPS della APC collegate via USB, ma ho anche trovato un sorgente in C che, seppur incompleto, sembrava fare proprio quello che mi serviva e sembrava anche compatibile questa UPS.
Scaricato e compilato, in effetti comunicava correttamente con l’UPS, ma purtroppo era incompleto e non perfettamente adatto alle mie necessità.
La decisione di scriverne uno da zero è stata quasi immediata. Per velocizzare la realizzazione ho scelto di usare il Perl, e nonostante io non sia un esperto di Perl, devo dire che la decisione si è rivelata corretta: dopo un paio di giorni era nato apcusbd un demone che si aggancia al device con cui FreeBSD riconosce l’UPS, e ne riceve gli eventi.
Ad alcuni di questi eventi è possibile associare uno script o un comando da eseguire. Gli eventi ad oggi tracciati da apcusbd sono i seguenti:
OnBattery: l’unità UPS non è più alimentata dalla rete elettrica e sta utilizzando la propria batteria interna
OnFacility: l’unità UPS è alimentata dalla rete elettrica
OnShutdown: l’unità UPS è in stato OnBattery e il livello di carica delle batterie è sceso al di sotto della soglia indicata in configurazione
Ad ognuno di questi eventi può essere associata l’esecuzione di un comando o di uno script, e questo fa di apcusbd un software molto flessibile.
Ad esempio è possibile associare allo stato OnShutdown un comando di shutdown per il server locale (shutdown -h now), oppure associare uno script che consenta di comandare a più server di eseguire uno shutdown immediato,
Come ho già detto apcusbd è stato realizzato e testato su FreeBSD, ma penso che con qualche piccolo aggiustamento possa funzionare anche su altri sistemi operativi, sia della famiglia BSD, che Linux o altri.
Potete scaricare apcusbd da qui: http://www.mauriziogiunti.it/apcusbd.en.html
All’interno del pacchetto tgz troverete, oltre ai file di documentazione (README e INSTALL), i tre file che compongono il software:
apcusbd: è lo script in perl che costituisce il cuore del demone. Deve essere copiato in /usr/local/sbin e reso accessibile ed eseguible solo a root:wheel.
apcusbd.sh: è lo script di avvio del demone, deve essere copiato in /usr/local/etc/rc.d e anche questo deve essere reso accessibile ed eseguibile solo a root:wheel. Essendo uno script di avvio, riconosce i classici argomenti start/stop/status.
apcusbd.conf: questo file contiene la configurazione di apcusbd, e va copiato in /usr/local/etc. Anche in questo caso è opportuno che sia accessibile solo a root:wheel.
In ogni caso nel file INSTALL trovate istruzioni dettagliate per l’installazione, vi consiglio di seguirle pedissequamente!
Per quanto riguarda la configurazione, dovete editare il file apcusbd.conf e in primo luogo verificare se apcusbd sta usando il device corretto. Un buon metodo è quello di cercare di capire a quale device il sistema assegni l’unità UPS collegata sul bus USB usando dmesg, ad esempio sul mio sistema:
%dmesg | grep -i ups
uhid0: American Power Conversion Back-UPS RS 1000 FW:7.g8 .I USB FW:g8, rev 1.10/1.06, addr 2, iclass 3/0
Quindi il device è /dev/uhid0 e in apcusbd.conf avrò:
upsdev "/dev/uhid0"
A questo punto basta impostare la soglia e il comando di riavvio, in modo che, in caso di assenza prolungata dell’alimentazione di rete, se il livello della batteria scende sotto la soglia, il sistema esegua le azioni del caso.
A titolo di esempio il file di configurazione contiene le seguenti righe:
shutdownthreshold 5
shutdowncmd "shutdown -h now"
Ossia esegue “shutdown -h now” nel caso in cui il livello delle batterie scenda al di sotto del 5%.
E’ anche possibile fare in modo che apcusbd impartisca dei comandi ogniqualvolta rilevi che sia stata tolta o rimessa l’alimentazione elettrica di rete. Ad esempio può essere attivato uno script che esegue un rapido backup dei dati essenziali (magari un dump di un database mysql) ogni volta che l’alimentazione elettrica viene a mancare.
Basta specificare questi comandi, o i nomi degli script che contengono questi comandi, con i parametri di configurazione onbatterycmd e onutilitycmd.
Infine è possibile utilizzare il syslog daemon per tracciare tutti gli eventi dell’UPS. Di default apcusbd utilizza la facility local6 ma potete cambiare facility utilizzando il parametro logfacility.
A questo punto non mi resta altro da dire se non invitarvi a provare apcusbd e a scrivermi se siete riusciti a farlo funzionare con altre configurazioni o con altre unità UPS.
Ad oggi ho notizie di buon funzionamento di apcusbd con FreeBSD 5.3 e 4.11, e con unità UPS APC RS1000 e RS500.
Ciao.