Asterisk Call Files

Asterisk Call Files

В сегодняшней статье пойдет речь об Asterisk Call Files (файлах-вызовах или .call файл). Поехали.

Предисловие

У Asterisk есть возможность инициировать вызовы без использования стандартных методов, таких как Dialplan (маршрутизация), AMI (интерфейс менеджера) или интерфейс буферизации. Используя метод вызова файла, вы должны предоставить Asterisk следующую информацию:
  • Как выполнить вызов, используя приложение Dial()
  • Что делать в случае ответа на вызов

В .call файлах вы отправляете эту информацию, создавая файл с требуемым синтаксисом и помещая его в директорию буферизации outgoing, который по умолчанию находится в /var/spool/asterisk/outgoing/ (путь настраивается в asterisk.conf).

Модуль pbx_spool.so наблюдает за буферизацией напрямую, либо использует систему уведомлений о событиях средствами операционной системой, такими как inotify или kqueue или путем опроса каталога каждую секунду когда одна из этих систем уведомлений недоступна. При появлении нового файла, Asterisk инициирует новый вызов на основе содержимого этого файла.

Создание файлов в каталоге spool
Не пишите и не создавайте файл-вызова непосредственно в каталоге outgoing, но всегда создавайте файл в этой же файловой системе, используя другой каталог или домашнюю директорию, а затем скопируйте его в каталог outgoing, иначе Asterisk может не прочитать файл или прочитать его частично.
Про NFS
По умолчанию Asterisk предпочитает использовать inotify или kqueue там, где они доступны. Когда каталог буферизации (spool) находится на удаленном сервер и монтируется через NFS, inotify метод работать не будет. Но вы можете заставить Asterisk использовать старый метод опроса, передав флаг –without-inotify в configure во время компиляции (например ./configure –without-inotify).

Синтаксис вызова Asterisk Call Files

Файл вызова состоит из параметров <Key>: <value>; в каждой строке.

Комментарии обозначаются символом ‘#‘, который начинается строку или следует за символом пробела или табуляции. Чтобы соответствовать файлам конфигурации в Asterisk, комментарии также могут указываться через ‘;‘. Однако многострочные комментарии (;– –;) в файлах-вызова не поддерживаются. Точка с запятой может быть экранирована обратным слэшем.

Следующие пары ключе и значений используются для указания способа установки вызова:
  • Channel: <channel> – Канал, используемый для нового вызова, в виде технология/ресурс, как в приложении Dial(). Это значение является обязательным.
  • Callerid: <callerid> – Идентификатор вызывающего абонента.
  • WaitTime: <number> – Сколько секунд ждать ответа до отбоя вызова (цикл кольца). По умолчанию – 45 секунд.
  • MaxRetries: <number> – Количество попыток перед отбоем, не считая первой попытки. По умолчанию =0 (не повторять, если первый вызов не успешный).
  • RetryTime: <number> – Сколько секунд ждать, прежде чем повторять попытки. По умолчанию значение – 300 секунд (5 минут).
  • Account: <account> – Код учетной записи для вызова. Это значение будет присвоено для CDR (поле accountcode).

В случае ответа на вызов, есть два варианта:

  1. Выполнить одно приложение или
  2. Выполнить Dialplan в указанном контексте/расширении/приоритете (Context.Extension/Priority).

Для предотвращения отсутствия CDR записей при запуске .call файлов используйте параметры Context/Extension/Priority в .call файле вместо указания приложения для выполнения: Application/Data. Также совершайте вызовы через локальный канал вместо непосредственного указания имени канала для вызова (SIP-транк). В противном случае Asterisk не будет выполнять ту часть логики, которая отвечает за протоколирование CDR записей. Также используйте статический CallerID в .call файле для идентификации и отчетности в CDR. Лучшим решение этой задачи будет указание CallerID в переменной канала, при помощи параметра ‘Set:‘ в .call файле с последующим занесением в поле ‘Userfield‘ CDR записи совершенного вызова.

Пример #1: Совершаем вызов на номер 84951234567 с SIP телефона с номером 101

Channel: SIP/101
MaxRetries: 1
RetryTime: 60
WaitTime: 30
#
# Предполагается, что обработка исходящих вызовов происходит в контексте [outgoing]
#
Context: outgoing
Extension: 84951234567
Priority: 1

Пример #2: Для внутреннего или внешнего номера подключаем использование AGI скрипта.

Channel: Local/1000@from-internal
MaxRetries: 0
RetryTime: 15
WaitTime: 15
Application: AGI
Data: myagiscript.agi

Чтобы выполнить приложение:

  • Application: <appname> – Приложение для выполнения.
  • Data: <args> – Аргументы приложения

Чтобы запустить выполнение приложений в диалплане:

  • Context: <context> – Контекст в диалплане.
  • Extension: <exten> – Расширение в указанном контексте.
  • Priority: <priority> – Приоритет указанного расширения (Числовое обозначение или метка).
  • Setvar: <var=value> – Вы также можете назначить значение для переменных, которые будут доступны для канала, как если бы вы выполняли Set(var=value) в диалплане. Может быть несколько Setvar.

Обработка файла-вызова (Asterisk call files) заканчивается, когда вызов отвечен и завершен, когда на начальную попытку и последующие повторные попытки не было получено ответа или файл-вызова не может быть прочитан или с ошибками.

Чтобы указать, что делать с файлом-вызова в конце обработки:

  • Archive: <yes|no> – Если “нет”, файл вызова удаляется. Если установлено “да”, файл-вызова перемещается в подкаталог outgoing_done. По умолчанию используется удаление файла.

Если файл-вызова архивируется, Asterisk добавит в файл-вызова:

  • Status: <exitstatus> – Используются варианты “Истек“, “Завершено” или “Сбой“.

Другие строки, созданные Asterisk:

Asterisk отслеживает сколько попыток вызова было совершено и добавляет к файлу-вызова следующие пары ключей в форме:

StarRetry: <pid> <retrycount> (<time>)
EndRetry: <pid> <retrycount> (<time>)

К основному идентификатору процесса (pid) процесса Asterisk, номером повтора и времени начала и окончания попыток в формате time_t.

Используемые каталоги:

  • <astspooldir>/outgoing – Исходящий каталог куда помещаются файлы для обработки.
  • <astspooldir>/outgoing_done – Архивный каталог
  • <astspooldir> – Указан в asterisk.conf (По умолчанию /var/spool/asterisk/)

Как выполнить .call файл в определенное время

Если дата модификации .call файла больше текущей даты на сервере, то Asterisk отложит обработку данного файла до тех пор, пока время модификации этого файла не совпадет или не станет больше текущего времени.

Для изменения времени создания файла используйте параметр ‘mtime’, используя команду ‘touch‘ и переместите в каталог spool. Шаблон даты: ГГММДДЧЧММ.СС

Пример #3: Выставим дату создания файла 25.05.2018 07:30:55
~$ date
Вт май 22 11:31:15 MSK 2018
~$ cd /var/spool/asterisk/outgoing
~$ touch -t 1805250730.55 /var/spool/asterisk/tmp/blah
~$ mv /var/spool/asterisk/tmp/blah .
~$ lk -l blah
Пример #4: Скрипт на Bash – Выполнить .call файл через 100 секунд
# Получаем текущее время в секундах
NOW=`date +%s`
# добавляем к ней 100 секунд
let NOW=$NOW+100
# создаем timestamp (строку с датой и временем), которую потом используем в команде 'touch -t' (между %M. %S не должно быть пробелов)
TOUCH_TMSP=`date -d "1970-01-01 $NOW sec GMT" +%Y%m%d%H%M. %S`
# выполняем команду “touch”
touch -t $TOUCH_TMSP blah

Мы рассказали об Asterisk Call Files, просьба ваши замечания оставить в комментариях. Спасибо!