воскресенье, 2 ноября 2014 г.

NUT и Eaton Powerware 5110

Эта заметка будет необычно длинной и нудной :) Дело в том, что поначалу система NUT показалась мне сложной, поэтому я начал читать man'ы, файлы конфигурации и выписывать понятое. Как оказалось, всё очень просто, но не пропадать же добру? Вот и решил выложить всё, что накопилось.

NUT - это сетевая клиент-серверная система для наблюдения за источниками бесперебойного питания. Сервер NUT устанавливается непосредственно на тот компьютер, к которому подключен информационный кабель ИБП. Клиенты устанавливаются на те компьютеры, которые запитаны от ИБП или на компьютеры, с которых нужно наблюдать за состоянием ИБП.

1. Серверная часть

Установим на компьютер с ИБП серверную часть NUT:
# apt-get install nut-server
Настройки сервера NUT находятся в трёх файлах:
  • /etc/nut/ups.conf - настройки драйверов ИБП,
  • /etc/nut/upsd.conf - настройки сервера,
  • /etc/nut/upsd.users - настройки аутентификации и прав пользователей сервера.
1.1. Драйверы ИБП

В файле /etc/nut/ups.conf описываются ИБП, подключенные к этому компьютеру. Файл представляет собой INI-файл, в котором секцией является имя ИБП, а внутри секции прописываются настройки драйвера ИБП. Для начала опишу глобальные настройки:
  • chroot - не обязательный параметр, указывающий chroot-каталог, в котором будет запускаться драйвер ИБП,
  • driverpath - не обязательный параметр, указывающий путь к исполняемым файлам драйверов ИБП,
  • maxstartdelay - не обязательный параметр, значение которого можно указать локально, в секции с описанием ИБП. Указывает время, в течение которого ожидается завершение запуска драйвера ИБП. По умолчанию - 45 секунд,
  • pollinterval - не обязательный параметр, указывающий интервалы времени, через которые необходимо запрашивать у ИБП свежие данные о его состоянии.
Локальные настройки, описывающие конкретный ИБП:
  • dirver - обязательный параметр, указывающий, какую программу использовать для взаимодействия с ИБП. Найти подходящий драйвер можно в файле /usr/share/nut/driver.list,
  • port - обязательный параметр, указывающий используемый для связи с ИБП последовательный или USB-порт. Возможными значениями могут быть файлы устройств вроде /dev/ttyS0 или значение auto,
  • sdorder - если к системе подключено несколько ИБП, то этот параметр указывает очерёдность отключения этого ИБП. Чтобы не отключать ИБП, здесь можно указать -1. Значение по умолчанию - 0,
  • desc - не обязательный параметр, описывающий ИБП. Может содержать произвольный текст,
  • nolock - не обязательный флаг, указывающий не блокировать порт связи с ИБП. В этом случае другие программы смогут работать с портом, но указывать этот флаг не рекомендуется,
  • ignorelb - не обязательный флаг, предписывающий игнорировать состояние ИБП разряда батареи. Вместо этого используются данные о текущем заряде батареи и его предельно низком значении (battery.charge < battery.charge.low) или о расчётном времени работы батареи и минимально допустимом времени работы от батареи (battery.runtime < battery.runtime.low). Это позволяет вручную задать предельные значения, по достижении которых батарея ИБП будет считаться разряженной (например, override.battery.charge.low = 30 - осталось 30% заряда батареи или override.battery.runtime.low = 180 - осталось 3 минуты работы от батареи),
  • default.переменная - не обязательный параметр, который задаёт значение по умолчанию для тех переменных, данные о которых ИБП не отдаёт,
  • override.переменная - не обязательный параметр, значение которого заменяет значение, отдаваемое ИБП.
Драйвер может иметь собственные, специфичные только для него настройки и команды, о которых можно прочитать на странице руководства man выбранного драйвера. Например, у драйвера bcmxcp_usb, конфигурация которого будет приведена ниже, имеются следующие настройки и команды:
  • shutdown_delay - пауза в секундах, которую ИБП выдержит между получением команды на отключение и её выполнением. По умолчанию - 120 секунд,
  • shutdown.return - команда отключить нагрузку и снова подать питание,
  • shutdown.stayoff - команда отключить нагрузку и не включать,
  • test.battery.start - команда начать проверку батареи.
В файл /etc/nut/ups.conf пропишем настройки драйвера ИБП:
[Powerware5110]
driver = bcmxcp_usb
port = auto
desc = "UPS on computer fstu"
1.2. Сервер NUT

Теперь настроим сервер, предоставляющий информацию о состоянии ИБП клиентам:
  • MAXAGE - максимальное время, в течение которого полученные от ИБП данные считаются актуальными. По умолчанию - 15 секунд,
  • STATEPATH - каталог, в котором размещаются сокет-файлы драйверов ИБП. По умолчанию /var/run/nut,
  • MAXCONN - максимальное количество разрешённых подключений к серверу, включая драйверы, директивы LISTEN и подключенных клиентов. По умолчанию - 1024,
  • CERTFILE - если вы хотите шифровать сетевые подключения, укажите здесь путь к PEM-файлу с сертификатом и ключом сервера. По умолчанию шифрование не используется,
  • LISTEN - директива, указывающая IP-адрес и TCP-порт, на которых сервер будет ожидать запросы клиентов. Может быть указана несколько раз. Может быть указан IPv6-адрес.
Поскольку в нашем случае единственный клиент располагается на компьютере с сервером, пропишем в файл /etc/nut/upsd.conf одну директиву:
LISTEN 127.0.0.1 3493
В файле /etc/nut/upsd.users описываются пользователи, которые будут работать с сервером. Файл имеет формат INI-файла, в котором именем секции является имя пользователя, а параметры внутри секции описывают права пользователя.
  • password - параметр задаёт пароль пользователя,
  • actions - параметр описывает разрешённые пользователю действия. Может быть указан несколько раз. Всего доступно два действия: SET - возможность устанавливать значения переменных ИБП, FSD - возможность инициировать ситуацию отсутствия питания на ИБП и низкого заряда батареи, которая может инициировать завершение работы компьютеров, запитанных от ИБП,
  • instcmds - параметр, разрешающий отдавать ИБП определённые команды. Может быть указан несколько раз. Чтобы разрешить все команды, можно указать значение ALL. Чтобы узнать список доступных команд, можно воспользоваться командой "upscmd -l". Полный список всех команд и переменных, поддерживаемых системой NUT, можно посмотреть в файле /usr/share/nut/cmdvartab,
  • upsmon master - флаг описывает пользователя, от имени которого будет подключаться клиент мониторинга, работающий на том же компьютере, что и сервер (и куда подключен интерфейс взаимодействия с ИБП),
  • upsmon slave - флаг описывает пользователя, от имени которого будет подключаться клиент мониторинга, работающий на компьютере отличном от того, где запущен сервер.
Теперь настроим доступ к серверу в файле /etc/nut/upsd.users. Добавим пользователя-администратора и пользователя, от имени которого будет подключаться клиент мониторинга, запущенный на том же компьютере, что и сервер:
[admin]
password = password
actions = SET
instcmds = ALL

[upsmon]
password = password
upsmon master
Если предполагается, что к серверу будут подключаться клиенты мониторинга, работающие на других компьютерах, можно добавить ещё одного пользователя с настройкой upsmon slave.

Осталось перезапустить сервер, чтобы его настройки вступили в силу:
# /etc/init.d/nut-server restart
2. Клиентская часть

На компьютеры, запитанные от ИБП нужно поставить пакет с консольными клиентами NUT:
# apt-get install nut-client
Внутри пакета есть три консольных клиента, умеющих взаимодействовать с сервером NUT:
  • upsc - клиент, при помощи которого можно запросить текущие значения переменных на ИБП,
  • upscmd - клиент, при помощи которого можно установить значения переменных ИБП или выполнять команды,
  • upsmon - клиент, следящий за состоянием одного или нескольких ИБП, который отсылает уведомления или выполняет команду отключения компьютера. Его конфигурация находится в файле /etc/nut/upsmon.conf.
В составе клиента имеется также утилита upssched с файлом конфигурации /etc/nut/upssched.conf, которая помогает осуществлять отложенное исполнение команд. В файле конфигурации можно настроить таймер, который будет запущен при наступлении одних событий (например, когда в ИБП не поступает внешнее питание, а его батарея разрядилась) или сброшен при наступлении других событий (например, когда на ИБП вновь начало поступать внешнее питание). Когда таймер срабатывает, выполняется указанная команда.

В файле /etc/nut/nut.conf имеется единственный параметр MODE, задающий режим работы клиента upsmon. Имеется четыре режима работы системы NUT:
  • none - система выключена,
  • standalone - автономная система, в которой интерфейс управления ИБП подключен к тому же компьютеру, который запитан от ИБП. Других компьютеров, запитанных от ИБП нет,
  • netserver - система, в которой от ИБП запитано несколько компьютеров. В этом случае сервер NUT должен быть доступен по сети для остальных компьютеров,
  • netclient - система, запитанная от ИБП, интерфейс управления которым подключен к другому компьютеру.
В нашем случае подходит значение standalone, которое и пропишем в файл /etc/nut/nut.conf:
MODE=standalone
2.1. Клиент для просмотра состояния ИБП

Текущее состояние ИБП можно посмотреть при помощи следующей команды:
$ upsc Powerware5110@localhost
Текущее значение любого из параметров можно посмотреть при помощи команды с указанием имени параметра. Например, текущий статус можно посмотреть при помощи такой команды:
$ upsc Powerware5110@localhost ups.status
Возможные значения статуса:
  • OL - ИБП работает от сети,
  • OB - ИБП работает от батареи,
  • LB - батарея разряжена,
  • RB - необходима замена батареи,
  • CHRG - батарея заряжается,
  • DISCHRG - батарея разряжается,
  • BYPASS - ИБП работает в режиме питания от сети в обход батареи,
  • OVER - ИБП перегружен,
  • TRIM - ИБП отрезает повышенное напряжение сети,
  • BOOST - ИБП усиливает пониженное напряжение сети,
2.2. Клиент для записи переменных ИБП

Для выполнения команд на ИБП необходимо предоставить имя пользователя и его пароль. Например, вот так можно заставить ИБП отключить потребителей, а при появлении питания на входе снова включить их:
$ upscmd -u admin -p password Powerware5110@localhost shutdown.return
Если команда принимает дополнительные параметры (например, время в секундах), то их значения можно указать после команды ИБП, в качестве дополнительного аргумента.

2.3. Клиент мониторинга ИБП

Настроим клиента мониторинга, который наблюдает за состоянием ИБП и при необходимости выключает компьютер. Для этого впишем в файл /etc/nut/upsmon.conf следующую конфигурацию:
# Описание ИБП, за которым нужно наблюдать
MONITOR Powerware5110@localhost 1 upsmon password master

# Команда, которую нужно выполнить перед пропаданием питания от ИБП
SHUTDOWNCMD "/sbin/shutdown -h +0"
В настройке MONITOR цифра 1 означает количество блоков питания компьютера, запитанных от этого ИБП. Большинство компьютеров имеет только один блок питания. Можно указать значение 0, если компьютер не запитан от ИБП, но необходимо следить за состоянием ИБП.

Кроме указанных настроек доступны также следующие:
# Пользователь, от имени которого будет работать клиент мониторинга
# RUN_AS_USER nutmon

# Минимальное количество запитанных блоков питания компьютера, необходимых для его работы
# Например, если компьютер обладает 4 блоками питания, но для работы достаточно 2, то
# здесь нужно вписать 2. Количество блоков питания, запитанных от определённого ИБП
# указывается в настройке MONITOR
MINSUPPLIES 1

# Обычная частота опроса состояния ИБП
POLLFREQ 5

# Частота опроса состояния ИБП, если он работает от батареи
POLLFREQALERT 5

# Интервал, в течение которого команда на отключение должна быть подтверждена
# Указывается на случай, если в течение этого времени вновь появится питание
# и отключение будет отменено
HOSTSYNC 15

# Если в течение этого интервала данные от ИБП не обновлялись, ИБП помечается
# как недоступный и заряд его батареи будет считаться низким, что может
# спровоцировать отключение компьютеров, запитанных от него
DEADTIME 15
Перезапустим клиента мониторинга:
# /etc/init.d/nut-client restart
Протестировать выключение системы в случае пропадания питания и разряда батареи, можно при помощи команды:
# upsmon -c fsd
2.4. Графический клиент

Графический клиент находится в пакете nut-monitor. Установим его:
# apt-get install nut-monitor
Чтобы подключиться к ИБП, нужно указать IP-адрес или имя сервера, порт и, если нужно, имя пользователя и пароль:


После подключения можно посмотреть краткую сводку по текущему состоянию ИБП:


На отдельной вкладке можно посмотреть значение всех переменных ИБП:


Можно добавлять ИБП в закладки и переключаться между ними:


Клиента можно свернуть в трей, он примет вид батарейки:

2.5. Веб-клиент

Веб-клиент находится в пакете nut-cgi. Установим сам клиент, а также nginx и uwsgi для запуска CGI-приложений:
# apt-get install nut-cgi nginx uwsgi
Настройки веб-клиента располагаются в файлах /etc/nut/upsset.conf и /etc/nut/hosts.conf.

В первом файле нет никаких настроек. Его единственное назначение - отключить веб-интерфейс до тех пор, пока вы не ограничите в веб-сервере список узлов, с которых будет доступен этот веб-интерфейс. Когда доступ ограничен, можно раскомментировать единственную опцию из этого файла:
I_HAVE_SECURED_MY_CGI_DIRECTORY
Во втором файле находится список ИБП, состояние которых можно будет просматривать через этот веб-интерфейс. Директивы имеют следующий вид:
MONITOR myups@localhost "Local UPS"
В нашем случае в этом файле будет лишь одна директива:
MONITOR Powerware5110@localhost "Powerware5110 on my computer"
Для запуска веб-клиента NUT будем использовать uwsgi и nginx. Настроим пул процессов, обслуживающих CGI-приложение NUT в файле /etc/uwsgi/apps-available/cgi.ini:
[uwsgi]

procname = uwsgi-cgi
procname-master = uwsgi-cgi-master

plugins = cgi
cgi = /usr/lib/
cgi-allowed-ext = .cgi
cgi-timeout = 300
processes = 2
Включим использование этого приложения:
# cd /etc/uwsgi/apps-enabled/
# ln -s /etc/uwsgi/apps-available .
Запустим включенное приложение uwsgi:
# /etc/init.d/uwsgi start cgi
Теперь настроим обработку доступа к CGI-страницам в файле /etc/nginx/sites-available/default:
server {
  listen 127.0.0.1:80; 
  server_name localhost;

  root /usr/share/nut/www;
  index index.html;

  location ~ ^/cgi-bin/nut/(upsimage|upsset|upsstats)\.cgi$ {
    allow 127.0.0.1;
    deny all;
    
    include uwsgi_params;
    uwsgi_modifier1 9;
    uwsgi_pass unix:/var/run/uwsgi/app/cgi/socket;
    uwsgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/nut/$1.cgi;
  }
}
Включим использование этого сайта:
# cd /etc/nginx/sites-enabled/
# ln -s /etc/nginx/sites-available .
Запустим включенное приложение uwsgi:
# /etc/init.d/nginx reload
Директивы allow и deny в файле конфигурации nginx ограничивают доступ к веб-клиенту NUT только IP-адресом самого компьютера. Если в директиве listen указан IP-адрес 127.0.0.1, то директивы deny и allow указывать не обязательно, т.к. к веб-серверу просто неоткуда больше подключиться, кроме как с самого компьютера. Если же веб-сервер прослушивает какие-то внешние IP-адреса, то в директивах allow нужно перечислить те IP-адреса или подсети, с которых необходим доступ к веб-интерфейсу.

На странице http://localhost/cgi-bin/nut/upsstats.cgi можно увидеть таблицу с ИБП с кратким описанием текущего состояния каждого из них. В моём случае ИБП всего один:


Если в таблице ИБП перейти по ссылке в левом столбце, то можно попасть на такую вот страницу с диаграммами текущего состояния ИБП:


Если в таблице ИБП перейти по ссылке в правом столбце, то можно попасть на страницу с текущими значениями переменных ИБП: