18 gennaio 2021

Ubuntu 18: usare NUT per monitorare un UPS APC via USB

Ancora un lungo post dedicato ai sistemisti. Stavolta vi racconto cosa ho fatto per collegare un UPS ad un server Linux Ubuntu, in modo da fare una chiusura ordinata quando va via la corrente.

UPS APC

Abbiamo un UPS APC con interfaccia USB. 

Nel mio caso specifico un Back-UPS BR1500, con uno strano cavetto da RJ45 a USB.

Se non trovate il cavetto, potete costruirvelo o comprarlo su Amazon: non è un cavetto USB standard.

La serie Back-UPS arriva con una versione di software APC "PowerChute" adatta a Windows 10 Home. Ma nessuna delle macchine alimentate dall'UPS gira con Windows Home. Software archiviato.

Se fosse stata una macchina isolata, avremmo potuto installare il driver apcupsd, che non propone nativamente un sistema di propagazione dell'informazione.

Ma noi vorremmo che lo stato dell'UPS sia interrogabile sulla rete locale, in modo che tutti i dispositivi alimentati possano eseguire una chiusura programmata. Per questo motivo l'abbiamo collegato ad un server Ubuntu 18 e abbiamo scelto il software gratuito NUT.

NUT

Il progetto Network UPS Tools, o NUT, è poco manutenuto, ma è stabile da parecchi anni e ben documentato. Le istruzioni che seguono sono state ricavate da:

  1. la documentazione di NUT
  2. https://seuck.blogspot.com/2018/10/ups-monitor-via-usb.html (italiano, grazie Francesco Chirico!)
  3. https://blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux/ (inglese, da cui ha attinto il precedente)
  4. https://www.howtoforge.com/monitoring-ups-power-status-with-nut-on-opensuse10.3  (inglese)
  5. https://raymondjdouglas.com/blog/2018/ups-monitoring (in inglese)

La prima cosa da fare è verificare la compatibilità hardware del nostro UPS con i driver di NUT. In questa pagina sono elencati parecchi modelli di UPS e il driver relativo, che dovrete specificare in fase di configurazione.

Nel mio caso, ho trovato nell'elenco un generico modello APC Back-UPS USB che dice funzionare con il driver usbhid-ups.

Andiamo ad installare NUT.

$ sudo apt-get install nut

La directory con i file di configurazione è: /etc/nut

Se necessario, modificate i permesssi sui file. Nel mio caso non ho toccato niente, ma sono quasi tutti impostati con proprietario root e gruppo nut, come se avessi lanciato:

$ sudo chown root:nut /etc/nut/*

Andiamo a configurare NUT.

Se abbiamo paura di pasticciare i file, possiamo tenerci una copia di scorta di quelli di default:

$ sudo cp *.conf *.conf.bak

Il driver

Secondo questo blog, esiste un comando nut-scanner, che potrebbe aiutarvi a determinare il driver corretto. Questo può essere utile nel caso in cui avete già comprato l'UPS e volete fare degli esperimenti per vedere se riuscite a comunicare.

$ sudo nut-scanner -U

Per indicare quale driver usare e con che parametri, modifichiamo il file ups.conf

$ sudo nano ups.conf

creando una nuova sezione per il nostro ups:

 [backups]

    driver = usbhid-ups

    port = auto        # non serve

    desc = "Sant'UPS"    #proteggimi tu

Ho dovuto commentare (con #) l'ultima riga 

#maxretry = 3 

perche è un parametro non richiesto per USB.

Avviamo il driver e verifichiamo che riesca a parlare con l'UPS:

$ sudo upsdrvctl start

Se tutto è andato bene, dovrebbe risponderci qualcosa che assomiglia a:

Network UPS Tools - UPS driver controller 2.7.4
Network UPS Tools - Generic HID driver 0.41 (2.7.4)
USB communication driver 0.33
Using subdriver: APC HID 0.96

I servizi

Andiamo a configurare i servizi, upsd e upsmon. Come mai questa proliferazione di programmi?

upsd (aka Network Server) comunica con il driver UPS che abbiamo appena avviato, mentre upsmon (aka Monitor) comunica con upsd e lancia il comando di chiusura in base allo stato dell'UPS. Il motivo di questa divisione è che possiamo avere una macchina che comunica fisicamente con l'UPS, e più macchine alimentate dall'UPS che vogliono essere informate dello stato dell'UPS. Secondo lo stile *nix, ogni programma dovrebbe fare una sola cosa (e farla bene 😉)  

Sarà necessario indicare questa configurazione nel file nut.conf, che altrimenti non sa quali moduli serviranno, e quali file di configurazione devono essere consultati, con la parola chiave MODE.

Se questa è l'unica macchina interessata all'UPS, indicheremo MODE=standalone

Se è semplicemente una macchina che è interessata allo stato dell'UPS, indicheremo MODE=netclient. Se invece, come nel nostro caso, questa è la macchina collegata all'UPS e che racconta alle altre come sta andando, indicheremo

MODE=netserver

upsd

Possiamo avviare il daemon upsd senza modificare i file di configurazione, e vedere come va:

$ sudo systemctl start nut-server
$ sudo systemctl status nut-server

Se tutto va bene, dovrebbe dirci che il servizio è partito, parla con il driver dell'UPS e si è messo in ascolto sulla porta di default per rispondere alle domande degli interessati.

upsd[1816]: listening on 127.0.0.1 port 3493
upsd[1816]: Connected to UPS [backups]: usbhid-...
upsd[1816]: listening on ::1 port 3493
upsd[1816]: Connected to UPS [backups]: usbhid-...
upsd[1817]: Startup successful

Una informazione simile ve la può fornire la utility che analizza il traffico e le porte aperte sul sistema, una volta netstat, oggi ss 

$ sudo ss -tlp | grep ups

Questo comando dovrebbe elencarvi una serie di porte aperte in ascolto da upsd.

Se il servizio è partito correttamente, possiamo andare vedere che informazioni si scambiano UPS, driver e server, con il comando upsc:

$ upsc backups@localhost

che dovrebbe restituirci una carrellata di dati del tipo:

battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.runtime: 528
battery.voltage: 27.2
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: Back-UPS .....
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.version: 2.7.4
driver.version.data: APC HID 0.96 ...

We have the power!

upsmon

Ora tocca al servizio di monitoraggio, upsmon. Se lo facciamo partire con la configurazione di default il servizio non partirà e ci segnalerà un errore perché nel file di default non sono indicati UPS da monitorare.

Andiamo ad elencare il nostro UPS nel file upsmon.conf, o meglio ad aggiungere il comando di monitoraggio:

$ sudo nano upsmon.conf

inserendo una nuova riga, come quelle negli esempi:

MONITOR backups@localhost 1 upslocaluser pwd master

In questo modo abbiamo detto al servizio di interrogare upsd per avere informazioni sull'UPS che abbiamo configurato localmente, e che avevamo chiamato backups, presentandoci come l'utente upslocaluser, password pwd, scelti da voi, secondo il vostro buon gusto.

Con 1 (uno) indichiamo che deve esserci come minimo 1 UPS (il nostro). Con master indichiamo che siamo quelli che ci spegneremo per ultimi, una volta avvisati gli altri. Infatti se ci spegnessimo prima, le altre macchine potrebbero perdere la possibilità di interrogare l'UPS, e non sapere che tra poco verranno stroncate.

In questo file si impostano parecchi altri parametri, ad esempio per la frequenza di interrogazione, i tempi di attesa prima di avviare la chiusura, e per la sicurezza della comunicazione. Sarà necessario configurarli un po' sperimentalmente, in base al carico sull'UPS, alla velocità di chiusura e al numero di altre macchine che dovranno comunicare.

upsd + upsmon

Ora però dobbiamo tornare a upsd, che purtroppo non sa nulla dell'utente che vuole interrogarlo.

Andiamo a modificare il file upsd.users, aggiungendo il nostro utente locale, ricordando anche qui che è l'utente di upsmon che si chiude per ultimo (master):

$ sudo nano upsd.users 
[upslocaluser]
        password = pwd
        upsmon master

A questo punto possiamo riavviare il server e avviare il monitor:

$ sudo systemctl restart nut-server
$ sudo systemctl start nut-monitor

Facendo una verifica del nostro progresso:  

$ sudo systemctl status nut-monitor

Se anche qui leggete "Startup successful" vuol dire che o avete fatto un buon lavoro, o semplicemente avete la fortuna del principiante!

Per assicurarci che i servizi ripartano ad ogni avvio, usiamo il comando "enable".

$ sudo systemctl enable nut-monitor.service

$ sudo systemctl enable nut-server.service

Client esterni

E per condividere queste informazioni con altre macchine alimentate dall'UPS?

Lo vedremo in un altro post, a seguire!

Aggiornamento:

Ecco il post promesso: 

https://striscialascia.blogspot.com/2021/01/monitorare-un-ups-sulla-rete-locale.html



 
 
 

Nessun commento:

Posta un commento