среда, 15 апреля 2015 г.

Настройка NUT для IPPON 400 UPS с USB интерфейсом в Ubuntu 14.04

NUT мне не нравится. Но производитель поставляет с бесперебойником программу winpower, которая:
  • Написано на java. У меня нет столько памяти =)
  • Утилита мониторинга не запускается из-за ошибки, и с этим походу ничего не поделаешь.
  • Инсталятор все ломает, что не внушает доверия. Он добавляет монтирование usbfs в fstab, но usbfs объявлено устаревшим довольно давно и ядра в убунту идут без него. И надо закомментировать это заранее, иначе машина не загрузится до ssh и придется топать к ней и подключать монитор и клаву.
...посему нам остается NUT. Это серверная штука посему настраивается довольно муторно =)

NUT состоит из нескольких частей:
  • драйвер - читающий данные из usb.
  • сервер - посылающий данные и сообщения клиентам по запросу. У сервера свой список пользователей с логинами/паролями.
  • клиент - периодически читает информацию/события с сервера и производит действия с машиной на которой запущен. Для некоторых действий нужен логин и пароль.
  • и scheduler - вспомогательный скрипт, который поможет нам с таймером
Так как у нас один домашний сервер с бесперебойником все это ПО будет запущено на одной машине. В конце мы хотим получить:
  • выключенную пищалку, которая не разбудит нас посреди ночи.
  • выключение сервера через 90 или меньше сек работы от батареи. Изкоробки оно выключается, когда у батареи низкий заряд. Я так думаю, что батарея испортиться через некоторое время и ее заряда не будет хватать для корректного выключения сервера. Тогда мы просто уменьшим таймер.
  • бесперебойник продолжает работать посте выключения сервера, чтобы питать ADSL модем с WIFI сколько возможно. Преимущество медной лапши - наличие сигнала в телефонной линии, даже если электричество в доме закончилось.
Если кому то надо больше - курите документацию. У почти всех конфигов есть комментарии, поэтому настройки сильно пояснять не буду. В начале указано какой файл редактируем и что с ним сделать потом, например изменить права, а потом что в файл надо записать.
Почти все действия производим с правами root, посему первая команда:
$ sudo -s

# apt-get install nut

Настройка драйвера:

Выберите нужный драйвер для ups тут
# nano /etc/nut/ups.conf

[ippon]
driver = blazer_usb
port = auto
desc = "IPPON 400 UPS, USB interface"
Без этого шага драйвер выдает ошибки. Для запуска клиента и сервера на одной машине
# nano /etc/nut/nut.conf

MODE=standalone
Перезапускаем сервис
# service nut-server restart
или перезагрузимся, затем
# upsdrvctl start
и получим что-то типа:
Network UPS Tools - UPS driver controller 2.7.1
Network UPS Tools - Megatec/Q1 protocol USB driver 0.10 (2.7.1)
Supported UPS detected with megatec protocol
Vendor information unavailable
No values provided for battery high/low voltages in ups.conf

Using 'guestimation' (low: 10.400000, high: 13.000000)!
Battery runtime will not be calculated (runtimecal not set)

Настройка сервера:

Сервер должен слушать только локальный интерфейс, сетевой доступ нам без надобности
# nano /etc/nut/upsd.conf

LISTEN 127.0.0.1 3493
Добавляем основного пользователя с правами изменять настройки.
# nano /etc/nut/upsd.users

[upsmon]
password = secret
actions = SET FSD
instcmds = ALL
upsmon master

Настройка клиента:

# nano /etc/nut/upsmon.conf

MONITOR ippon@localhost 1 upsmon secret master
#эти настройки есть в конфиге по умолчанию
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

# Настраиваем таймер и сообщения в консоль и по почте
# Я плохо знаю NUT, посему это может быть слегка избыточно
NOTIFYCMD /sbin/upssched
NOTIFYMSG ONLINE     "UPS %s on line power"
NOTIFYMSG ONBATT     "UPS %s on battery"
NOTIFYMSG LOWBATT    "UPS %s battery is low"
NOTIFYMSG FSD        "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK     "Communications with UPS %s established"
NOTIFYMSG COMMBAD    "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN   "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT   "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM     "UPS %s is unavailable"
NOTIFYMSG NOPARENT   "upsmon parent process died - shutdown impossible"

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
Для запуска клиента и сервера на одной машине
# nano /etc/nut/nut.conf

MODE=standalone
Перезапускаем сервисы
# service nut-server restart
# service nut-client restart
Получаем ups статус
$ upsc ippon@localhost
Видим:
Init SSL without certificate database
battery.charge: 100
battery.voltage: 13.60
battery.voltage.high: 13.00
battery.voltage.low: 10.40
battery.voltage.nominal: 12.0
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.7.1
driver.version.internal: 0.10
input.current.nominal: 1.0
input.frequency: 50.3
input.frequency.nominal: 50
input.voltage: 232.0
input.voltage.fault: 232.0
input.voltage.nominal: 220
output.voltage: 232.0
ups.beeper.status: disabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 30
ups.productid: 5161
ups.status: OL
ups.temperature: 25.0
ups.type: offline / line interactive
ups.vendorid: 0665

Отключение звука

Пищалки в упсах громкие и противные. Получаем список доступных команд:
# upscmd -l ippon@localhost
IPPON дешевый упс посему команд немного:
beeper.toggle - Toggle the UPS beeper
load.off - Turn off the load immediately
load.on - Turn on the load immediately
shutdown.return - Turn off the load and return when power is back
shutdown.stayoff - Turn off the load and remain off
shutdown.stop - Stop a shutdown in progress
test.battery.start - Start a battery test
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
Создадим скрипт для отключения звука
# nano /etc/nut/beeper.off.sh
# chmod 750 /etc/nut/beeper.off.sh
# chown root:nut /etc/nut/beeper.off.sh

#!/bin/sh

upsc ippon@localhost ups.beeper.status 2>&1 | grep enabled && upscmd -u upsmon -p secret ippon@localhost beeper.toggle
Добавим запуск скрипта в запуск клиента. Это не совсем верно и можно придумать случай, когда это не сработает, но для меня это "достаточно хорошо" тм =) Добавляем sleep и beeper.off.sh в скрипт
# nano /etc/init.d/nut-client
...
start)
    log_daemon_msg "Starting $DESC" "$NAME"
    check_var_directory
    start_stop_client start

    sleep 1
    /etc/nut/beeper.off.sh

    log_end_msg $?
    ;;)
...

Настройка таймера и уведомлений на почту

Для уведомлений вам надо установить и настроить nullmailer или аналог. Если их нет закомментируйте отправку почты
# nano /etc/nut/upssched.conf

CMDSCRIPT /etc/nut/cmd.sh
PIPEFN /tmp/upspipe
LOCKFN /tmp/upslock
AT ONBATT * EXECUTE powerout
AT ONBATT * START-TIMER shutdownnow 90
AT ONLINE * CANCEL-TIMER shutdownnow
AT ONLINE * EXECUTE powerup
Когда таймер закончит отсчет запустится CMDSCRIPT. EXECUTE тоже выполняет CMDSCRIPT.

# nano /etc/nut/cmd.sh
# chown root:nut /etc/nut/cmd.sh
# chmod 750 /etc/nut/cmd.sh

#!/bin/sh
case $1 in
    powerout)
      logger "UPS on battery. Shutdown in 90 seconds...."
      echo -e "Subject: UPS monitor. On battery.\nThe UPS has been on battery for awhile" \
        | sendmail lex2d.by@gmail.com
      ;;
    powerup)
      logger "UPS on line. Shutdown aborted."
      echo -e "Subject: UPS monitor. On line.\nUPS on line. Shutdown aborted." \
        | sendmail lex2d.by@gmail.com
      ;;
    shutdownnow)
      logger "UPS has been on battery for 90 seconds. Starting orderly shutdown"
      /usr/bin/sudo /sbin/shutdown -h +0
      ;;
    shutdowncritical)
      logger "UPS battery level CRITICAL. Shutting down NOW!!!!"
      /usr/bin/sudo /sbin/shutdown -h +0
      ;;
    *)
      logger "Unrecognized command: $1"
      ;;
esac
Добавим пользователя nut в sudo. Иначе клиенту не хватит прав завершить работу сервера.
# visudo

# Добавить в конец файла
nut ALL = (root) NOPASSWD: /sbin/shutdown
Возможно теперь вы тоже не любите NUT...

4 комментария:

  1. Замечательно. Теперь как это все удалить? Не смотря на остановку сервиса и удаление командой sudo apt-get purge nut* в консоль продолжает сыпаться сообщения о недоступности UPS Ippon. Бесперебойник отжил свое, а демона не могу выгнать...

    ОтветитьУдалить
  2. Полагаю upsmon остался запущен.

    ОтветитьУдалить
  3. У меня ups apc back-ups 950, при запуске upsdrvctl start выдает using subdriver APC HID 0.95, что это значит?

    ОтветитьУдалить