Необходимо контролировать 3 процесса/состояния:
В случае обнаружения проблем необходимо уведомить администратора системы на e-mail.
В рамках этой статьи описывается решения с использованием штатного инструмента - «Внешний сборщик/обработчик событий (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 причины, блокировку записи, при которых, нужно снимать „вручную“:
Функционал контроля за записью реализуем аналогично контролю состояния захвата с камер, также на основе файлов-флагов.
/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-х этапов:
В качестве MTA в Debian/Ubuntu рекомендуется Exim4, который скорее всего будет уже установлен. Если нет, то его лёгкую версию можно установить командой:
$ sudo apt-get install exim4-daemon-light
Далее, внимательно читаем статьи ниже и выполняем инструкции, описанные во 2-м документе в разделе «Using Exim4 to Send Messages through Gmail».
Примечание:
/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/
следующие
скрипты:
$ 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"