Создание собственного контекста и простых сценариев
Мы подошли к моменту, когда графический интерфейс FreePBX перестает быть ограничителем ваших возможностей. До этого момента мы использовали готовые кирпичики: настраивали внутренние номера и управляли звуковыми приветствиями через меню. Однако в жизни администратора АТС часто возникают задачи, которые невозможно решить стандартными кнопками. Именно здесь на сцену выходит ручной диалплан — написание логики обработки вызовов напрямую в конфигурационных файлах.
Зона безопасности: extensions_custom.conf
В экосистеме FreePBX файлы разделены по ролям. Файлы extensions.conf и те, что заканчиваются на _additional.conf, принадлежат системе. FreePBX перезаписывает их каждый раз, когда вы нажимаете «Apply Config». Любые правки в них исчезнут.
Для ваших сценариев зарезервирован файл extensions_custom.conf. Это «безопасная гавань»: FreePBX никогда не трогает этот файл, но автоматически подключает его содержимое к общему диалплану. Здесь вы получаете полный контроль над вызовом, используя приложения Dial, Answer и Playback.
Анатомия собственного контекста
Диалплан Asterisk состоит из контекстов — логических блоков, которые изолируют правила обработки звонков друг от друга. Собственный контекст — это ваш именованный раздел, где вы описываете маршрут вызова.
Как показано на Схеме 1, контекст работает как контейнер для инструкций.
Синтаксис прост: имя контекста пишется в квадратных скобках. Внутри создаются экстеншены (номера или шаблоны) по формуле:
exten => номер,приоритет,приложение(параметры)
Разбор компонентов на примере
Создадим сценарий, который проигрывает приветствие и вешает трубку:
[my-first-scenario]
; Это наш собственный контекст
exten => s,1,Answer()
exten => s,n,Playback(hello-world)
exten => s,n,Hangup()
- [my-first-scenario] — название контекста. Используйте латиницу и понятные имена.
- s — специальный экстеншен (Start). Срабатывает, когда вызов входит в контекст без конкретного добавочного номера.
- 1 — первый приоритет. Точка входа.
- n — (Next). Автоматически назначает следующий порядковый номер. Это стандарт: так вы легко добавите строку в середину кода, не переписывая цифры вручную 🛠️
Важно: Всегда завершайте сценарий приложением
Hangup(). Иначе канал может «зависнуть», занимая ресурсы сервера и лицензии.
Практический кейс: Сервисная проверка
Создадим службу, которая сообщает абоненту его номер и время. Откройте /etc/asterisk/extensions_custom.conf через nano или vim и добавьте:
[service-info]
exten => *999,1,Answer()
exten => *999,n,Playback(vm-from)
exten => *999,n,SayDigits(${CALLERID(num)}) ; Озвучиваем номер звонящего
exten => *999,n,Wait(1)
exten => *999,n,SayUnixTime(, , kM) ; Озвучиваем часы и минуты
exten => *999,n,Hangup()
Здесь переменная ${CALLERID(num)} динамически подставляет номер звонящего. Мы разберем переменные позже, сейчас важно понять принцип: ручной диалплан позволяет «вытащить» любые данные о звонке.
Применение изменений через CLI
Asterisk хранит диалплан в оперативной памяти. Чтобы он увидел правки в файле, нужно обновить конфигурацию через консоль (CLI):
- Войдите в консоль:
asterisk -rvvv - Перезагрузите диалплан:
dialplan reload - Проверьте результат:
dialplan show service-info
Если консоль вывела структуру вашего кода — синтаксис верен.
| Что проверить, если не работает | Почему это важно |
|---|---|
| Права доступа | Файл должен принадлежать пользователю asterisk (ls -l). |
| Синтаксис | Лишняя скобка или пропущенная запятая «сломают» весь контекст. |
| Комментарии | Используйте только ;. Символ # в диалплане работает иначе. |
Мы создали изолированные сценарии. Сейчас на них нельзя позвонить с обычного телефона, так как FreePBX о них еще не знает. В следующей теме мы научимся «наводить мосты» между вашим кодом и графическим интерфейсом.
Понравился урок?
Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей
Продолжить в Telegram