Понимание логики генерации extensions_additional.conf
Мы уже знаем, что FreePBX хранит настройки в базе данных и генерирует конфигурационные файлы Asterisk. Сегодня мы разберём один из ключевых файлов, который получается в результате этой генерации — extensions_additional.conf. Понимание его структуры и логики создания критически важно для эффективного администрирования.
extensions_additional.conf: Сердце диалплана FreePBX
extensions_additional.conf — это главный файл диалплана Asterisk, который создаёт FreePBX. Он содержит все контексты, экстеншены и логику маршрутизации вызовов, которые вы настраиваете через графический интерфейс FreePBX.
Важно: Этот файл полностью генерируется FreePBX. Любые ручные изменения в
extensions_additional.confбудут перезаписаны при следующем применении конфигурации через FreePBX GUI. Именно поэтому для кастомной логики мы будем использоватьextensions_custom.conf, о котором поговорим позже.
Как FreePBX генерирует диалплан
FreePBX формирует extensions_additional.conf на основе данных из своей базы MySQL/MariaDB и внутренних шаблонов. Каждый модуль FreePBX (например, "Extensions", "Trunks", "Inbound Routes") имеет свои шаблоны, которые определяют, как его настройки преобразуются в синтаксис диалплана Asterisk.
Давайте посмотрим, как FreePBX генерирует записи для обычного внутреннего номера (экстеншена).
Представьте, что вы создали в FreePBX внутренний номер 101 с именем Ivanov и паролем secretpass. FreePBX сохранит эти данные в базе, а затем, при применении конфигурации, сгенерирует примерно такой блок в extensions_additional.conf:
[ext-local]
include => ext-local-custom
include => ext-local-sd
include => ext-local-sip
; ... другие include ...
[ext-local-sip]
; Generated by FreePBX
exten => 101,1,Set(__RINGTIMER=${RINGTIMER})
exten => 101,n,Macro(exten-vm,novm,101,101,1,0,0)
; ... другие строки для обработки вызова ...
; PJSIP Extension 101
[pjsip-extensions]
exten => 101,1,Set(__PJSIP_DIAL_CONTACTS=${PJSIP_DIAL_CONTACTS})
exten => 101,n,GoSub(app-pjsip-custom-post-dial,s,1())
exten => 101,n,Dial(PJSIP/101,20,Ttr)
exten => 101,n,GosubIf($["${DIALSTATUS}" = "NOANSWER"]?app-blackhole,s,1())
exten => 101,n,Hangup()
Разбираем пример:
[ext-local]: Один из основных контекстов для внутренних номеров. Он включает другие контексты, что позволяет модульно организовывать диалплан.exten => 101,1,Set(__RINGTIMER=${RINGTIMER}): Строка диалплана.exten => 101: Определяет экстеншен101.1: Приоритет выполнения.Set(__RINGTIMER=${RINGTIMER}): Приложение Asterisk, устанавливающее переменную.
Macro(exten-vm,novm,101,101,1,0,0): Вызов макроса FreePBX, который реализует логику обработки вызова (голосовая почта, переадресация и т.д.).[pjsip-extensions]: Контекст, специфичный для PJSIP-экстеншенов.Dial(PJSIP/101,20,Ttr): ПриложениеDial, которое пытается установить соединение с PJSIP-устройством101в течение 20 секунд. ФлагиTtrпозволяют передавать и перехватывать вызов.
Аналогично, при создании транка (например, SIP-транка к провайдеру), FreePBX сгенерирует соответствующие контексты и экстеншены для обработки входящих и исходящих вызовов.
Жизненный цикл конфигурации FreePBX
- Изменения в GUI: Вы меняете настройки через веб-интерфейс FreePBX.
- Сохранение в БД: FreePBX записывает изменения в свою базу данных (MySQL/MariaDB).
- "Apply Config": Нажатие кнопки "Apply Config" запускает процесс генерации.
- Генерация файлов: PHP-скрипты FreePBX читают данные из БД и, используя шаблоны, формируют
extensions_additional.confи другие файлы (например,sip_additional.conf,pjsip_additional.conf). - Перезагрузка Asterisk: FreePBX отправляет Asterisk команду на перезагрузку диалплана (
dialplan reload) или полную перезагрузку, чтобы применить новые настройки.
Совет: Хотите понять, как FreePBX генерирует конкретный элемент диалплана? Найдите его в
extensions_additional.confпосле применения конфигурации. Это поможет вам увидеть логику FreePBX "изнутри".
Понимание того, как FreePBX строит extensions_additional.conf, даёт вам мощный инструмент для диагностики и понимания поведения вашей АТС. Вы видите, как ваши действия в GUI превращаются в реальные команды Asterisk.
Теперь, когда мы понимаем, как FreePBX генерирует основной диалплан, пришло время узнать, как мы можем добавлять свою собственную логику, не опасаясь, что FreePBX её перезапишет. В следующем разделе мы рассмотрим, как работать с extensions_custom.conf.