Gestione di un UPS dumb
Se c'è una cosa che odio dell'ambiente Linux è
quando ti danno direttamente gli eseguibili dei programmi:
stai sicuro che ci sarà sempre qualche rogna in agguato! Mi
è successo con i driver per la Sound Blaster Live (non li posso
usare in kernel maggiori alla 2.2.9 o nei 2.3.x) e mi è successo pure con
il programma per gestire il mio UPS
della Online: probabilmente a causa
delle nuove librerie glibc il programma mi va in segmentation fault ogni
volta che lo lancio.
Nella vita non bisogna mai arrendersi e quindi mi sono
preso il programma powerd di
Miquel van Smoorenburg, la cui funzione è appunto quella di
gestire i gruppi di continuità. Pure troppo bene in
quanto appunto per poter essere il più generico possibile permette di
lavorare con UPS smart
(utilizzano la seriale per mandare e
ricevere comandi in maniera classica), UPS dumb
(utilizzano i segnali della seriale per indicare lo stato della corrente e delle batterie),
con segnali di mancata corrente arrivati dalla rete (non quella elettrica!)
e da stream di dati. In poche parole un programma abbastanza complesso,
in cui il solo capire quali sono i segnali da utilizzare e come configurarli
diventa una agonia.
Visto che quello che serve a me, come penso a molte
altre persone che utilizzano Linux in ambiente domestico, è un
semplice programmino che controlli i segnali della seriale e si comporti
di conseguenza, mi sono armato di editor e mi sono scritto un programma
per conto mio: in definitiva, a conti fatti, non ci sono molte cose da
dover gestire e quindi in una mezza giornata si possono ottenere buoni
risultati.
La cosa che in realtà mi ha creato qualche
problema è stato il capire come bisogna segnalare a init che
è andata via la corrente (questo in realtà in maniera
empirica lo avevo capito) e che la batteria è ormai scarica e
occorre spegnere il sistema. L'ambiente Unix, e quindi ancora di
più Linux, rendono disponibili in linea numerosi manuali, il
problema alle volte è solo quello di capire dove cercare una
cosa: vuoi capire come init gestisce l'assenza di corrente? man init!
ci vuol tanto??
Prima di procedere con la descrizione del programma, occorre che vi dica
quali segnali della seriale gestisce il mio
UPS, in
modo che sia per voi molto semplice modificarli secondo le vostre esigenze.
Pin |
Segnale |
Stato |
Descrizione |
1 |
CD |
Normalmente aperto |
Viene chiuso in caso di blackout o di tensione di rete in
ingresso al di fuori dell'intervallo permesso. |
5 |
Massa |
|
Collegamento di massa |
7 |
RTS |
|
Quando arriva un segnale positivo (da 5V a 12V DC) l'UPS si spegne. |
8 |
CTS |
Normalmente aperto |
Viene chiuso quando le batterie sono così scariche da consentire, in condizione
di carico al 100% collegato all'UPS, un'autonomia inferiore ai 2 minuti. |
9 |
RING |
Normalmente chiuso |
Viene aperto in caso di blackout o di tensione di rete in
ingresso al di fuori dell'intervallo permesso. |
Inoltre l'UPS si spegne automaticamente quando non rileva più
tensione sulla porta seriale (cioé quando è stato
spento il computer).
Il programma quindi apre la porta seriale, abbassa il
segnale RTS altrimenti in caso di assenza di corrente l'UPS si
spegnerebbe subito e comincia a monitorare lo stato della seriale; nel
caso rilevi dei cambiamenti provvede ad avvisare gli utenti collegati al
sistema e il processo init, che si gestisce gli eventi come definito nel
file /etc/inittab. Vi mostro qui a titolo di esempio come ho
configurato le tre voci in questione:
# Manca la corrente
pf::powerfail:/sbin/shutdown -h +10 \
"**MANCA LA CORRENTE** Salvare tutti i lavori in corso..."
# La batteria e' esaurita
pn::powerfailnow:/sbin/shutdown -h now \
"**LA BATTERIA E' ESAURITA** Spegnimento del sistema in corso..."
# E' tornata la corrente
pr:12345:powerokwait:/sbin/shutdown -c \
"**E' TORNATA LA CORRENTE** Il sistema riprende le normali operazioni"
RIFERIMENTI
Vi metto a disposizione i file necessari per gestire il gruppo di
continuità. Vi ricordo di controllare accuratamente che
segnali della seriale gestisce il vostro UPS e di modificare il
programma di conseguenza (mi è successo un paio di volte
durante le prove del powerd che nel momento di assenza di corrente
l'UPS si spegnesse immediatamente, per la gioia del pinguino).
Il programma si riferisce a /dev/UPS, che nel mio sistema
è un link simbolico al dispositivo seriale che pilota il
gruppo di continuità.
Il sito ufficiale del programma powerd a cui mi sono ispirato.
-
Il demone (sorgente C, 4409 byte) per il
controllo constante dei valori della seriale.
-
Lo script di init (tipo sconosciuto, 613 byte) per lanciare il demone in ambiente RedHat o Mandrake.