Видеонаблюдение через интернет в веб-браузере

Мониторинг avregd с помощью коллектора событий.

Задача.

Необходимо контролировать 3 процесса/состояния:

  1. демона avregd (работает или нет),
  2. захвата с камер,
  3. записи медиа-файлов на жёсткий диск в архив.

В случае обнаружения проблем необходимо уведомить администратора системы на e-mail.

Решение.

В контексте статьи, предполагается использование avregd версий не ниже 6.0p4 или 6.1p2.

В рамках этой статьи описывается решения с использованием штатного инструмента - «Внешний сборщик/обработчик событий (event-collector).».

Теория.

Контроль рабочего состояния демона.

С учётом автоматического запуска системами инициализации контроль рабочего состояния демона avregd будем производить по факту его аварийного завершения.

Т.к. процесс avregd является родителем процесса event-collector, последний получает сингал при внезапном (аварийном) завершении своего родителя. По этому событию нужно отправить уведомление на e-mail администратора AVReg.

/etc/avreg/scripts/event-collector

!/bin/sh
 
...
 
# для нотификации о аварийном завешении демона и др. проблеммах командой mail
# Нужна настройка MTA, например так https://wiki.debian.org/GmailAndExim4
# "Using Exim4 to Send Messages through Gmail"
ADMIN_EMAIL=root
 
# флаг аварийного завершения демона avregd, сбрасывается
# по получению "последнего" сообщения с кодом 2
AVREGD_KILLED=1
 
...
 
# в самом конце скрипта
if [ $AVREGD_KILLED -eq 0 ]; then
   log notice "normal exiting"
else
   $BEEP
   log crit "parent avregd was killed, exiting"
   if [ -n "$ADMIN_EMAIL" ]; then
        echo "subj happened at `date`" | mail -s "avregd $PROFILE_NAME was killed" $ADMIN_EMAIL 2>/dev/null
   fi
fi
 
my_atexit
exit $?

Контроль состояния захвата с камер.

avregd отправляет в event-collector уведомления о подключении и отключении камер. Чтобы не реагировать на мелкие сбои (например, перезагрузку камер, коммутаторов и т.п.) реагировать будем только если к камере не удалось подключиться в течении указанного количества минут, по умолчанию - 3 минуты.

Для реализации этого функционала в коде event-collector по событию «сбой захвата» будем создавать файлы-флаги во временном каталоге /tmp, а по событию «начало захвата» - удалять эти файлы.

/etc/avreg/script/event-collector

on_capture() {
   ...
   log debug "cam[$cam_nr]: $grabber_name/$media_str capture $status at $dt_event: $textmsg"
 
   if [ "$status_code" = "3" ]; then
      # создаём файл-признак сбоя захвата
      echo "cam[${cam_nr}]: ${dt_event}: ${textmsg}" >> "/tmp/cam_${cam_nr}_capture_failed.txt"
   else
      # удаляем файл-признак сбоя захвата
      rm -f "/tmp/cam_${cam_nr}_capture_failed.txt" 2>/dev/null
   fi

Через задание планировщика CRON с интервалом запуска «1 минута» будем запускать скрипт для проверки наличия файлов-флагов.

cat /etc/cron.d/avregd

# на какой адрес присылать уведомление,
# расскоментируйте если админ аврега другой человек,
# чем root этого компьютера
# MAILTO="avreg-admin@xxx.xx"

*/1 * * * * root [ -x '/etc/avreg/scripts/check-cams.sh' ] && /etc/avreg/scripts/check-cams.sh > /dev/null

Если какой-то из-них был создан ранее чем 3 минуты, это будет условием сообщения о проблеме с захватом.

cat /etc/avreg/scripts/check-cams.sh

#!/bin/sh
 
set -e
 
# считать проблемой если с камерой нет связи более чем столько минут
MAX_DOWN_MINUTES=${1:-3}
 
for f in `find /tmp -name "cam_*_*_failed.txt" -a -mmin +$MAX_DOWN_MINUTES 2>/dev/null`; do
        cat "$f" >&2
        rm -f "$f"
done

Контроль процесса записи роликов на диск.

Самой частой причиной блокировки процесса записи роликов от камер является сбой захвата с камеры, причём прерванная запись будет автоматически возоблена при восстановлении захвата с камер.

Однако, есть ещё 2 причины, блокировку записи, при которых, нужно снимать „вручную“:

  1. системные ошибки записи в файл, например, когда закончилось свободное место на архивном устройстве (чистильщик архива не успевает отрабатывать или ещё-что), повреждена структура файловай системы и т.п.;
  2. несовместимость настроек записи (форматы, кодеки, возможность перекодирования) и параметров исходного медиапотока, например, если запретить декодирование (decode_video=Выкл) mjpg потока с камеры и задать перекодирование в mpeg4 (rec_vcodec=mpeg4).

Функционал контроля за записью реализуем аналогично контролю состояния захвата с камер, также на основе файлов-флагов.

/etc/avreg/scrips/event-collector

on_record_cmd() {
   ...
   if [ "$action_id" = "3" ]; then
      # если событие - останов записи
      if [ "$subsystem_id" != "2" -a "$subsystem_id" != "20" ]; then
         # и инициировано оно не детектором и не командой http cgi api
         # создаём файл-признак останова записи
         echo "cam[${cam_nr}]: ${dt_event}: ${textmsg}" >> "/tmp/cam_${cam_nr}_recording_failed.txt"
      fi
   else
      # удаляем файл-признак
      rm -f "/tmp/cam_${cam_nr}_recording_failed.txt" 2>/dev/null
   fi
 
   log debug "cam[$cam_nr]: $module_name/$media_str: $textmsg at $dt_event"
}

Практика.

Настройка почты.

Настройка почты состоит из 2-х этапов:

  1. установка MTA (mail transfer agent) - Exim4, Postfix, nullmailer и т.п.,
  2. настройка MTA.

В качестве MTA в Debian/Ubuntu рекомендуется Exim4, который скорее всего будет уже установлен. Если нет, то его лёгкую версию можно установить командой:

$ sudo apt-get install exim4-daemon-light

Далее, внимательно читаем статьи ниже и выполняем инструкции, описанные во 2-м документе в разделе «Using Exim4 to Send Messages through Gmail».

Примечание:

  • в 2-м документе есть опечатка - указывая исходящий smarthost для отправки почты вместо «smtp.gmail.com::587» введите «smtp.gmail.com:587» (с одним двоеточием);
  • если вы используете другой почтовый аккаунт для отправки почты, не Gmail, то воспользуйтесь рекомендациями вашего почтового сервера и адекватно замените все значения, содержащие gmail.com.
  • допишите в конец /etc/email-addresses
    root: avreg-admin@xxx.xx
    root@localhost: avreg-admin@xxx.xx
    root@ХОСТНЕЙМ: avreg-admin@xxx.xx
    root@ХОСТНЕЙМ.localdomain: avreg-admin@xxx.xx
    

После выполнения команд, указанных после «Finally, run» 2-го документа проверьте настройку MTA, отправив тестовое письмо root-у, которое вы должны получить в почтовый ящик avreg-admin@xxx.xx:

$ echo "test body" | mail -s test root

Установка скриптов.

Cкопируйте в каталог /etc/avreg/scripts/ следующие скрипты:

  • event-collector (или модифицируйте свой рабочий вариант, если вы его уже использовали),
  • check-cams.sh.
$ cd /etc/avreg/scripts/

$ sudo cp /usr/share/doc/avregd/examples/event-collector.gz .
$ sudo gunzip event-collector.gz
$ sudo cp /usr/share/doc/avregd/examples/check-cams.sh .
$ sudo chown root:root check-cams.sh
$ sudo chown root:avreg event-collector
$ sudo chmod 0750 event-collector check-cams.sh

# должно получиться так:
$ ls -l
-rwxr-xr-- 1 root root    294 июл 15 12:18 check-cams.sh
-rwxr-xr-- 1 root avreg 13474 июл 25 15:27 event-collector
                  ^^^^^ - не root!

Активируйте использование event-collector в avreg.conf убрав знак комментария перед параметром

/etc/avreg/avreg.conf

$ update-avreg.conf print avregd --strict
avregd {
   include "/etc/avreg/avregd.secret"
   event-collector = "/etc/avreg/scripts/event-collector"
}

Проверьте состояние значения параметра event2pipe в настройках камер в разделе «События» (по умолчанию, в event-collector передаются все события, этого более чем достаточно).

Перезапустите avregd (sudo service avreg restart) и удостоверьтесь в том что event-collector работает, для чего выполнив

ps u -U avreg

поищите процесс(ы) event-collector.

Если процесса(ов) event-collector нет, то см.:

  • /var/log/syslog (Ubuntu) или /var/log/daemon.log (Debian),
  • содержимое файла(ов) /var/log/avreg/evtcoll*.err.

Создайте (или измените) CRON-задание

sudoedit /etc/cron.d/avregd

# на какой адрес присылать уведомление,
# расскоментируйте если админ аврега другой человек,
# чем root этого компьютера
# MAILTO="avreg-admin@xxx.xx"

*/1 *  * * *  root  [ -x '/etc/avreg/scripts/check-cams.sh' ] && /etc/avreg/scripts/check-cams.sh > /dev/null

/etc/cron.d/avregd должен иметь такие права:

$ ls -l /etc/cron.d/avregd
-rw-r--r-- 1 root root 421 июл 15 12:21 /etc/cron.d/avregd

Проверка

Контроль рабочего состояния демона.

Убиваем демон.

$ sudo killall -KILL avregd

В syslog появится подобная строка:

Aug 18 19:06:07 host19 avreg-super: avregd[8651] abnormal termination

А на настроенный e-mail должно прийти письмо с темой «avregd was killed» и временем, когда это случилось в тексте письма.

Обратите внимание, что Ubuntu (сразу) и Debian (макс. через 1 мин.) запустят аварийно завершённый процесс avregd.

Контроль состояния захвата с камер.

Просто выключите какую-либо камеру и не включайте её несколько минут больше чем значение MAX_DOWN_MINUTES (см. выше). После (MAX_DOWN_MINUTES + 1) минут проверьте почту.

файлы-флаги сразу после сбоя захвата

$ ls -l /tmp/
-rw-r--r-- 1 avreg avreg 101 авг.  21 10:55 avregd-cam01-02-cam1_capture_failed.txt

$ cat /tmp/avregd-cam01-02-cam1_capture_failed.txt
cam01-02: cam[1]: 2014-08-21 10:55:28: <-- V: http://127.0.0.1:60001 - connection terminated by peer
cam01-02: cam[1]: 2014-08-21 10:55:33: <-- V: http://127.0.0.1:60001 - connect() failed with errno #111(Connection refused)
Контроль процесса записи роликов на диск.

Проше всего «руками» получить блокировку записи - это установить некорректные параметры записи.

Например, если с камеры захватывается h264 поток, установите

decode_video=Выкл. (раздел Захват)
rec_vcodec=MPEG4 (раздел Запись → Видео)

и restart-аните демон avregd.

Т.к. rawvideo потока нет (декодирование запрещено), то перекодирование h264→MPEG4(h263) невозможно и запись будет заблокирована.

После (MAX_DOWN_MINUTES + 1) минут проверьте почту.

файлы-флаги сразу после блокировки записи

$ ls -l /tmp/
-rw-r--r-- 1 avreg avreg 139 авг.  21 11:01 avregd-cam01-02-cam2_recording_failed.txt

$ cat /tmp/avregd-cam01-02-cam2_recording_failed.txt 
cam01-02: cam[2]: 2014-08-21 11:01:45: (re)start recording disabled on error -> "couldn't attach mpeg4 video stream, see syslog to detail"
manual/applications/monitoring-with-event-collector.txt · Последние изменения: 2014-08-21