Купили мы для гермозоны вот такое щясте.
В руководстве пользователя сказано, что управление через RS232/USB поддерживается в Linux/MacOS/BSD. Но софт, предлагаемый скачать и установить для этой цели, фуфел полный. Поэтому пришлось искать опенсорсный софт для управления ИБП в портах FreeBSD 7.x. Собственно, Network UPS Tools (NUT) и есть нужное нам решение, причем, пожалуй, и единственное.
Ставим из портов sysutils/nut, я выбрало вот такие опции уставки (отмечены крестиками):
Options for nut 2.4.1
[X] SERIAL SERIAL support
[X] USB USB support
[X] SNMP SNMP support
[X] NEON NEON XML/HTTP support
[ ] PDU Powerman PDU support
[ ] HAL HAL support
[ ] IPV6 IPV6 support
[ ] DEVEL Install header files
[X] CGI Web CGI interface
Открываем http://people.freebsd.org/~thierry/nut_FreeBSD_HowTo.txt, переименовываем примеры конфигов *.sample в /ust/local/etc/nut/ в *.conf и начинаем конфигурировать тестовую машину dune.
Конфигурировать NUT пока будем для управления через COM-порт.
Выбираем драйвер для нашей модели Mustek из доступных:
root@dune# grep -i mustek /usr/local/etc/nut/driver.list
"Mustek" "Powermust" "400VA Plus" "megatec"
"Mustek" "Powermust" "600VA Plus" "megatec"
"Mustek" "Powermust" "800VA Pro" "megatec"
"Mustek" "Powermust" "1000VA Plus" "megatec"
"Mustek" "Powermust" "1400VA Plus" "megatec"
"Mustek" "Powermust" "2000VA USB" "megatec"
"Mustek" "Powermust Office 650" "USB" "megatec_usb"
"Mustek" "Various" "" "megatec"
Отлично, наш драйвер - megatec.
Посмотрим, какие конфигурационные файлы в директории /usr/local/etc/nut/ :
root@dune# ls -l /usr/local/etc/nut/
-r--r--r-- 1 root wheel 10224 7 тра 11:04 cmdvartab
-r--r--r-- 1 root wheel 31325 7 тра 11:04 driver.list
-r--r--r-- 1 root wheel 1130 7 тра 15:33 hosts.conf
-r--r--r-- 1 root wheel 1370 7 тра 12:31 nut.conf
-r--r--r-- 1 root wheel 3764 7 тра 18:20 ups.conf
-r--r--r-- 1 root wheel 1779 7 тра 13:06 upsd.conf
-rw-r----- 1 uucp wheel 2142 7 тра 12:58 upsd.users
-r--r--r-- 1 root wheel 12308 7 тра 18:27 upsmon.conf
-r--r--r-- 1 root wheel 3895 7 тра 15:26 upssched.conf
-r--r--r-- 1 root wheel 1416 7 тра 11:53 upsset.conf
-r--r--r-- 1 root wheel 5817 7 тра 11:04 upsstats-single.html
-r--r--r-- 1 root wheel 4003 7 тра 11:04 upsstats.html
Первые 2 файла и 2 последних мы трогать не будем, а с остальными разберемся по порядку. Эти конфигурационные файлы отлично откомментированы и имеют разумную длину, конфигурировать - одно удовольствие. В листингах ниже я опущу пустые строки и строки комментариев, *.sample вы надеюсь сбэкапили? :)
* nut.conf - содержит указание, какие части пакета nut мы будем запускать
* ups.conf – настройки UPS-специфического драйвера
* upsd.conf - настройки для главного UPS демона
* upsd.users – файл контроля доступа для UPS демона
* upsmon.conf - настройки для UPS демона монитора
* upssched.conf - настройки для upssched демона
Собственно, сейчас мы настраиваем хост как этот самый "главный UPS демон" - то есть, хост будет работать в режиме master.
root@dune# grep -v ^\$ /usr/local/etc/nut/nut.conf | grep -v ^#
MODE = netserver
Процитирую список режимов и описание назначения каждого из них из комемнтариев в nut.conf:
# The values of MODE can be:
# - none: NUT is not configured, or use the Integrated Power Management, or use
# some external system to startup NUT components. So nothing is to be started.
# - standalone: This mode address a local only configuration, with 1 UPS
# protecting the local system. This implies to start the 3 NUT layers (driver,
# upsd and upsmon) and the matching configuration files. This mode can also
# address UPS redundancy.
# - netserver: same as for the standalone configuration, but also need
# some more ACLs and possibly a specific LISTEN directive in upsd.conf.
# Since this MODE is opened to the network, a special care should be applied
# to security concerns.
# - netclient: this mode only requires upsmon.
root@dune# grep -v ^\$ /usr/local/etc/nut/hosts.conf | grep -v ^#
MONITOR mustek@127.0.0.1 "Mustek PowerMust 1000 NetGuard"
В файле hosts.conf - список ИБП, подлежащих мониторингу, в форме:
MONITOR upsname@hostaddress "ups description"
где upsname - произвольное имя, которое мы даем конкретному ИБП, описанному в файле ups.conf. hostaddress должен соответствовать IP или доменному имени, указанному в файле upsd.conf в директиве LISTEN.
root@dune# grep -v ^\$ /usr/local/etc/nut/ups.conf | grep -v ^#
[mustek]
driver = megatec
port = /dev/cuad0
desc = "Mustek PowerMust 1000 NetGuard"
В конфиге ups.conf в квадратных скобках указано имя ИБП, которое мы используем в hosts.conf, и соответствующие ему параметры:
driver = somedriver (где somedriver подбираем из указынных в driver.list), это поле - обязательное!
port = /dev/device_port (где device_port - имя устройства, к которому ИБП подключен через контролирующий интерфейс), тоже обязательное поле,
desc = "UPS description" - необязательное поле с текстовым описанием бесперебойника. Список других необязательных полей можно посмотреть в документации. Пока что отмечу, что очень полезным может быть параметр lowbatt = 50, которым указывается, при каком уровне остатка заряда батареи (в процентах) выдается сигнял LOWBATT и, соответственно, начинается процесс корректного шатдауна подключенных машин. По умолчанию этот параметр равен 35.
root@dune# grep -v ^\$ /usr/local/etc/nut/upsd.conf | grep -v ^#
LISTEN 127.0.0.1 3493
MAXCONN 1024
LISTEN - определяем, на каких адресах\интерфейсах будет слушать демон upsd - по умолчанию, как раз 3493. Позже, когда мы сконфигурируем nut в режиме nutclient на другой машине, мы добавим в конфигурацию upsd.conf на машине-netserver ещё одну директиву LISTEN с внешним IP-адресом
MAXCONN - количество одновременных соединений с демоном usbd, после достижения этого предела остальные попытки соединений молча игнорируются.
root@dune# grep -v ^\$ /usr/local/etc/nut/upsd.users | grep -v ^#
[admin]
password = adminpass
actions = SET
instcmds = ALL
[monmaster]
password = mustekpass
upsmon master
Соответственно, список пользователей и их права.
У меня определен пользователь admin - он имеет право выполнять любые доступные для этой модели ИБП команды контроля и определять любые переменные, как посредством команды upsc, так и через веб-интерфейс.
И, естественно, пользователь, от имени которого идёт опрос ИБП (это пользователь для upsmon).
root@dune# grep -v ^\$ /usr/local/etc/nut/upsmon.conf | grep -v ^#
MONITOR mustek@127.0.0.1 1 monmaster mustekpass master
MINSUPPLIES 1
#SHUTDOWNCMD "/sbin/shutdown -h +0"
SHUTDOWNCMD "/sbin/shutdown -p now"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYFLAG ONLINE SYSLOG
NOTIFYFLAG ONBATT SYSLOG
NOTIFYFLAG LOWBATT SYSLOG+WALL
NOTIFYFLAG FSD SYSLOG+WALL
NOTIFYFLAG COMMOK SYSLOG
NOTIFYFLAG COMMBAD SYSLOG
NOTIFYFLAG SHUTDOWN SYSLOG+WALL
NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM SYSLOG
NOTIFYFLAG NOPARENT SYSLOG
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 0
Опять же, читаем комментарии в upsmon.conf.sample и сравниваем изменения дефолтов. Но без объяснений тут не обойтись ( это покажет меру моего разумения, хе-хе)
На закуску - файл upsset.conf.
Внимательно! читаем комментарий. Предлагается вот что: поскольку у нас будет работать мониторинг через веб-морду, то доступ к cgi-скрипту для управления ИБП следует ограничить с помощью .htaccess-файла, сложенного в директории cgi-bin - в комментариях код прилагается. Как только мы это требование выполнили - можно раскомментировать директиву I_HAVE_SECURED_MY_CGI_DIRECTORY.
Теперь вносим в /etc/rc.conf строки для запуска всей свиты NUT:
nut_enable="YES"
nut_upslog_enable="YES"
nut_upsmon_enable="YES"
и запускаем всё это хозяйство.
Приведу ещё конфигурацию виртуального хоста apache22:
root@dune# cat /usr/local/etc/apache22/extra/httpd-vhosts.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin vark@localhost
DocumentRoot "/usr/local/www/nut"
ServerName dune.company.com
ServerAlias www.dune.company.com
ErrorLog "/var/log/httpd/dune/error.log"
CustomLog "/var/log/httpd/dune/access.log" common
ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/"
Alias / "/usr/local/www/nut/"
<Directory /usr/local/www/nut>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<Directory "/usr/local/www/cgi-bin">
AllowOverride None
Order Allow,Deny
Allow from all
Options ExecCGI FollowSymLinks
</Directory>
</VirtualHost>
И ещё: к сожалению, пришлось править стартовый скрипт /usr/local/etc/rc.d/nut_upslog - например, переопределить жестко вписанный адрес мониторящегося ИБП, а также уменьшить интервал записи в лог (/var/log/ups.log)
строки
nut_upslog_interval=${nut_upslog_interval-"300"}
nut_upslog_ups=${nut_upslog_ups-"myups@localhost"}
были заменены на
nut_upslog_interval=${nut_upslog_interval-"60"}
nut_upslog_ups=${nut_upslog_ups-"mustek@127.0.0.1"}