Giuseppe Parrello

 

Come installare un server NUT su un router


In questa pagina descriverò come installare un server NUT su un router (Asus RT-AC56U) per gestire un Gruppo di Continuità - useremo alcuni pacchetti Entware, pertanto fare riferimento a questa pagina su come installare Entware su un router.
Useremo il server (daemon) "Network UPS Tools (NUT)", uno dei più usati server degli ambienti Linux per la gestione di un Gruppo di Continuità. Per installare questo server, abbiamo bisogno di installare diversi pacchetti Entware,  tramite la seguente istruzione:

opkg install nut-common nut-server nut-upsc nut-upscmd nut-upslog nut-upsmon nut-upsrw nut-upssched nut-web-cgi

Installing nut-common (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-common_2.7.4-19a_armv7-2.6.ipk
Installing nut (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut_2.7.4-19a_armv7-2.6.ipk
Installing libnl-core (3.5.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libnl-core_3.5.0-1_armv7-2.6.ipk
Installing libnl-genl (3.5.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libnl-genl_3.5.0-1_armv7-2.6.ipk
Installing libnl-route (3.5.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libnl-route_3.5.0-1_armv7-2.6.ipk
Installing libnl-nf (3.5.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libnl-nf_3.5.0-1_armv7-2.6.ipk
Installing libnl (3.5.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libnl_3.5.0-1_armv7-2.6.ipk
Installing libpci (3.6.2-4) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libpci_3.6.2-4_armv7-2.6.ipk
Installing libnetsnmp (5.8-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libnetsnmp_5.8-1_armv7-2.6.ipk
Installing libusb-compat (0.1.5-2) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libusb-compat_0.1.5-2_armv7-2.6.ipk
Installing nut-server (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-server_2.7.4-19a_armv7-2.6.ipk
Installing nut-upsc (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-upsc_2.7.4-19a_armv7-2.6.ipk
Installing nut-upscmd (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-upscmd_2.7.4-19a_armv7-2.6.ipk
Installing nut-upslog (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-upslog_2.7.4-19a_armv7-2.6.ipk
Installing nut-upsmon (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-upsmon_2.7.4-19a_armv7-2.6.ipk
Installing nut-upsrw (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-upsrw_2.7.4-19a_armv7-2.6.ipk
Installing nut-upssched (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-upssched_2.7.4-19a_armv7-2.6.ipk
Installing nut-web-cgi (2.7.4-19a) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/nut-web-cgi_2.7.4-19a_armv7-2.6.ipk
Installing libwebp (1.0.3-2) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libwebp_1.0.3-2_armv7-2.6.ipk
Installing libfreetype (2.10.1-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libfreetype_2.10.1-1_armv7-2.6.ipk
Installing libgd (2.2.5-6) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libgd_2.2.5-6_armv7-2.6.ipk
Installing libtiff (4.1.0-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/libtiff_4.1.0-1_armv7-2.6.ipk
Configuring libnl-core.
Configuring libnl-route.
Configuring libnl-nf.
Configuring libpci.
Configuring nut.
Configuring libnl-genl.
Configuring libnl.
Configuring libnetsnmp.
Configuring libusb-compat.
Configuring nut-common.
Configuring libwebp.
Configuring libfreetype.
Configuring libgd.
Configuring libtiff.
Configuring nut-web-cgi.
Configuring nut-upslog.
Configuring nut-upsmon.
Configuring nut-upsrw.
Configuring nut-upssched.
Configuring nut-upscmd.
Configuring nut-upsc.
Configuring nut-server.

In seguito dobbiamo installare il driver vero e proprio, ovvero la parte software che gestirà il nostro Gruppo di Continuità. Per scegliere il driver giusto per il nostro Gruppo di Continuità, dobbiamo andare nella seguente pagina, e a seconda del produttore (colonna "Manufacturer") e del modello (colonna "Model"), recuperiamo il nome del driver che dovremo usare. Ad esempio se il nostro Gruppo di Continuità, è prodotto da APC, andiamo nel riquadro denominato "Filters" e selezioniamo nel campo "Manufacturer" il produttore "APC", la lista in basso verrà ridotta al solo produttore APC. Da lì potremo scegliere il modello in nostro possesso. La maggior parte dei modelli di APC con interfaccia USB è di tipo usbhid (USB Human Interface Device), come anche tanti altri Gruppi di Continuità. Il driver da scegliere quindi è "usbhid-ups". Torniamo al terminale del router, e cerchiamo il driver, o con l'istruzione "opkg list | grep -i nut-driver" o direttamente con l'istruzione "opkg list | grep -i usbhid-ups". In entrambi i casi notiamo che il driver da scaricare è "nut-driver-usbhid-ups", quindi usiamo l'istruzione "opkg install nut-driver-usbhid-ups" per installare il pacchetto Entware contenente il driver.


Come gestire il driver del Gruppo di Continuità

Prima di gestire il driver del Gruppo di Continuità, dobbiamo configurare il file "/opt/etc/nut/ups.conf", con questo file di configurazione impostiamo le specifiche del gruppo di continuità. Maggiori informazioni sul suddetto file di configurazione si possono trovare al seguente indirizzo Internet.
Un esempio di file "/opt/etc/nut/ups.conf" è il seguente:

[ups1]
    driver = usbhid-ups
    port   = auto
    pollinterval = 10

Nel suddetto file, impostiamo nel campo "driver" il nome del driver "usbhid-ups" che abbiamo scelto prima per il nostro Gruppo di Continuità. Nel campo "port" metteremo il valore "auto", mentre il campo "pollinterval" indica il valore in secondi di intervallo per il rinfresco dei dati del Gruppo di Continuità. Il gruppo "ups1" verrà da noi utilizzato in seguito, con questo nome indichiamo il primo Gruppo di Continuità da noi gestito.
Se invece vogliamo gestire due o più Gruppi di Continuità, possiamo creare un'altra sezione nel suddetto file "/opt/etc/nut/ups.conf", come segue:

[ups1]
    driver = usbhid-ups
    port   = auto
    pollinterval = 10
    
[ups2]
    driver = usbhid-ups
    port   = auto
    pollinterval = 10

Tenete presente che quando si ha a che fare con due o più Gruppi di Continuità, ancora più se tali Gruppi sono della stessa marca e dello stesso modello, conviene specificare nel file "/opt/etc/nut/ups.conf" il campo "serial" (contenente il numero seriale del prodotto) e il campo "desc" (che fornisce una descrizione del prodotto), in questa maniera sarà possibile accedere a tutti i Gruppi di Continuità specificati nel suddetto file. Pertanto il suddetto file potrebbe diventare il seguente:

[ups1]
    driver = usbhid-ups
    port   = auto
    pollinterval = 10
    desc = "APC UPS 1"
    serial = "ABCDEFGHIJ"

[ups2]
    driver = usbhid-ups
    port = auto
    pollinterval = 10
    desc = "APC UPS 2"
    serial = "KLMNOPQRST"

Il numero seriale del Gruppo di Continuità si può recuperare usando uno dei seguenti metodi:

Una volta configurato il file "/opt/etc/nut/ups.conf", possiamo usare il comando "upsdrvctl start" per avviare il/i driver dei Gruppi di Continuità impostati sul suddetto file di configurazione. Se ci sono problemi di avvio dei driver, è possibile eseguire il comando "upsdrvctl -D start" per avere le informazioni aggiuntive di debug. Maggiori informazioni sul suddetto comando si possono trovare al seguente indirizzo Internet.
Quanto segue è un esempio di output del comando "upsdrvctl start" con due Gruppi di Continuità impostati nel suddetto file di configurazione:

Network UPS Tools - UPS driver controller merge-with-ng-626-gdbf3d603
Network UPS Tools - Generic HID driver 0.41 (merge-with-ng-626-gdbf3d603)
USB communication driver 0.33
Using subdriver: APC HID 0.96
Network UPS Tools - Generic HID driver 0.41 (merge-with-ng-626-gdbf3d603)
USB communication driver 0.33
Using subdriver: APC HID 0.96

Dopo il suddetto comando, dobbiamo eseguire il comando "upsd" per avviare il daemon del server NUT. Se ci sono problemi nell'avvio di tale comando, si può eseguire il comando "upsd -D" per avere le informazioni agguntive di debug. Quest'ultimo comando non è in modalità "daemon", pertanto dopo avere eseguito il comando, bisogna premere la combinazione di tasti "CTRL+C" per uscire dalla modalità di esecuzione. Maggiori informazioni sul suddetto comando si possono trovare al seguente indirizzo Internet.
Quanto segue è un esempio di output del comando "upsd -D" con due Gruppi di Continuità impostati nel suddetto file di configurazione:

Network UPS Tools upsd merge-with-ng-626-gdbf3d603
fopen /opt/var/run/upsd.pid: No such file or directory
listening on 127.0.0.1 port 3493
listening on ::1 port 3493
Connected to UPS [ups2]: usbhid-ups-ups2
Connected to UPS [ups1]: usbhid-ups-ups1

Se entrambi i comandi "upsdrvctl" e "upsd" hanno avuto successo, ora possiamo iniziare a controllare i Gruppi di Continuità con il comando "upsc" che permette di visualizzare i dati di ogni gruppo inserito, tra parentesi quadre, nel suddetto file di configurazione - è possibile avere la lista dei gruppi disponibili usando il comando "upsc -l". Maggiori informazioni sul suddetto comando si possono trovare al seguente indirizzo Internet.
Questo è un esempio di output del comando "upsc ups1":

battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.date: 2001/09/25
battery.mfr.date: 2016/10/05
battery.runtime: 1496
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 27.3
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: Back-UPS XS 1400U
device.serial: ABCDEFGHIJ
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 10
driver.parameter.port: auto
driver.parameter.serial: ABCDEFGHIJ
driver.parameter.synchronous: no
driver.version: merge-with-ng-626-gdbf3d603
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
input.sensitivity: medium
input.transfer.high: 280
input.transfer.low: 155
input.voltage: 216.0
input.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 926.T2 .I
ups.firmware.aux: T2
ups.load: 24
ups.mfr: American Power Conversion
ups.mfr.date: 2016/10/05
ups.model: Back-UPS XS 1400U
ups.productid: 0002
ups.realpower.nominal: 700
ups.serial: ABCDEFGHIJ
ups.status: OL
ups.test.result: No test initiated
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d

Inoltre possiamo ottenere una lista dei comandi Hardware eseguibili su ogni Gruppo di Continuità con il comando "upscmd", ad esempio per ottenere i comandi del primo Gruppo di Continuità possiamo usare il comando "upscmd -l ups1". Maggiori informazioni sul suddetto comando si possono trovare al seguente indirizzo Internet.
Segue un esempio di output del suddetto comando - dall'output si evince che esistono comandi per disattivare/attivare il cicalino e per eseguire vari test di funzionamento del Gruppo di Continuità:

Instant commands supported on UPS [ups1]:

beeper.disable - Disable the UPS beeper
beeper.enable - Enable the UPS beeper
beeper.mute - Temporarily mute the UPS beeper
beeper.off - Obsolete (use beeper.disable or beeper.mute)
beeper.on - Obsolete (use beeper.enable)
load.off - Turn off the load immediately
load.off.delay - Turn off the load with a delay (seconds)
shutdown.reboot - Shut down the load briefly while rebooting the UPS
shutdown.stop - Stop a shutdown in progress
test.battery.start.deep - Start a deep battery test
test.battery.start.quick - Start a quick battery test
test.battery.stop - Stop the battery test
test.panel.start - Start testing the UPS panel
test.panel.stop - Stop a UPS panel test

Infine possiamo ottenere una lista delle variabili Hardware impostabili su ogni Gruppo di Continuità con il comando "upsrw", ad esempio per ottenere un elenco delle variabili del primo Gruppo di Continuità possiamo usare il comando "upsrw ups1". Maggiori informazioni sul suddetto comando si possono trovare al seguente indirizzo Internet.
Segue un esempio di output del suddetto comando:

[battery.charge.low]
Remaining battery level when UPS switches to LB (percent)
Type: STRING
Maximum length: 10
Value: 10

[battery.runtime.low]
Remaining battery runtime when UPS switches to LB (seconds)
Type: STRING
Maximum length: 10
Value: 120

[input.sensitivity]
Input power sensitivity
Type: STRING
Maximum length: 10
Value: medium

[input.transfer.high]
High voltage transfer point (V)
Type: STRING
Maximum length: 10
Value: 280

[input.transfer.low]
Low voltage transfer point (V)
Type: STRING
Maximum length: 10
Value: 155

[ups.delay.shutdown]
Interval to wait after shutdown with delay command (seconds)
Type: STRING
Maximum length: 10
Value: 20

Per eseguire alcuni comandi Hardware con il comando "upscmd" e per impostare alcune variabili Hardware con il comando "upsrw" potrebbe essere necessario impostare un utente con privilegi di "root" all'interno del file di configurazione "/opt/etc/nut/upsd.users" - un esempio del suddetto file è il seguente:

[admin]
        password = [adminpassword]
        actions = set
        actions = fsd
        instcmds = all

[monuser]
    password = [password]
    upsmon master

Nel suddetto esempio definiamo un utente chiamato "admin" che dovremo passare tramite i comandi "upscmd" e "upsrw". Assieme all'utente impostiamo anche la password nel campo "password", mentre con le due righe "actions" definiamo la possibilità di modificare le variabili del Gruppo di Continuità (tramite il comando "upsrw") e di attivare la modalità "forced shutdown", mentre con la riga "instcmds" lasciamo che l'utente possa avviare qualunque comando Hardware sul Gruppo di Continuità. Il secondo utente "monuser" verrà usato in seguito con il monitoraggio del Gruppo di Continuità. Maggiori informazioni sul suddetto file di configurazione si possono trovare al seguente indirizzo Internet.

 

Come gestire il monitoraggio del Gruppo di Continuità

Prima di gestire il monitoraggio del Gruppo di Continuità, dobbiamo configurare il file "/opt/etc/nut/upsmon.conf", con questo file di configurazione impostiamo i parametri essenziali per il monitoraggio del gruppo di continuità. Maggiori informazioni sul suddetto file di configurazione si possono trovare al seguente indirizzo Internet.
Un esempio di file "/opt/etc/nut/upsmon.conf" è il seguente:

SHUTDOWNCMD "/opt/etc/shutdown.sh"
NOTIFYCMD "/opt/etc/upsmon.sh"
NOTIFYFLAG ONLINE     SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT     SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT    SYSLOG+WALL+EXEC
NOTIFYFLAG FSD        SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK     SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD    SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN   SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM     SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT   SYSLOG+WALL+EXEC
MONITOR ups1@localhost 1 monuser [password] master
MONITOR ups2@localhost 1 monuser [password] master

Ora passiamo a definire lo script "/opt/etc/upsmon.sh", segue un esempio del suddetto script - non ci dimentichiamo di impostare i permessi di esecuzione dello script con il comando "chmod +x /opt/etc/upsmon.sh":

#!/bin/sh

now=$(date)
OPTVARLOG="/opt/var/log/nutlog.log"

# Keep only the last 5000 lines of log file
sed -i -e :a -e '$q;N;5001,$D;ba' $OPTVARLOG

echo $OPTVARLOG
touch $OPTVARLOG

echo "$now - $UPSNAME-$NOTIFYTYPE ($*)" >> $OPTVARLOG

Il suddetto script scriverà il contenuto di alcune variabili d'ambiente (che vedremo in seguito) passate dal daemon "UPSMON" su un file di LOG "/opt/var/log/nutlog.log", un esempio di output di questo file di LOG è il seguente:

Fri Mar 13 17:06:21 CET 2020 - ups2@localhost-COMMBAD (Communications with UPS ups2@localhost lost)
Fri Mar 13 17:06:21 CET 2020 - ups1@localhost-COMMBAD (Communications with UPS ups1@localhost lost)
Fri Mar 13 17:07:31 CET 2020 - ups1@localhost-COMMOK (Communications with UPS ups1@localhost established)
Fri Mar 13 17:07:36 CET 2020 - ups2@localhost-COMMOK (Communications with UPS ups2@localhost established)

Il suddetto script usa le seguenti variabili d'ambiente:

Una volta che abbiamo le suddette variabili d'ambiente, possiamo ad esempio notificare l'evento all'utente usando un servizio di messaggistica; ad esempio possiamo inviare una email usando il comando "msmtp" - vedere questa pagina per maggior informazioni su come inviare una email tramite il router. Pertanto possiamo aggiungere le seguenti righe di esempio al suddetto script:

msmtp -v -t << EOF
From: [myemail]@hotmail.com
Subject: Router - UPS event
To: to_address@domain.xxx

UPS Name : $UPSNAME
Notify Type : $NOTIFYTYPE
Notify Message : $*

EOF

 

Come creare un log del Gruppo di Continuità

Per creare un log del Gruppo di Continuità, dobbiamo usare il daemon "upslog". Maggiori informazioni sul suddetto comando si possono trovare al seguente indirizzo Internet.
Ad esempio possiamo eseguire il seguente comando all'interno del terminale del router - con il seguente comando si esegue il daemon "upslog" che crea un file di log "/opt/var/log/ups1.log" per il gruppo di continuità "ups1", ogni riga verrà aggiunta ogni 60 secondi:

upslog -s ups1 -l /opt/var/log/ups1.log -i 60

Network UPS Tools upslog merge-with-ng-626-gdbf3d603
logging status of ups1 to /opt/var/log/ups1.log (60s intervals)

Un output di esempio del file di log "/opt/var/log/ups1.log", creato con il suddetto comando, è il seguente:

20200313 171823 100 212.0 36 [OL] NA NA
20200313 171923 100 212.0 36 [OL] NA NA
20200313 172023 100 212.0 37 [OL] NA NA
20200313 172123 100 212.0 37 [OL] NA NA

 

Come gestire un Gruppo di Continuità tramite il Web

Per gestire un Gruppo di Continuità tramite il web, dobbiamo usare prima di tutto un server Web, per comodità e semplicità useremo come esempio un mini server Web, vedere questa pagina per maggior informazioni su come installare un mini server web su un router.
Una volta installato il suddetto mini server web, avremo nella cartella "/opt/share/www" due sottocartelle denominate "cgi-bin" e "nut".

Poiché nella suddetta pagina abbiamo configurato il server web con l'utente "nobody", ricordiamoci di aggiornare l'utente di tutti i file appena copiati con il comando "chown" - vedere la suddetta pagina web per maggiori informazioni su come usare il comando "chown".
Una volta copiate le due suddette sottocartelle, dobbiamo configurare il file di configurazione "/opt/etc/nut/hosts.conf". Maggiori informazioni sul suddetto file di configurazione si possono trovare al seguente indirizzo Internet.
Al suddetto file di configurazione possiamo aggiungere le seguenti due righe - consideriamo di avere configurato due Gruppi di Continuità:

MONITOR ups1@localhost "Local ups1"
MONITOR ups2@localhost "Local ups2"

Ora possiamo accedere alla pagina web usando l'indirizzo web "http://[indirizzo router]:[porta]/nut". All'interno di questa pagina web abbiamo due collegamenti: