День добрый.
Все тот же UPS Powercom KIN-1000AP, заменил батареи на новые.
Хочу все же допилить автовыключение UPS, т.к. он это может.
Вот конфиги.
nut.conf
Код: Выделить всё
MODE = netserver
UPSD_OPTIONS="-u root"
UPSMON_OPTIONS="-u root"
ups.conf
Код: Выделить всё
user = root
[powercom]
driver = powercom
port = /dev/cuau2
desc = "Gateway UPS"
modelname = "King PRO"
type = KIN
upsd.conf
Код: Выделить всё
MAXAGE 15
LISTEN 127.0.0.1 3493
LISTEN 192.168.0.1 3493
MAXCONN 1024
upsd.users
Код: Выделить всё
[powercom]
password = qqqq
upsmon master
allowfrom localhost
allowfrom 127.0.0.1
allowfrom 192.168.0.1
actions = SET
actions = FSD
instcmds = ALL
[upsslave]
password = wwww
upsmon slave
upsmon.conf
Код: Выделить всё
RUN_AS_USER root
MONITOR powercom@localhost 1 powercom qqqq master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -p now"
POLLFREQ 10
POLLFREQALERT 5
HOSTSYNC 120
DEADTIME 3600
POWERDOWNFLAG /etc/killpower
NOTIFYCMD /usr/local/sbin/upssched
NOTIFYMSG ONLINE "NUT: UPS %s on line power"
NOTIFYMSG ONBATT "NUT: UPS %s on battery"
NOTIFYMSG LOWBATT "NUT: UPS %s battery is low"
NOTIFYMSG FSD "NUT: UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK "NUT: Communications with UPS %s established"
NOTIFYMSG COMMBAD "NUT: Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN "NUT: Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT "NUT: UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM "NUT: UPS %s is unavailable"
NOTIFYMSG NOPARENT "NUT: upsmon parent process died - shutdown impossible"
NOTIFYFLAG ONLINE EXEC+SYSLOG
NOTIFYFLAG ONBATT EXEC+SYSLOG
NOTIFYFLAG LOWBATT EXEC+SYSLOG
NOTIFYFLAG FSD EXEC+SYSLOG
NOTIFYFLAG COMMOK IGNORE
NOTIFYFLAG COMMBAD IGNORE
NOTIFYFLAG SHUTDOWN SYSLOG+WALL
NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM IGNORE
NOTIFYFLAG NOPARENT IGNORE
RBWARNTIME 43200
NOCOMMWARNTIME 3600
FINALDELAY 240
upsshed.conf
Код: Выделить всё
CMDSCRIPT /usr/local/etc/nut/upssched-cmd
PIPEFN /var/db/nut/upssched.pipe
LOCKFN /var/db/nut/upssched.lock
AT ONBATT powercom@localhost START-TIMER upsgone 217
AT ONLINE * CANCEL-TIMER upsgone
upssched-cmd
Код: Выделить всё
#!/bin/sh
case $1 in
# Имя нашего таймера, указанного в upssched.conf
upsgone)
/usr/bin/logger -t upssched-cmd "NUT: Process shutdown is running"
/usr/bin/touch /etc/killpower
/usr/local/sbin/upsmon -c fsd
/usr/bin/logger -t upssched-cmd "NUT: Enabled the forced shutdown"
;;
*)
/usr/bin/logger -t upssched-cmd "Unrecognized command: $1"
;;
esac
/usr/local/etc/rc.d/nut
Код: Выделить всё
....
nut_poststop() {
${nut_prefix}/sbin/upsdrvctl stop
if [ -f /etc/killpower ] ; then
/bin/rm -f /etc/killpower
/usr/local/sbin/upsdrvctl shutdown powercom
/usr/local/libexec/nut/powercom -k -D -a powercom
fi
}
....
Как оно у меня должно работать.
1. После отключения света UPS запускает
NOTIFYFLAG ONBATT EXEC
стартует NOTIFYCMD /usr/local/sbin/upssched
и запускается таймер upsgone на 217 сек из шедулера.
Данное время просто ждем, вдруг питание появится, если появилось то выключаем таймер и живем дальше.
2. Таймер отработал (свет не включили), таймер запускает скрипт upssched-cmd, который стартует
/usr/local/sbin/upsmon -c fsd и система начинает выключаться.
Создается файл /etc/killpower
Но перед выключением (после получения FSD) ждем FINALDELAY 240 сек т.к. к UPS подключен еще один ПК как slave.
3. После 240 сек начинают завершаться программы, когда дошли до завершения работы nut, срабатывает код добавленный на выключение сервиса nut
Код: Выделить всё
if [ -f /etc/killpower ] ; then
/bin/rm -f /etc/killpower
/usr/local/sbin/upsdrvctl shutdown powercom
/usr/local/libexec/nut/powercom -k -D -a powercom
fi
Т.е. удаляется файл killpower и запускается режим принудительного выключения UPS
В теории все верно, но есть несколько вопросов.
1. При любых раскладах nut самостоятельно не хочет формировать файл POWERDOWNFLAG /etc/killpower, как я только не пробовал.
Поэтому пришлось его засунуть в шедулер, а тут есть один недостаток.
На свежем UPS, когда свет вырубили в перый раз все отработает корректно, а если свет будут выключать и включать несколько раз подряд, то по идее шедулер недовыполниться и сервер уйдет на выключение, без принудительного выключения UPS, что не есть хорошо.
2. Если руками создаю файл /etc/killpower и завершаю работу системы shutdown -p now, то корректно отрабатывает код добавленный в /usr/local/etc/rc.d/nut
Т.е. для UPS выполняется комманда /usr/local/sbin/upsdrvctl shutdown powercom и он в итоге выключается.
А вот если вырубаю питание UPS, сервера завершают работу, а UPS нет.
В момент завершения работы NUT в messages такое
Код: Выделить всё
upsmon[58804]: NUT: UPS powercom@localhost: forced shutdown in progress
upsmon[58804]: NUT: UPS powercom@localhost on battery
upsmon[58804]: NUT: UPS powercom@localhost battery is low
upsmon[58804]: Executing automatic power-fail shutdown
upsmon[58804]: NUT: Auto logout and shutdown proceeding
kernel: .
upsd[3814]: mainloop: Interrupted system call
Обгуглил весь инет, не могу найти решение, что ему сцуке не так ...
Nut, nut_upsmon и nut_upslog запускаются от root, т.е. по идее с полными правами ...
Буду благодарен за любой совет...