Network UPS Tools (NUT) на CentOS і Windows з відправкою смс через smstools+playsms

В умовах обмеженого бюджету невеликої компанії, скромний термінальний сервер 2003 отримував безперебійне електрику від Ippon Smart Winner 1500, який управлявся стандартною утилітою. Не можу чогось дуже поганого сказати про цей ДБЖ і його монструозну утиліту управління з анімацією струму. Гуде цілком на свої гроші.

З часом, windows довелося обтяжити парою віртуальних машин Vmware, а парк поповнився парою невеликих линуксовых серверів з АТС, Jabber та іншими офісними радощами. Відповідно, виникло бажання керувати живленням від Ippon, бо заявлена підтримка *nix.

Однак, хоча виробник «по дорослому» передбачив безліч розширених можливостей управління, включаючи клієнти під *nix і mac, смс повідомлення та email оповіщення і т. д., спроби практичного застосування всього цього болючі, а результат непередбачуваний.

Як всі дороги ведуть в Рим, так і проблеми з Ippon ведуть до NUT. В мережі маса інформації про цієї чудової утиліти, у т. ч. і на Хабре є приклади налаштування
Під *nix працювати з NUT одне задоволення. Просто, зрозуміло, логічно.

В сервер c CentOS, безпосередньо з'єднаний з ДБЖ за USB, я встромив GSM-модем Teleofis-RX104 і подружил його з smstools3 і playsms, щоб вийшов імпровізований sms-шлюз з підтримкою webservices api. В результаті вийшов зручний універсальний інструмент для різного роду повідомлень, в т. ч. і офісної роботи

Далі, встановив готовий NUT з EPEL-репозиторію, прописавши в конфігах:

/etc/nut/nut.conf
MODE=netserver

/etc/nut/ups.conf
[winner1500]
driver = blazer_usb
port = /dev/usb/hiddev0
bus = "003"
port = "002"
vendorid = 06da
productid = 0003
desc = "Ippon Smart Winner 1500"
default.battery.voltage.high = 55
default.battery.voltage.low = 47
default.battery.voltage.nominal = 48

Інформація про порти і vendor/product з виведення lsusb, вольтаж підібраний експериментально, щоб усім вистачило часу на коректне вимкнення, т. к. алгоритм завершення роботи включається при залишковому напрузі батареї нижче, ніж default.battery.voltage.low

У NUT є і мінлива battery.charge, в яку записується можливий математичний залишок батареї %. Він наочний, але для управління не дуже зручний

/etc/nut/upsd.users
[admin]
password = pass
actions = SET
instcmds = ALL

[upsmon_local]
password = pass
upsmon master

[upsmon_remote]
password = pass
upsmon slave

Користувачі, які можуть підключатися і дивитися/управляти/управлятися ДБЖ. admin — для управління ДБЖ, upsmon_local — для моніторингу стану ДБЖ на локальному сервері, upsmon_remote — керованих клієнтів. Паролі за смаком

/etc/nut/upsmon.conf
RUN_AS_USER nut
MONITOR winner1500@127.0.0.1 1 upsmon_local pass master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown-h +0"
NOTIFYCMD /usr/local/ups/notifyme
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 45
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG FSD SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG NOCOMM SYSLOG+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Це самий цікавий конфіг, в якому описується поведінка NUT при різних станах ДБЖ. MONITOR вказує, що ми підключаємося до локальної службі NUT і будемо майстром, тобто, в разі чого — будемо вимикати ведених, а самі помремо останніми. Рядок NOTIFYCMD вказує яка команда буде виконуватися для повідомлення. У мене — це виклик /usr/local/ups/notifyme наступного змісту:

#! /bin/bash
smssend 7903******* "servername:$*"

В команду передаються ті аргументи NOTIFYFLAG, де є прапор EXEC. Всі передані аргументи містяться в рядку після «servername:» (щоб було зрозуміло хто пише) і відправляються на 7903*******. Тобто, при відключенні струму прийде смс «servername: UPS winner1500 on battery» Текст повідомлень можна змінювати.

Другий Centos-сервер налаштовується ще простіше. Фактично, нам потрібен тільки монітор стану майстер-сервера і очікування звісток від нього. Але раз вже у нас є playsms, то можна і від нього отримувати смс, наприклад, про те чи є зв'язок з майстром (не померла на ньому служба NUT)

/etc/nut/nut.conf
MODE=netсlient

/etc/nut/upsmon.conf
RUN_AS_USER nut
MONITOR winner1500@10.10.0.4 1 upsmon_remote pass slave
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown-h +0"
NOTIFYCMD /usr/local/ups/notifyme
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 45
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYFLAG ONLINE SYSLOG
NOTIFYFLAG ONBATT SYSLOG
NOTIFYFLAG LOWBATT SYSLOG
NOTIFYFLAG FSD SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC
NOTIFYFLAG REPLBATT SYSLOG
NOTIFYFLAG NOCOMM SYSLOG+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

Тобто, ставимо EXEC там, де нас цікавлять проблеми зі зв'язком і пройшла команда відключення живлення від майстра.
Для відправки смс, я задіяв playsms, якому curl передає текст у вигляді GET-url. Для цього спочатку потрібно в налаштуваннях користувача playsms включити webservices і згенерувати webservices token. Після цього, в /usr/local/ups/notifyme другого сервера вказуємо:

#! /bin/bash
msg="$(echo "$*" | tr ' ' '+')"
curl-v "http://10.10.0.4/smsd/index.php?app=webservices&h=f3fd0e7c758b5d529dea17c256f94b23&u=admin&ta=pv&to=7903*******&msg=servername:$msg"

Тобто, все те ж саме, що і в першому варіанті, тільки замінити прогалини на + і відправити через GET-запит.

У windows все трохи обросло милицями. На сервер був встановлений пакет NUT-Installer-2.6.5-3.msi Який по дефолту встановився в C:\Program Files\NUT і чудово запустився службою без особливих проблем. І curl для відправки повідомлень через playsms.

Налаштування NUT аналогічна другого сервера-слэйву, тобто MODE-netclient, основне в upsmon.conf і милицях.

C:\Program Files\NUT\etc\upsmon.conf
MONITOR winner1500@10.10.0.4 1 upsmon_remote pass slave
MINSUPPLIES 1
SHUTDOWNCMD "C:/Common/curl/powerdown.cmd"
NOTIFYCMD "C:/Common/curl/notify.cmd"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 45
DEADTIME 15
POWERDOWNFLAG "C:/killpower"
# NOTIFYFLAG ONLINE SYSLOG+WALL
NOTIFYFLAG ONBATT SYSLOG+WALL
# NOTIFYFLAG LOWBATT SYSLOG+WALL
NOTIFYFLAG FSD SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG
NOTIFYFLAG COMMBAD SYSLOG
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC+WALL
# NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM SYSLOG+EXEC
# NOTIFYFLAG NOPARENT SYSLOG+WALL
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5


Тут файл повідомлення notify.cmd наступного змісту (значення якого не змінюється):
@echo off
SET "url=http://10.10.0.4/smsd/index.php?app=webservices&h=f3fd0e7c758b5d529dea17c256f94b23&u=admin&ta=pv&to=7903*******&msg="
SET "msg=%*"
SET "msg=%msg: =+%"
C:\Common\curl\curl.exe "%url%servername:+%msg%"

Ось власне і вся розповідь. Якщо потрібно щось уточнити-доповнити буду радий

До речі:

msg=%* в notify.cmd робить батник щодо універсальним для різних завдань. Тобто, додавши в автозавантаження «notify.cmd started» отримаємо повідомлення «servername:started» на смс.

Я не забув це використовувати для моніторингу жорсткої перезавантаження з BSOD 0x9, яку мені влаштовував symantec. Прибирати не став. Моніторинг hard reset корисний:

eventtriggers /create /eid 6008 /l system /tr "hard reset" /tk "C:\Common\curl\notify.cmd 6008 hard reset occured"

Замість powerdown.cmd можна прямо вказати команду, наприклад C:/WINDOWS/system32/shutdown.exe -s-t 0-c «Forced by NUT master».

Шлях до батнику з'явився тому, що мені було бажано перед вимиканням сервера коректно вимкнути віртуальну машину з допомогою vmrun з комплекту VMware VIX.

Так як машина була запущена у вигляді служби утилітою AlwaysUp, то команду коректного зупинки машини «C:\Program Files\VMware\VMware VIX\vmrun.exe» stop S:\vmachine.vmx я прописав в AlwaysUp, а в батнике вже лише контролював службу і писав лог, щоб якщо що — таймаут додати. Вийшло:

@echo off
set "service=autocatalog (managed by AlwaysUpService)"
set "log=C:\Common\curl\fsd.log"
echo FSD command received %DATE% %TIME% >> %log%
sc query "%service%" | find "RUNNING" >nul 2>&1 && set running=true
if not "%running%"=="true" goto stopnow
echo VM machine is runnung. Let's stop it >> %log%
sc stop "%service%"
if ERRORLEVEL 1 goto stopnow
sleep 35
sc query "%service%" | find "STOPPED" >nul 2>&1 && echo VM soft machine off in 35 sec >> %log%
:stopnow
echo system shutdown ініціював >> %log%
echo------------------------- >> %log%
C:\WINDOWS\system32\shutdown.exe -s-t 0-c "Forced by NUT master"

Тобто, коли батарейка цокає — негоже чекати виключення виртуалки довше визначеного ліміту, якщо вона повисла або взагалі не працює

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.