Начиная с этой статьи, я бы хотел конспектировать проделанную работу с сервером. Она ничего нового и революционного не приносит в IT мир, и служит скорее пособием для самого себя, но возможно она будет кому-то интересна или полезна, итак...
Все началось с того, что я когда-то давно, когда был молодим и энергичным и, кстати, довольно привлекательным, купил UPS всеми известной фирмы APC, и поставил рядом возле домашнего сервера на случай если пьяный электрик, по неосторожности, вырвет пучок проводов и обесточит весь район. В общем рассказывать тут особо не о чем, я просто купил его, запитал сервер и забыл на довольно долгий промежуток времени. Все это было до того момента, пока по разным стечением обстоятельств не появился тот самый электрик, который периодически пытается работать, при этом вырубая от электричества весь дом. Из-за чего сервер выключался вместе с UPS-ом, что навеивало печаль и грусть.
Это меня и заставило посмотреть на наличие возможности связать сервер с UPS-ом. Посмотрев на заднюю крышку UPS-а, я увидел Ethernet разъем с надписью "Data port", что немного озадачило, после непродолжительного листания глобальной сети стало понятно, что это обычный COM порт с 10 pin RJ-50 разъемом. Почесав затылок и с мыслями: "где ж я такой разъем найду" начал гуглить дальше, и вышел на ресурс где есть распиновка кабеля с информацией о том как его соединить с COM портом: pinouts.ru. Увидев, что 9 и 10 пины не используются, я просто взял Ethernet разъем и на радостях побежал за проводками, разьемами и паяльником, и за несколько мгновений спаял простейший кабель. Стоит наверное сделать небольшую сноску по поводу кабеля, COM порта из прошлой эры и паяльника - так случилось, потому что я купил б/у UPS из прошлой эпохи, это когда на ламповых компьютерах был порт, который называли COM, через который коннектили разные внешние устройства. Сейчас же на всех UPS-ах стоит USB, и связать его с компьютером проще простого, в итоге не нужно таких танцев с паяльником. После того как соединил UPS с сервером, я начал искать возможность использовать нашу связь.
Apcupsd
Напоминаю, что на сервере стоит Freebsd система, на которой есть замечательная коллекция портов. Попробуем найти то, что нас интересует, для этого заходим в колекцию портов и ищем по слову apcups:
cd /usr/ports && make search name=apcups
Находим утилиту apcupsd и устанавливаем ее:
cd /usr/ports/sysutils/apcupsd && make install clean
Попутно ставим звездочку на CGI пункте, для того что бы мониторить наш UPS из интернета:
Дальше, для того что бы наша свежепоставленная программка запускалась, падаем на колени и просим ее об этом включаем ее в rc.conf и запускаем:
echo apcupsd_enable="YES" >> /etc/rc.conf /usr/local/etc/rc.d/apcupsd start
Что бы убедиться что все работает, запускаем утилиту, которая проверит и покажет все доступные характеристики вашего UPS-а:
apcaccess APC : 001,029,0776 DATE : 2012-12-14 21:23:46 +0200 HOSTNAME : serverna VERSION : 3.14.10 (13 September 2011) freebsd UPSNAME : serverna CABLE : Custom Cable Smart DRIVER : APC Smart UPS (any) UPSMODE : Stand Alone STARTTIME: 2012-12-14 08:15:08 +0200 MODEL : Back-UPS 500 STATUS : ONLINE LOADPCT : 0.0 Percent Load Capacity BCHARGE : 100.0 Percent TIMELEFT : 43.0 Minutes MBATTCHG : 5 Percent MINTIMEL : 3 Minutes MAXTIME : 0 Seconds BATTV : 13.5 Volts NUMXFERS : 1 XONBATT : 2012-12-14 13:42:16 +0200 TONBATT : 0 seconds CUMONBATT: 1 seconds XOFFBATT : 2012-12-14 13:42:17 +0200 STATFLAG : 0x07000008 Status Flag MANDATE : 06/20/03 SERIALNO : JB0325039422 BATTDATE : 10/10/10 NOMBATTV : 12.0 Volts FIRMWARE : 6.4.I END APC : 2012-12-14 21:24:15 +0200
В итоге получается такая картина, у нас в памяти висит демон apcupsd, который следит за характеристиками нашего UPS-а. Его интересует 2 параметра - BCHARGE и TIMELEFT, и на основе параметров MBATTCHG и MINTIMEL, он запустит команду на выключение компьютера, в зависимости от того, что наступит раньше. Система простая и надежная как деревянная ложка. В принципе, этого достаточно чтобы наш сервер вырубился вовремя. Но если вы хотите большего, тогда читайте дальше.
А что же мы собственно хотим:
- Мониторить заряд/разряд батареи через плагин munin, для своевременной ее замены.
- Смотреть текущее состояние UPS-а через веб-интерфейс.
- Мир во всем мире.
Давайте по порядку.
Munin плагин apc_nis
Давайте закроем глаза, и на секунду представим, что у вас стоит munin в качестве программы мониторинга сервера, если это так, то для установки нашего плагина делаем элементарные телодвижения:
ln -a /usr/local/share/munin/plugins/apc_nis apc_nis /usr/local/etc/rc.d/munin-node restart
И это все. После чего, через время, у вас появятся такие красивые графики:
Где вы сможете отслеживать вольтаж, заряд батареи, нагрузку на UPS и оставшиеся время заряда, на основе чего можно будет оценить как быстро батарея разряжается и заряжается - и это прекрасно.
Веб-интерфейс
Начнем с того, что в качестве веб-сервера будем использовать nginx, а соединять уже готовые скрипты cgi мы будем с помощью fastcgi. Я не хочу описывать установку nginx на сервер, потому как этого добра в интернете, мягко говоря, достаточно. Давайте заострим наше внимание на том, что нужно поставить и настроить, чтобы наш nginx сервер отдавал результат. Для начала лезем в порты, ставим fastcgi, после чего добавляем его в rc.conf и запускаем:
cd /usr/ports/www/fcgiwrap && make install clean echo fcgiwrap_enable="YES" >> /etc/rc.conf echo fcgiwrap_user="www" >> /etc/rc.conf /usr/local/etc/rc.d/fcgiwrap start
Дальше мы имеем готовые cgi скрипты, которые находятся тут /usr/local/etc/apcupsd/cgi/. Я люблю хранить все что касается веб-интерфейса в одном каталоге, поэтому делаю следующее:
mkdir /usr/local/www/apcupsd ln -s /usr/local/etc/apcupsd/cgi /usr/local/www/apcupsd/cgi-bin
Теперь у нас в директории /usr/local/www/apcupsd/cgi-bin/ находятся наши скрипты, которые мы хотим запускать через наш веб-интерфейс. Для этого нужно настроить nginx, поэтому пишем следующий конфиг для нашего виртуального хоста:
server { listen 80; server_name www.apc.megasite.com apc.megasite.com; location / { root /usr/local/www/apcupsd; index index.htm; } location /cgi-bin { fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock; fastcgi_param SCRIPT_FILENAME /usr/local/www/apcupsd$fastcgi_script_name; fastcgi_param SCRIPT_NAME /usr/local/www/apcupsd$fastcgi_script_name; include /usr/local/etc/nginx/fastcgi_params; } }
И перезапускаем наш nginx:
/usr/local/etc/rc.d/nginx restart
Только не забудьте на вашем DNS сервере добавить соответствующую запись о вашем новом домене. После этих действий у вас будет 3 скрипта, которые покажут вам статус UPS-а в разном графическом и текстовом виде, это:
/cgi-bin/multimon.cgi - покажет краткую общую информацию
/cgi-bin/upsfstats.cgi - покажет расширенную информацию с разными графиками, которые можно менять местами
/cgi-bin/upsstats.cgi - покажет информацию в текстовом виде, по сути аналог apcaccess из консоли
Что бы каждый раз не заходить на эти скрипты по отдельности, я собрал их в одном html файле, который можно взять тут https://github.com/tedor/apcups-monitor
Заключение
Данное решение, как оказалось, просто необходимо для домашнего сервера. Правильное питание крайне важно для любого компьютера, особенно если вы на нем храните массу нужной информации, и ваш компьютер включен 24 часа в сутки - вы волей неволей придете к тому что UPS необходим. Но при этом важно что бы он умел автоматом выключать ваш сервер, иначе это пустая трата денег. Так что при покупке советую обратить внимание на то, как его подключить к компьютеру, а также на доступный софт.
Буду рад любым комментариям и замечаниям, спасибо за внимание.
Всем добра и теплого, лампового настроения.
Краткая инструкция
Если вы прочитали все что написано выше, закройте глаза и листайте ниже к комментариям. Для всех остальных краткая инструкция как поставить и настроить apcupsd на сервере:
-
Ставим и запускаем apcupsd:
cd /usr/ports/sysutils/apcupsd && make install clean echo apcupsd_enable="YES" >> /etc/rc.conf /usr/local/etc/rc.d/apcupsd start
-
Ставим fcgiwrap:
cd /usr/ports/www/fcgiwrap && make install clean echo fcgiwrap_enable="YES" >> /etc/rc.conf echo fcgiwrap_user="www" >> /etc/rc.conf /usr/local/etc/rc.d/fcgiwrap start
-
Создаем директорию, где будем хранить наши скрипты для веб-сервера:
fetch -o /tmp/apcupsd-monitor.zip https://github.com/tedor/apcups-monitor/archive/master.zip tar zxvf /tmp/apcupsd-monitor.zip -C /usr/local/www mkdir /usr/local/www/apcupsd mv /usr/local/www/apcups-monitor-master/ /usr/local/www/apcupsd ln -s /usr/local/etc/apcupsd/cgi /usr/local/www/apcupsd/cgi-bin
-
Настраиваем nginx:
Создаем конфиг для хоста
server { listen 80; server_name www.apc.megasite.com apc.megasite.com; location / { root /usr/local/www/apcupsd; index index.htm; } location /cgi-bin { fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock; fastcgi_param SCRIPT_FILENAME /usr/local/www/apcupsd$fastcgi_script_name; fastcgi_param SCRIPT_NAME /usr/local/www/apcupsd$fastcgi_script_name; include /usr/local/etc/nginx/fastcgi_params; } }
Перезапускаем nginx
/usr/local/etc/rc.d/nginx restart