artem
14.11.2016
2816

Скрипты для записи звука на множестве каналов DAHDI

В данной статье рассказывается о назначении и применении утилиты dahdi_monitor, которая позволяет записывать звук с одного из каналов DAHDI в файл, что бывает необходимо при диагностике определенных проблем с DAHDI.

В состав набора инструментов dahdi-tools входит утилита dahdi_monitor, которая позволяет записывать звук с одного из каналов DAHDI в файл, что бывает необходимо при диагностике определённых проблем с DAHDI. Если Вы имеете дело с большим количеством аналоговых линий или с потоком E1, или проблема имеет плавающий характер и нужно записывать звук в течение нескольких часов/дней, чтобы поймать проблему, функционала утилиты dahdi_monitor не достаточно. В этой статье будет приведён набор скриптов для удобной записи звука на множестве каналов DAHDI. Для удобства использования можно сохранить все приведённые скрипты в директории /usr/local/bin.

ПРИМЕЧАНИЕ: при использовании данного набора скриптов для постоянной записи рекомендуется следить за количеством свободного места на жёстком диске (либо вести запись в отдельный раздел жёсткого диска). Зависание процессов dahdi_monitor маловероятно, но не исключено, в случае зависания, нужно убить процессы dahdi_monitor вручную, иначе они заполнят раздел жёсткого диска, в который происходит запись.

Скрипт dahdi_massmonitor

Ниже приведён код скрипта dahdi_massmonitor (основной скрипт, используемый для начала и остановки записи звука на каналах DAHDI):

#!/bin/bash
export PATH=»/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin»
ALL_CHANS_MIN=1
ALL_CHANS_MAX=120
SCR_PREFIX=dahdi_mon_
CHANS=»»
STOP=»»
while [ $# -gt 0 ]; do
case $1 in
stop) STOP=»stop»; shift ;;
*)
if [[ ! $1 =~ ^[0-9]+$ ]]; then
if [[ $1 =~ ^([0-9]+)-([0-9]+)$ ]]; then
[ ${BASH_REMATCH[1]} -gt ${BASH_REMATCH[2]} ] && echo -e «$USAGEnChannel (range) «$1″ is invalid» && exit 1
else
echo -e «$USAGEnChannel (range) «$1″ is invalid»
exit 1
fi
fi
CHANS=»$CHANS $1″
shift
;;
esac
done
[ ! «$CHANS» ] && [ ! «$STOP» ] && exit 1
SCREENS=»$(screen -list)»
if [ «$STOP» ]; then
for (( i=$ALL_CHANS_MIN; i<=$ALL_CHANS_MAX; i++ )); do
(
IND=$i
[ $IND -lt 10 ] && IND=»0$IND»
while read scr; do
screen -S «$(echo $scr | awk ‘{print $1}’)» -X quit >/dev/null 2>/dev/null
done <<<«$(grep -E «$SCR_PREFIX${IND}[[:space:]]» <(echo «$SCREENS»))»
) &
done
disown -h 2>/dev/null
exit
fi
BASE_DIR=»/var/log/dahdi_mon»
OUT_DIR=»$BASE_DIR/$(date +%m).$(date +%d)»
for chan in $CHANS; do
RE=’^([0-9]+)(-([0-9]+))?$’
if [[ $chan =~ $RE ]]; then
from=${BASH_REMATCH[1]}
to=${BASH_REMATCH[3]}
[ ! «$to» ] && to=$from
for (( i=$from; i<=$to; i++ )); do
(
IND=$i
[ $IND -lt 10 ] && IND=»0$IND»
if grep -q $SCR_PREFIX${IND} <<<«$(screen -list)»; then
while read scr; do
screen -S «$(echo $scr | awk ‘{print $1}’)» -X quit >/dev/null 2>/dev/null
done <<<«$(grep -E «$SCR_PREFIX${IND}[[:space:]]» <(echo «$SCREENS»))»
fi
mkdir -p «$OUT_DIR/$IND»
FNAME_PREFIX=»$(date +%H:%M:%S)»
screen -dmS $SCR_PREFIX${IND} dahdi_monitor $IND -f «$OUT_DIR/$IND/${FNAME_PREFIX}_$IND.raw»
) &
done
fi
done
disown -h 2>/dev/null

Скрипт dahdi_massmonitor принимает в качестве параметров номера каналов DAHDI (можно указывать диапазоны каналов) и запускает для каждого указанного канала утилиту dahdi_monitor внутри screen. Если запись на каких либо из указанных каналов уже была ранее включена с помощью скрипта dahdi_massmonitor, то запись звука на этих каналах будет остановлена и начата заново в другой файл (таким образом можно проворачивать файл записи через равные промежутки времени с помощью cron). Если передать в качестве параметра значение «stop», запись будет прекращена на всех каналах.
В директории /var/log/dahdi_mon (переменная BASE_DIR), создаются поддиректории с именами вида <месяц>.<день>, в этих поддиректориях создаются поддиректории, названные номерами каналов, в них сохраняются файлы записей, сделанных на соответствующих каналах.
В переменной ALL_CHANS_MAX в начале скрипта указан наибольший номер канала, на котором может быть включена запись, увеличьте это значение, если требуется.

Примеры использования скрипта:
Включение записи на каналах 5-10, 15 и 17 (если выполнить эту команду снова, файлы записей будут провёрнуты):

dahdi_massmonitor 5-10 15 17

Прекращение записи на всех каналах:

dahdi_massmonitor stop

Для постоянной записи можно добавить следующую строку в crontab (файлы записи будут проворачиваться каждые 15 минут):

*/15 * * * * /usr/local/bin/dahdi_massmonitor 5-10 15 17

Скрипт dahdi_conv_raw

dahdi_monitor надёжно сохраняет звук только в сыром виде (raw-файлы), в случае записи звука сразу в wav, возможно сохранение повреждённых файлов.
Ниже приведён код скрипта dahdi_conv_raw, он конвертирует полученные raw-файлы в wav с помощью утилиты sox (для работы скрипта также требуется утилита lsof, с помощью которой проверяется, завершена ли запись данных в файл).

#!/bin/bash
export PATH=»/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin»
BASE_DIR=»/var/log/dahdi_mon»
for file_raw in $(find $BASE_DIR/ -name «*.raw» -mmin -30); do
file_wav=»$(echo $file_raw | sed ‘s|.raw$|.wav|’)»
filename=»$(echo «$file_raw» | rev | cut -f 1 -d / | rev)»
if [ ! -f «$file_wav» ] && ! grep -q «$filename» <(lsof -c dahdi_mon -c sox); then
sox -r 8000 -b 16 -s -c 1 «$file_raw» «$file_wav»
rm -f «$file_raw»
fi
done

Просто добавьте выполнение этого скрипта в crontab:

*/10 * * * * /usr/local/bin/dahdi_conv_raw

Скрипт del_old_dahdi_raws

При ведении постоянной записи необходимо периодически удалять старые файлы записей. Ниже приведён код скрипта del_old_dahdi_raws, скрипт удаляет из директории /var/log/dahdi_mon (переменная RAW_DIR) файлы старше 8-ми часов (переменная MINS_TO_KEEP, значение в минутах).

#!/bin/bash
MINS_TO_KEEP=480
RAW_DIR=/var/log/dahdi_mon
[ -d «$RAW_DIR» ] && /usr/bin/find $RAW_DIR -type f -mmin +$MINS_TO_KEEP -exec rm -f {} ;
[ -d «$RAW_DIR» ] && /usr/bin/find $RAW_DIR -type d -empty -exec rmdir {} ; >/dev/null 2>&1

Этот скрипт тоже нужно добавить в crontab:

*/30 * * * * /usr/local/bin/del_old_dahdi_raws

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.