Blog
Серверные плюшки: apcupsd и веб-мониторинг

Начиная с этой статьи, я бы хотел конспектировать проделанную работу с сервером. Она ничего нового и революционного не приносит в 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 из интернета:

apcupsd-install.jpg

Дальше, для того что бы наша свежепоставленная программка запускалась, падаем на колени и просим ее об этом включаем ее в 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, он запустит команду на выключение компьютера, в зависимости от того, что наступит раньше. Система простая и надежная как деревянная ложка. В принципе, этого достаточно чтобы наш сервер вырубился вовремя. Но если вы хотите большего, тогда читайте дальше.

А что же мы собственно хотим:

  1. Мониторить заряд/разряд батареи через плагин munin, для своевременной ее замены.
  2. Смотреть текущее состояние UPS-а через веб-интерфейс.
  3. Мир во всем мире.

Давайте по порядку.

Munin плагин apc_nis

Давайте закроем глаза, и на секунду представим, что у вас стоит munin в качестве программы мониторинга сервера, если это так, то для установки нашего плагина делаем элементарные телодвижения:

ln -a /usr/local/share/munin/plugins/apc_nis apc_nis
/usr/local/etc/rc.d/munin-node restart

И это все. После чего, через время, у вас появятся такие красивые графики:

apc_nis-day.png

Где вы сможете отслеживать вольтаж, заряд батареи, нагрузку на 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 - покажет краткую общую информацию

monitor-1.jpg

/cgi-bin/upsfstats.cgi - покажет расширенную информацию с разными графиками, которые можно менять местами

monitor-2.jpg

/cgi-bin/upsstats.cgi - покажет информацию в текстовом виде, по сути аналог apcaccess из консоли

monitor-3.jpg

Что бы каждый раз не заходить на эти скрипты по отдельности, я собрал их в одном html файле, который можно взять тут https://github.com/tedor/apcups-monitor

Заключение

Данное решение, как оказалось, просто необходимо для домашнего сервера. Правильное питание крайне важно для любого компьютера, особенно если вы на нем храните массу нужной информации, и ваш компьютер включен 24 часа в сутки - вы волей неволей придете к тому что UPS необходим. Но при этом важно что бы он умел автоматом выключать ваш сервер, иначе это пустая трата денег. Так что при покупке советую обратить внимание на то, как его подключить к компьютеру, а также на доступный софт.
Буду рад любым комментариям и замечаниям, спасибо за внимание.
Всем добра и теплого, лампового настроения.

Краткая инструкция

Если вы прочитали все что написано выше, закройте глаза и листайте ниже к комментариям. Для всех остальных краткая инструкция как поставить и настроить apcupsd на сервере:

  1. Ставим и запускаем apcupsd:

    cd /usr/ports/sysutils/apcupsd && make install clean
    echo apcupsd_enable="YES" >> /etc/rc.conf
    /usr/local/etc/rc.d/apcupsd start
    
  2. Ставим 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
    
  3. Создаем директорию, где будем хранить наши скрипты для веб-сервера:

    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
    
  4. Настраиваем 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