artem
14.11.2016
1587

Скрипты для записи звука на множестве каналов 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

 
avatar
  Подписаться  
Уведомление о

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

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

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

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

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

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices