20 gennaio 2021

Monitorare un UPS sulla rete locale usando NUT

 In un post precedente abbiamo visto come monitorare un UPS collegato via USB ad un server Ubuntu

Se abbiamo un UPS con sufficiente potenza e uscite, possiamo alimentare altri dispositivi sulla rete locale, e sarebbe carino aggiornare anche loro sullo stato dell'UPS. In questo modo anche gli altri dispositivi possono chiudersi educatamente, invece di spegnersi senza sapere cosa è successo.

Configurazione locale (Ubuntu)

Prima di tutto dobbiamo modificare la configurazione locale, in modo da aggiungere un utente non locale (in modalità slave), e la disponibilità ad ascoltare sulla scheda/IP collegata alla rete locale qualunque indirizzo IP associato alla macchina (0.0.0.0). Ho corretto queste istruzioni perché ho scoperto che specificare gli indirizzi locali crea dei problemi all'avvio. Non solo, basta che non riesca ad avere la disponibilità di uno solo degli indirizzi IP, che NUT blocca l'avvio del servizio, e vi trovate scollegati dall'UPS senza sapere bene perché. (vedi bug riportato qui: https://github.com/networkupstools/nut/issues/723)

I file di configurazione si trovano in /etc/nut

$ sudo nano upsd.conf
LISTEN 127.0.0.1
LISTEN <my.IP.on.local.network> 
LISTEN 0.0.0.0 3493
$ sudo nano upsd.users 
[upsmonremote]
        password = remotepwd
        upsmon slave

 Vediamo alcuni casi specifici di collegamenti sulla rete locale.


Windows Server 2012R2 con NUT beta Windows binary

Ho scaricato Windows MSI installer 2.6.5-6 da https://networkupstools.org/download.html
 
Di default il programma si installa in C:\Program Files (x86)\NUT e configura un servizio locale.
 
Dal pannello dei servizi, avviare il servizio "Network UPS Tools".

Aprire Event Viewer e verificare i messaggi del servizio, nella sezione "Windows Logs\Application".

Da me si è arrestato con errore, vedi: https://github.com/networkupstools/nut/issues/262 
Come da istruzioni nel link, ho scaricato una versione 32bit di OpenSSL da: https://indy.fulgan.com/SSL/
e copiato libeay32.dll e ssleay32.dll nella directory .\sbin.
 
Riavviare e verificare ancora su Event Viewer.
 
I file di configurazione sono nella sottocartella .\etc
 
nut.conf:
MODE=netclient
 
upsmon.conf:
MONITOR backups@<my.IP.on.local.network> 1 upsmonremote remotepwd slave
SHUTDOWNCMD "C:\\WINDOWS\\system32\\shutdown.exe -s -t 0"
 
Riavviare e verificare.

Synology NAS

Il sistema DSM che gestisce i NAS della Synology è una variante di Linux, che sotto il cofano ha anche il modulo NUT. Per semplificarsi la vita e poter condividere un UPS tra diversi Synology, hanno predisposto un collegamento remoto al master NUT con i seguenti parametri.

UPS device name

ups

slave user name

monuser

slave password

secret

Sapendo questo, possiamo configurare il nostro master NUT con gli stessi parametri, modificando opportunamente i file upsd.conf e upsd.users. A questo punto sarà sufficiente fornire al DSM Synology l'indirizzo IP del master NUT e verificare che i due comunicano. 

Net-SNMP

Fonte: https://raymondjdouglas.com/blog/2018/ups-monitoring
$ sudo yum install net-snmp




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