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.
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.
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
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
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: