Linux ups nut snmp: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 27 промежуточных версий этого же участника)
Строка 2: Строка 2:
 
[[Категория:UPS]]
 
[[Категория:UPS]]
 
[[Категория:NUT]]
 
[[Категория:NUT]]
  +
[[Категория:Zabbix]]
 
   
 
=NUT + SNMP=
 
=NUT + SNMP=
Хочется тушить стойку после того как пропало питание, через 2 минуты, при этом безперпебойник доступен по сети (SNMP)
+
Хочется тушить стойку после того как пропало питание, через определенное время (в процессе настройки я его несколько раз уменьшал), при этом безперпебойник доступен по сети (SNMP)
 
<BR>
 
<BR>
  +
Классический сценарий подразумевает что УПС сообщит о том что батарея "уже почти все" (LB) и тогда только сушить весла.
Возможно настроить на каждом сервере отдельный экзкмпляр NUT или опрашивать по сети один
 
  +
<BR>
  +
Возможно настроить на каждом сервере отдельный экзкмпляр NUT или опрашивать по сети один NUT работающий в режиме сервера - я выбрал сценарий с клиент-сервером
  +
<BR>
  +
  +
При этом виртуальные машины, запущенные на хосте выключаются через [[ACPI|обработку виртуальной кнопки ACPI]]
   
  +
=<code>NUT</code> серверная часть=
=NUT=
 
  +
==Driver (<code>nut-driver.service</code>) <code>ups.conf</code>==
==Driver==
 
Предельно простая настройка - нужно знать только адрес и community
+
Предельно простая настройка - нужно знать только адрес и community в файле <code>ups.conf</code>
 
<PRE>
 
<PRE>
 
[UPS6000XL]
 
[UPS6000XL]
Строка 22: Строка 27:
 
</PRE>
 
</PRE>
 
* <code>community = public</code> заменить на актуальное значение
 
* <code>community = public</code> заменить на актуальное значение
  +
  +
==Сервер (<code>nut-server.service</code>)<code>nut.conf</code> <code>upsd.conf</code> <code>upsd.users</code>==
  +
  +
===<code>nut.conf</code>===
  +
Тут настраивается режим сервера, в этом случае
  +
<PRE>
  +
MODE=netserver
  +
</PRE>
  +
  +
===<code>upsd.conf</code>===
  +
Так как предпологается что запрос будут приходить с других серверов, то нужно разрешить слушать на всех интерфейсах
  +
<PRE>
  +
LISTEN 0.0.0.0 3493
  +
</PRE>
  +
  +
===<code>upsd.users</code>===
  +
<PRE>
  +
[admin]
  +
password = admin
  +
actions = SET
  +
instcmds = ALL
  +
</PRE>
  +
  +
==Проверка работы==
  +
Локально проверить можно так
  +
<PRE>
  +
upsc UPS6000XL@localhost
  +
</PRE>
  +
<PRE>
  +
Init SSL without certificate database
  +
ambient.1.humidity.alarm.high: 60.00
  +
ambient.1.humidity.alarm.low: 30.00
  +
ambient.1.temperature.alarm.high: 40.00
  +
ambient.1.temperature.alarm.low: 10.00
  +
battery.charge: 49.00
  +
battery.charge.restart: 0
  +
battery.date: 02/07/15
  +
battery.packs: 1.00
  +
battery.runtime: 360.00
  +
battery.runtime.low: 120
  +
battery.voltage: 218.10
  +
device.mfr: APC
  +
device.model: Smart-UPS RT 6000 RM XL
  +
device.serial: Q123
  +
device.type: ups
  +
driver.name: snmp-ups
  +
driver.parameter.pollfreq: 15
  +
driver.parameter.pollinterval: 2
  +
driver.parameter.port: 10.72.0.8
  +
driver.parameter.snmp_version: v1
  +
driver.parameter.synchronous: no
  +
driver.version: 2.7.4
  +
driver.version.data: apcc MIB 1.2
  +
driver.version.internal: 0.97
  +
input.frequency: 50.00
  +
input.sensitivity: UNKNOWN
  +
input.transfer.high: 253
  +
input.transfer.low: 161
  +
input.transfer.reason: rateOfVoltageChange
  +
input.voltage: 213.10
  +
input.voltage.maximum: 216.00
  +
input.voltage.minimum: 210.20
  +
output.current: 5.20
  +
output.frequency: 50.00
  +
output.voltage: 231.60
  +
output.voltage.nominal: 230
  +
ups.delay.shutdown: 20
  +
ups.delay.start: 0
  +
ups.firmware: 452.19.W
  +
ups.id: UPS_IDEN
  +
ups.load: 23.00
  +
ups.mfr: APC
  +
ups.mfr.date: 07/07/14
  +
ups.model: Smart-UPS RT 6000 RM XL
  +
ups.serial: QS1428270733
  +
ups.status: OL
  +
ups.temperature: 18.40
  +
ups.test.date: 04/13/2024
  +
ups.test.result: Ok
  +
</PRE>
  +
На этом серверная часть +/- настроена, и можно переходить к настройке клиентской
  +
  +
=<code>NUT</code>Сетевые клиенты=
  +
<PRE>
  +
apt install nut-client
  +
</PRE>
  +
==<code>/etc/nut/nut.conf</code>==
  +
Одна строчка:
  +
<PRE>
  +
MODE=netclient
  +
</PRE>
  +
  +
==<code>/etc/nut/upsmon.conf</code>==
  +
<PRE>
  +
RUN_AS_USER root
  +
MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master
  +
  +
MINSUPPLIES 1
  +
SHUTDOWNCMD "/sbin/shutdown -h +0"
  +
  +
POLLFREQ 1
  +
POLLFREQALERT 1
  +
HOSTSYNC 15
  +
DEADTIME 15
  +
  +
POWERDOWNFLAG /etc/killpower
  +
  +
  +
RBWARNTIME 43200
  +
NOCOMMWARNTIME 300
  +
FINALDELAY 5
  +
  +
  +
NOTIFYCMD /usr/sbin/upssched
  +
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
  +
</PRE>
  +
  +
===Краткое описание===
  +
  +
* <code>RUN_AS_USER root</code> - от какого пользователя запускать
  +
* <code>MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master</code> - описание УПСа
  +
** <code>UPS6000XL@10.72.0.14:3493</code> - Имя и адрес УПСа который мониторится
  +
** <code> 1 </code> - число блоков питания на этой системе которые подключены к выбранному УПСу (на предмет тушить или нет систему если УПс говорит что пора, если установить 0 то состояние УПСа можно игнорировать)
  +
** <code> upsmon pass</code> - логин/пароль которые определены на сервере
  +
** <code> master</code> # "master" means this system will shutdown last, allowing the slaves time to shutdown first. "slave" means this system shuts down immediately when power goes critical. (А откуда он узнает про другие системы? И как?)
  +
* <code>MINSUPPLIES 1</code> - указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной. Это значит что для серверов с 2 блоками питания которые заведены на 2 разных UPS и оба из которых мониторятся, команда на выключение будет подана только при условии что оба УПСа сообщат о том что у них низкий заряд батарей. За неимением 2 УПСов проверить этот сценарий я пока не могу.
  +
* <code>SHUTDOWNCMD "/sbin/shutdown -h +0"</code>
  +
* <code>POLLFREQ 1</code>опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать эту частоту опроса, чтобы upsmon не “зашумлял” вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания;
  +
* <code>POLLFREQALERT 1</code> опрос UPS с частотой в секундах когда пропало питание. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи, а можно и не делать;
  +
* <code>HOSTSYNC 15</code> как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них; (что бы это не значило)
  +
  +
* <code>DEADTIME 15</code>интервал ожидания перед объявлением статуса UPS как «мертвый». Upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается как «мертвый». Выставляйте значение этой переменной в несколько (в три и более раза пойдет) раз больше чем POLLFREQ и POLLFREQALERT;
  +
* <code>POWERDOWNFLAG /etc/killpower</code>
  +
* <code>NOTIFYFLAG</code> - изменение поведения upsmon при возникновении событий NOTIFY; другиим словами что делать при наступлении события
  +
* <code>RBWARNTIME</code> - предупреждение замены аккумулятора в секундах;
  +
* <code>NOCOMMWARNTIME</code> - предупреждение по времени при не общении к UPS в секундах;
  +
* <code>FINALDELAY</code> - через сколько выполнить SHUTDOWNCMD.
  +
  +
* <code>NOTIFYCMD /usr/sbin/upssched</code> - какую команду дернуть при событии (если для события есть флаг EXEC)
  +
* <code>NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC</code> для всех событий действия одинаковы - записать в сислог, выслать сообщение на консоль (коммандой wall) и вызвать бинарник указанный в <code>NOTIFYCMD</code>
  +
* <code>NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG FSD SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC</code>
  +
* <code>NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC</code>
  +
==<code>/etc/nut/upssched.conf</code>==
  +
Этот файл представляет собой описание в формате
  +
  +
* <code>AT ONBATT</code> событие
  +
* <code>*</code> для какого бесперебойника если их несколько (у меня он один - и тут "для любого")
  +
* <code>START-TIMER timer_onbatt_10_sec 10</code> - действие, запустить таймер с именем <code>START-TIMER timer_onbatt_10_sec</code> который завершиться через <code>10</code> секунд, после чего будет вызван скрипт определенный в <code>CMDSCRIPT</code> с параметром - именем таймера
  +
* <code>EXECUTE onbatt</code> - немедленно вызывать скрипт определенный в <code>CMDSCRIPT</code> c параметром (в этом примере) <code>onbatt</code>
  +
  +
<PRE>
  +
CMDSCRIPT /etc/nut/bin/upssched-cmd
  +
  +
#PIPEFN /run/nut/upssched/upssched.pipe
  +
#LOCKFN /run/nut/upssched/upssched.lock
  +
  +
PIPEFN /tmp/upssched.pipe
  +
LOCKFN /tmp/upssched.lock
  +
  +
AT ONBATT * START-TIMER timer_onbatt_10_sec 10
  +
AT ONBATT * EXECUTE onbatt
  +
  +
AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec
  +
AT ONLINE * EXECUTE online
  +
  +
AT LOWBATT * EXECUTE lowbatt
  +
  +
AT FSD * EXECUTE fsd
  +
  +
AT COMMBAD * EXECUTE commbad
  +
AT COMMBAD * START-TIMER timer_commbad_400_sec 400
  +
  +
AT COMMOK * EXECUTE commok
  +
AT COMMOK * CANCEL-TIMER timer_commbad_400_sec
  +
  +
  +
AT SHUTDOWN * EXECUTE shutdown
  +
AT REPLBATT * EXECUTE replbatt
  +
AT NOCOMM * EXECUTE nocomm
  +
AT NOPARENT * EXECUTE noparent
  +
</PRE>
  +
===Краткое описание===
  +
* <code>CMDSCRIPT /etc/nut/bin/upssched-cmd</code> - скрипт-обработчик
  +
* <code>AT ONBATT * START-TIMER timer_onbatt_10_sec 10</code> - запустить таймер, по истечении котрого вызвать комманду <code>/etc/nut/bin/upssched-cmd </code>
  +
* <code>AT ONBATT * EXECUTE onbatt</code> - немедленно по наступлению события вызвать комманду <code>/etc/nut/bin/upssched-cmd onbatt</code>
  +
* <code>AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec</code> - отменить запущенный таймер если питание вернулось до его истечения
  +
Далее аналогично, рписывать все параметры смысла нет(а что такое NOPARENT я и не знаю)
  +
  +
==<code>/etc/nut/bin/upssched-cmd</code>==
  +
Это просто скрипт который смотрит на параметр и в зависимости от этого выполняет какие-то действия
  +
<BR>
  +
В моем случае при истечении 10-секундного таймера <code>timer_onbatt_10_sec</code> данные о том что сервер выключается и показатели УПСа (<code>UPS="UPS6000XL@10.72.0.14:3493"</code>) будут запиисаны в файл (<code>SHUTDOWN_REASON_FILE="/etc/shutdown_reason"</code>) после чего запущена команда на выключение (<code>/sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]"</code>)
  +
  +
<PRE>
  +
#!/bin/sh
  +
echo "[$(date)] [${@}]" | logger -t "upsmon[upssched][upssched-cmd] Start"
  +
  +
SHUTDOWN_REASON_FILE="/etc/shutdown_reason"
  +
UPS="UPS6000XL@10.72.0.14:3493"
  +
  +
case $1 in
  +
timer_onbatt_10_sec)
  +
echo "[$(date)]upsmon[upssched][timer_onbatt_10_sec] Executing /sbin/shutdown -h +0" > ${SHUTDOWN_REASON_FILE}
  +
upsc ${UPS} 2>&1 >>${SHUTDOWN_REASON_FILE}
  +
  +
/sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]"
  +
;;
  +
onbatt)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][onbatt]"
  +
;;
  +
online)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][online]"
  +
;;
  +
lowbatt)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][lowbatt]"
  +
;;
  +
fsd)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][fsd]"
  +
;;
  +
commbad)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commbad]"
  +
;;
  +
commok)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commok]"
  +
;;
  +
shutdown)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][shutdown]"
  +
;;
  +
replbatt)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][replbatt]"
  +
;;
  +
nocomm)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][nocomm]"
  +
;;
  +
noparent)
  +
echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
  +
upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][noparent]"
  +
;;
  +
*)
  +
echo "Unknown State, ERROR"| logger -t "upsmon[upssched] $@"
  +
;;
  +
esac
  +
</PRE>

Текущая версия на 17:21, 6 мая 2024


NUT + SNMP

Хочется тушить стойку после того как пропало питание, через определенное время (в процессе настройки я его несколько раз уменьшал), при этом безперпебойник доступен по сети (SNMP)
Классический сценарий подразумевает что УПС сообщит о том что батарея "уже почти все" (LB) и тогда только сушить весла.
Возможно настроить на каждом сервере отдельный экзкмпляр NUT или опрашивать по сети один NUT работающий в режиме сервера - я выбрал сценарий с клиент-сервером

При этом виртуальные машины, запущенные на хосте выключаются через обработку виртуальной кнопки ACPI

NUT серверная часть

Driver (nut-driver.service) ups.conf

Предельно простая настройка - нужно знать только адрес и community в файле ups.conf

[UPS6000XL]
    driver = snmp-ups
    port = 10.72.0.8
    desc = "Smart-UPS RT 6000 RM XL"
    community = public
    snmp_version = v1
    pollfreq = 15
  • community = public заменить на актуальное значение

Сервер (nut-server.service)nut.conf upsd.conf upsd.users

nut.conf

Тут настраивается режим сервера, в этом случае

MODE=netserver

upsd.conf

Так как предпологается что запрос будут приходить с других серверов, то нужно разрешить слушать на всех интерфейсах

LISTEN 0.0.0.0 3493

upsd.users

[admin]
    password = admin
    actions = SET
    instcmds = ALL

Проверка работы

Локально проверить можно так

upsc UPS6000XL@localhost
Init SSL without certificate database
ambient.1.humidity.alarm.high: 60.00
ambient.1.humidity.alarm.low: 30.00
ambient.1.temperature.alarm.high: 40.00
ambient.1.temperature.alarm.low: 10.00
battery.charge: 49.00
battery.charge.restart: 0
battery.date: 02/07/15
battery.packs: 1.00
battery.runtime: 360.00
battery.runtime.low: 120
battery.voltage: 218.10
device.mfr: APC
device.model: Smart-UPS RT 6000 RM XL
device.serial: Q123
device.type: ups
driver.name: snmp-ups
driver.parameter.pollfreq: 15
driver.parameter.pollinterval: 2
driver.parameter.port: 10.72.0.8
driver.parameter.snmp_version: v1
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: apcc MIB 1.2
driver.version.internal: 0.97
input.frequency: 50.00
input.sensitivity: UNKNOWN
input.transfer.high: 253
input.transfer.low: 161
input.transfer.reason: rateOfVoltageChange
input.voltage: 213.10
input.voltage.maximum: 216.00
input.voltage.minimum: 210.20
output.current: 5.20
output.frequency: 50.00
output.voltage: 231.60
output.voltage.nominal: 230
ups.delay.shutdown: 20
ups.delay.start: 0
ups.firmware: 452.19.W
ups.id: UPS_IDEN
ups.load: 23.00
ups.mfr: APC
ups.mfr.date: 07/07/14
ups.model: Smart-UPS RT 6000 RM XL
ups.serial: QS1428270733
ups.status: OL
ups.temperature: 18.40
ups.test.date: 04/13/2024
ups.test.result: Ok

На этом серверная часть +/- настроена, и можно переходить к настройке клиентской

NUTСетевые клиенты

apt install nut-client

/etc/nut/nut.conf

Одна строчка:

MODE=netclient

/etc/nut/upsmon.conf

RUN_AS_USER root
MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master

MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"

POLLFREQ 1
POLLFREQALERT 1
HOSTSYNC 15
DEADTIME 15

POWERDOWNFLAG /etc/killpower


RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5


NOTIFYCMD /usr/sbin/upssched
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

Краткое описание

  • RUN_AS_USER root - от какого пользователя запускать
  • MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master - описание УПСа
    • UPS6000XL@10.72.0.14:3493 - Имя и адрес УПСа который мониторится
    • 1 - число блоков питания на этой системе которые подключены к выбранному УПСу (на предмет тушить или нет систему если УПс говорит что пора, если установить 0 то состояние УПСа можно игнорировать)
    • upsmon pass - логин/пароль которые определены на сервере
    • master # "master" means this system will shutdown last, allowing the slaves time to shutdown first. "slave" means this system shuts down immediately when power goes critical. (А откуда он узнает про другие системы? И как?)
  • MINSUPPLIES 1 - указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной. Это значит что для серверов с 2 блоками питания которые заведены на 2 разных UPS и оба из которых мониторятся, команда на выключение будет подана только при условии что оба УПСа сообщат о том что у них низкий заряд батарей. За неимением 2 УПСов проверить этот сценарий я пока не могу.
  • SHUTDOWNCMD "/sbin/shutdown -h +0"
  • POLLFREQ 1опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать эту частоту опроса, чтобы upsmon не “зашумлял” вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания;
  • POLLFREQALERT 1 опрос UPS с частотой в секундах когда пропало питание. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи, а можно и не делать;
  • HOSTSYNC 15 как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них; (что бы это не значило)
  • DEADTIME 15интервал ожидания перед объявлением статуса UPS как «мертвый». Upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается как «мертвый». Выставляйте значение этой переменной в несколько (в три и более раза пойдет) раз больше чем POLLFREQ и POLLFREQALERT;
  • POWERDOWNFLAG /etc/killpower
  • NOTIFYFLAG - изменение поведения upsmon при возникновении событий NOTIFY; другиим словами что делать при наступлении события
  • RBWARNTIME - предупреждение замены аккумулятора в секундах;
  • NOCOMMWARNTIME - предупреждение по времени при не общении к UPS в секундах;
  • FINALDELAY - через сколько выполнить SHUTDOWNCMD.
  • NOTIFYCMD /usr/sbin/upssched - какую команду дернуть при событии (если для события есть флаг EXEC)
  • NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC для всех событий действия одинаковы - записать в сислог, выслать сообщение на консоль (коммандой wall) и вызвать бинарник указанный в NOTIFYCMD
  • 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

/etc/nut/upssched.conf

Этот файл представляет собой описание в формате

  • AT ONBATT событие
  • * для какого бесперебойника если их несколько (у меня он один - и тут "для любого")
  • START-TIMER timer_onbatt_10_sec 10 - действие, запустить таймер с именем START-TIMER timer_onbatt_10_sec который завершиться через 10 секунд, после чего будет вызван скрипт определенный в CMDSCRIPT с параметром - именем таймера
  • EXECUTE onbatt - немедленно вызывать скрипт определенный в CMDSCRIPT c параметром (в этом примере) onbatt
CMDSCRIPT /etc/nut/bin/upssched-cmd

#PIPEFN /run/nut/upssched/upssched.pipe
#LOCKFN /run/nut/upssched/upssched.lock

PIPEFN /tmp/upssched.pipe
LOCKFN /tmp/upssched.lock

AT ONBATT       * START-TIMER timer_onbatt_10_sec 10
AT ONBATT       * EXECUTE onbatt

AT ONLINE       * CANCEL-TIMER timer_onbatt_10_sec
AT ONLINE       * EXECUTE online

AT LOWBATT      * EXECUTE lowbatt

AT FSD          * EXECUTE fsd

AT COMMBAD      * EXECUTE commbad
AT COMMBAD      * START-TIMER timer_commbad_400_sec 400

AT COMMOK       * EXECUTE commok
AT COMMOK       * CANCEL-TIMER timer_commbad_400_sec


AT SHUTDOWN     * EXECUTE shutdown
AT REPLBATT     * EXECUTE replbatt
AT NOCOMM       * EXECUTE nocomm
AT NOPARENT     * EXECUTE noparent

Краткое описание

  • CMDSCRIPT /etc/nut/bin/upssched-cmd - скрипт-обработчик
  • AT ONBATT * START-TIMER timer_onbatt_10_sec 10 - запустить таймер, по истечении котрого вызвать комманду /etc/nut/bin/upssched-cmd
  • AT ONBATT * EXECUTE onbatt - немедленно по наступлению события вызвать комманду /etc/nut/bin/upssched-cmd onbatt
  • AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec - отменить запущенный таймер если питание вернулось до его истечения

Далее аналогично, рписывать все параметры смысла нет(а что такое NOPARENT я и не знаю)

/etc/nut/bin/upssched-cmd

Это просто скрипт который смотрит на параметр и в зависимости от этого выполняет какие-то действия
В моем случае при истечении 10-секундного таймера timer_onbatt_10_sec данные о том что сервер выключается и показатели УПСа (UPS="UPS6000XL@10.72.0.14:3493") будут запиисаны в файл (SHUTDOWN_REASON_FILE="/etc/shutdown_reason") после чего запущена команда на выключение (/sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]")

#!/bin/sh
echo "[$(date)] [${@}]" | logger -t "upsmon[upssched][upssched-cmd] Start"

SHUTDOWN_REASON_FILE="/etc/shutdown_reason"
UPS="UPS6000XL@10.72.0.14:3493"

case $1 in
    timer_onbatt_10_sec)
        echo "[$(date)]upsmon[upssched][timer_onbatt_10_sec] Executing /sbin/shutdown -h +0" > ${SHUTDOWN_REASON_FILE}
        upsc ${UPS} 2>&1 >>${SHUTDOWN_REASON_FILE}

        /sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]"
    ;;
    onbatt)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][onbatt]"
    ;;
    online)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][online]"
    ;;
    lowbatt)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][lowbatt]"
    ;;
    fsd)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][fsd]"
    ;;
    commbad)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commbad]"
    ;;
    commok)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commok]"
    ;;
    shutdown)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][shutdown]"
    ;;
    replbatt)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][replbatt]"
    ;;
    nocomm)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][nocomm]"
    ;;
    noparent)
        echo "UPS status is ${@}"| logger -t "upsmon[upssched]"
        upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][noparent]"
    ;;
    *)
        echo "Unknown State, ERROR"| logger -t "upsmon[upssched] $@"
    ;;
esac