Monitorování UPS pomocí nástroje NUT

Network UPS Tools (NUT) je sada programů, které slouží k monitorování UPS (Uninterruptible Power Supply) a zajišťují korektní vypnutí všech počítačů připojených k dané UPSce v případě dlouhodobého výpadku napájení, kdy UPS již nebude mít dostatečnou energii k napájení počítačů k ní připojených.

Díky NUTu nám stačí mít k UPSce připojen přes sériový (případně USB) kabel pouze jediný počítač (master server) a zbylé počítače (slave) komunikují s tímto serverem přes TCP/IP, tedy přes klasický ethernetový (síťový) kabel.

Program NUT se skládá ze tří částí, první je démon upsd, který pomocí obslužného programu (ovladače) pro daný typ UPSky (například apcsmart pro APC Smart UPSky) komunikuje přes sériový (nebo USB) port s danou UPSkou.

Druhou částí programu NUT je klientská/monitorovací část realizovaná programem upsmon, který na klientské stanici běží také jako démon. Tento program komunikuje po síti s démonem upsd a zároveň se postará o případné korektní vypnutí systému tím, že zavolá příkaz /sbin/shutdown -h +0.

Třetí částí jsou CGI skripty sloužící pro monitoring UPS, případně pro nastavení některých parametrů UPS přes webové rozhraní nebo pro spuštění testů UPS.

Instalace

Protože jsem v žádném z repozitářů CentOSu nenašel balíčky pro NUT, tak jsem si je musel přeložit sám. Zdrojové kódy stabilní verze NUTu lze nalézt na adrese www.networkupstools.org/source/2.0/. Ve zdrojových kódech jsou v adresáři packaging/RedHat/ umístěny SPEC soubory nut.spec a nut.spec.in. Je lepší využít druhý jmenovaný, protože je novější a opravuje pár nepřesností. Návod jak vyrobit RPM balíček z tohoto SPEC souboru zde popisovat již nebudu, protože toto je již popsáno v článku o buildování RPM balíčků. Po úspěšném přeložení budete mít k dispozici balíčky nut-server-2.0.5-1.i386.rpm, nut-2.0.5-1.i386.rpm a nut-cgi-2.0.5-1.i386.rpm. Instalace balíčků na serveru (serverový balíček závisí na balíčku klienta, proto je zapotřebí pro splnění závislostí nainstalovat oba) se provede následovným způsobem:

rpm -Uvh nut-server-2.0.5-1.i386.rpm nut-2.0.5-1.i386.rpm 

Konfigurace serveru

Konfigurační soubory nalezneme v adresáři /etc/ups. Nejprve si však zprovozníme komunikaci mezi počítačem a UPS. V souboru /etc/sysconfig/ups nastavíme parametr SERVER=yes, tím říkame, že náš počítač bude jako server a bude tedy spouštět démona upsd. Dále musíme nastavit parametr MODEL, tedy ovladač pro daný typ UPS. Seznam těchto ovladačů pro dané typy UPS naleznete v souboru /usr/share/ups/driver.list. V mém případě to bude MODEL=apcsmart, protože budu komunikovat s UPSkou od firmy APC, typ Smart-UPS 2200. Nakonec ještě musíme specifikovat port (parametr DEVICE) na kterém je UPSka k počítači připojená, tedy například /dev/ttyS0 pro sériový port 1.

Výsledný konfigurační soubor /etc/sysconfig/ups bude vypadat následovně:

SERVER=yes
MODEL=apcsmart
DEVICE=/dev/ttyS0
OPTIONS=
UPSD_OPTIONS=

Nastavíme ještě konfigurační soubor /etc/ups/ups.conf, kterým se konfiguruje obslužný program komunikující se samotným démonem upsd. Obsah souboru bude v mém případě následující:

[smartups]
       driver = apcsmart
       port = /dev/ttyS0
       sdtype = 0
       desc = "APC Smart-UPS 2200"

Jméno UPSky (parametr [smartups]) může být libovolné. Další parametry (např. sdtype = 0) lze nalézt pro daný ovladač UPSky buď v manuálové stránce (man apcsmart) nebo výpisem nápovědy pro daný příkaz (apcsmart -h).

V tuto chvíli již můžeme vyzkoušet, zda nám komunikace s UPSkou funguje a to následujícím příkazem:

apcsmart -u root -DD -a smartups

Na terminál se vypíše více informací o tom co UPSka podporuje za příkazy a výpis skončí následujícími řádky:

...
APC - UPS capabilities determined
Detected SMART-UPS 2200 [GS9946005257] on /dev/ttyS0
dstate_init: sock /var/run/nut/apcsmart-ttyS0 open on fd 5

Tímto máme potvrzeno, že komunikace s UPSkou přes sériový kabel funguje, můžeme program ukončit pomocí kombinace CTRL-c a přistoupit k další části konfigurace, tedy k nastavení démona upsd.

Konfigurační soubor démona upsd je rozdělen na dva soubory, první se nazývá /etc/ups/upsd.conf a jsou v něm nadefinovány počítače, které smějí s tímto démonem komunikovat přes TCP/IP. Druhý soubor se jmenuje /etc/ups/upsd.users a jsou v něm uloženi uživatelé a hesla pro ověření identity.

Nejprve si nastavíme přístupy klientských počítačů k našemu NUT serveru. Nastavení je velice jednoduché a myslím si, že soubor /etc/ups/upsd.conf nepotřebuje žádný větší komentář:

ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACL backup 10.0.0.50/32
ACL www 10.0.0.51/32

ACCEPT localhost
ACCEPT backup www
REJECT all

Tímto jsem povolil přístup k NUT serveru pouze z IP adres 127.0.0.1, 10.0.0.50 a 10.0.0.51. Pozor, maska za IP adresou je povinná!

Ještě si nadefinujeme jména uživatelů a hesla a povolíme jim přístup k NUT serveru. Toto nalezneme v souboru /etc/ups/upsd.users:

[ups]
       password = monu6ivatel
       allowfrom = localhost backup www
       upsmon master

[admin]
       password = administr8torups
       allowfrom = localhost
       actions = SET
       instcmds = ALL

Nadefinoval jsem uživatele ups a admin. Uživatel ups smí pouze monitorovat stav UPS a to z IP adres 127.0.0.1, 10.0.0.50 a 10.0.0.51 a uživatel admin smí přenastavit parametry UPSky, případně spustit nějaké testy na UPSce, avšak pouze z IP adresy 127.0.0.1.

Protože mám zapnutý firewall, tak musím na serveru ještě povolit přístup z IP adres 10.0.0.50 a 10.0.0.51 a to na port na němž naslouchá upsd, tedy na 3493. Do souboru s firewallem (/etc/sysconfig/iptables) přidám na patřičná místa následující řadky:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 10.0.0.50 --dport 3493 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 10.0.0.51 --dport 3493 -j ACCEPT

Tímto máme konfiguraci na straně serveru hotovou a můžeme přejít ke konfiguraci klientů.

Konfigurace klientů

Na klientských stanicích stačí nainstalovat pouze balíček nut-2.0.5-1.i386.rpm. V mém případě jsem nastavil klientský program i na NUT serveru. Klientský program má konfigurační soubor v /etc/ups/upsmon.conf. Tento soubor v mém případě vypadá následovně:

MONITOR smartups@localhost 1 ups monu6ivatel master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 20
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 60
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Parametr MONITOR definuje na jakou UPS (smartups@localhost), pod jakým uživatelem (ups) a s jakým heslem (monu6ivatel) se bude klientský program připojovat na upsd. Typ master znamená, že se jedná o hlavní monitorovací program, který běží na počítači, jenž prostřednictvím sériového (USB) kabelu komunikuje s UPSkou. Počítač s typem master se bude vypínat až jako poslední. Parametr SHUTDOWNCMD nastavuje cestu k příkazu, kterým se bude počítač vypínat. Parametr POWERDOWNFLAG vytvoří při vypínaní po výpadku napájení soubor /etc/killpower a v souboru /etc/init.d/halt je testována existence tohoto souboru. V případě, že existuje, tak je těsně před vypnutím počítače poslán signál pro vypnutí UPS. Tím docílíme toho, že po opětovné obnově napájení dojde k zapnutí UPS a tím i k zapnutí počítače (toto samozřejmě musí být ošetřené i v BIOSu počítače tak, aby došlo k automatickému zapnutí počítače po obnově napájení). Kdyby se nepoužíval tento pomocný soubor (/etc/killpower), tak by automaticky při vypnutí počítače došlo i k vypnutí UPS (pokud by toto chování bylo nastavené), což není úplně ideální. Parametr POWERDOWNFLAG se nastavuje pouze na hlavním (master) monitorovacím počítači.

Popis dalších parametrů v tomto souboru lze nalézt v manuálové stránce (man upsmon) nebo přímo v komentářích v daném konfiguračním souboru.

Někdy je také dobré nastavit si logování některých událostí, což lze provést přidáním níže uvedených direktiv do souboru /etc/ups/upsmon.conf:

NOTIFYFLAG ONLINE SYSLOG+WALL
NOTIFYFLAG ONBATT SYSLOG+WALL
NOTIFYFLAG LOWBATT SYSLOG+WALL

Informace o tom, zda UPS pracuje ze sítě nebo z baterie, případně informace, že baterie je již vybitá se budou zapisovat do logu a zároveň posílat na terminál všem přihlášeným uživatelům. Lze nastavit například i posílání e-mailů.

Tímto je konfigurace klientské části dokončena a můžeme provést otestování.

Nastartujeme démon NUT a monitorovací program NUTu:

/etc/init.d/upsd start
/etc/init.d/upsmon start

Pomocí programu upsc můžeme získat informace o UPS:

upsc smartups@localhost
battery.alarm.threshold: 0
battery.charge: 100.0
battery.charge.restart: 00
battery.date: 11/10/99
battery.packs: 000
battery.runtime: 10320
battery.runtime.low: 420
battery.voltage: 55.05
battery.voltage.nominal: 048
driver.name: apcsmart
driver.version: 2.0.5
driver.version.internal: 1.99.7
input.frequency: 50.00
input.quality: FF
input.sensitivity: H
input.transfer.high: 253
input.transfer.low: 196
input.transfer.reason: R
input.voltage: 244.4
input.voltage.maximum: 245.7
input.voltage.minimum: 243.1
output.voltage: 244.4
output.voltage.target.battery: 230
ups.delay.shutdown: 180
ups.delay.start: 000
ups.firmware: 80.11.I
ups.id: TACHEC    
ups.load: 006.7
ups.mfr: APC
ups.mfr.date: 11/10/99
ups.model: SMART-UPS 2200
ups.serial: GS9946005257
ups.status: OL
ups.temperature: 036.9
ups.test.interval: 1209600
ups.test.result: NO

Pro zjištění příkazů, které UPSka podporuje můžeme použít následující příkaz:

upscmd -l smartups@localhost
Instant commands supported on UPS [apc@localhost]:

test.panel.start - Start testing the UPS panel
test.panel.stop - Stop a UPS panel test
load.off - Turn off the load immediately
shutdown.return - Turn off the load and return when power is back
shutdown.stop - Stop a shutdown in progress
beeper.on - Enable the UPS beeper
beeper.off - Disable the UPS beeper

Příkazy lze UPSce zadávat pomocí programu uspcmd, bude vyžadován uživatel, který smí zadávat příkazy a jeho heslo. V mém případě by to byl uživatel admin a heslo administr8torups.

upscmd -u admin smartups@localhost beeper.off

Konfigurace CGI skriptů

Pokud nán funguje NUT server a pomocí NUT klienta jsme schopni získat informace z UPS a chceme mít informace o UPS v čitelnější podobě, tak si můžeme nainstalovat balíček nut-cgi-2.0.5-1.i386.rpm.

rpm -Uvh nut-cgi-2.0.5-1.i386.rpm

CGI skripty nalezneme klasicky v adresáři /var/www/cgi-bin/. Než na dané skripty přistoupíme webovým prohlížečem, tak je zapotřebí udělat ještě menší úpravy v některých konfiguračních souborech. V souboru /etc/ups/hosts.conf je zapotřebí nadefinovat název UPS a adresu:

MONITOR smartups@localhost "Local UPS"

V případě, že budeme chtít využívat webové rozhraní i k zadávaní parametrů dané UPS, tak je dobré si projít soubor /etc/ups/upsset.conf a dle pokynů v něm napsaných omezit přístup k CGI skriptu upsset.cgi a poté v tomto souboru odkomentovat direktivu I_HAVE_SECURED_MY_CGI_DIRECTORY.

Skripty jsou dostupné přes webový prohlížeč na adresách:

http://127.0.0.1/cgi-bin/upsstats.cgi
http://127.0.0.1/cgi-bin/upsset.cgi

Ukázka výstupu CGI skriptů:

NUT upsstats NUT upsstats - battery NUT upsset
NUT upsset NUT upsset - commands
Naposledy změněno: 17.3.2007 9:21