FreePBX — это наиболее популярный web интерфейс для настройки серверов на базе Asterisk. FreePBX — это гибкая, модульная система. Предлагает богатый функционал по настройке станций. Самое приятное — это проект с открытым исходным кодом.  На практике, часто возникает необходимость решить уникальную задачу, для которой не достаточно типовых возможностей FreePBX. В рамках статьи, я опишу возможности расширения функционала дополнительными модулями.
Опишу процесс разработки нового модуля…  Тиражируемый продукт — в случае, если поддерживать приходится несколько однотипных АТС и одна и та же фича необходима многим. К примеру (обратный звонок, интеграция с битрикс чатом) Удобство настройки — загрузить модуль проще и быстрее, чем править конфиги вручную. Один раз заложили логику, и каждая последующая инсталляция требует меньше времени. Снижаем шанс на ошибку — базовые настройки обычно производим на тестовом стенде, при переносе в продакшн могут возникнуть сложности с зависимостями. Мы можем поместить все необходимые файлы в наш модуль и установить их вместе с ним.  БОЛЬШИЕ Возможности — разработка модулей позволяет более гибко / тонко настроить АТС, к примеру возможно переопределять diaplan, или добавлять в существующий свои строчки с точностью до номера приоритета. Asterisk может использовать базу данных для хранения истории звонков.
FreePBX — взаимодействует с базой данных, сохраняет и получает настройки. Модули FreePBX могут обращаться к базе данных для анализа истории звонков.  Одна из функций FreePBX — создание конфигурационных файлов и поставка AGI скриптов Asterisk. FreePBX знает все о системных директориях Asterisk, может управлять Asterisk. Основа FreePBX — модуль “FreePBX Framework” (далее просто Framework). По своей сути — это модуль управляющий другими модулями. Framework предоставляет базовый web интерфейс: Каждый модуль может расширить функционал FreePBX, к примеру добавить конфиги и расширить web интерфейс.
Все модули существенно зависят от Framework, и могут совсем не зависить от прочих модулей. Примеры модулей: После того, как мы что либо изменили в настройках FreePBX появляется кнопка “Apply Config”. На схеме ниже описан процесс генерации конфигурационных файлов. module.xml
В этом файле описываются основные свойства модуля.
Наиболее важные свойства: Структура файла детально описана в документации.
Пример файла приведен ниже: install.php В этом файле описываем инструкции по установке модуля.
В этом скрипте возможно обратиться к “global” переменным FreePBX. Переменная “$db” позволяет взаимодействовать с базой данных FreePBX.
Пример создания таблицы для хранения настроек модуля: Обратите внимание, что нет необходимости указывать параметры подключения к базе данных.  Переменная “$amp_conf” содержит параметры конфигурации FreePBX (обычно определены в /etc/freepbx.conf  и в /etc/amportal.conf). Пример использования: Функция out() позволяет выводить информацию о ходе установки модуля в окно сообщений: Пример добавления настройки в раздел “Settings — Advanced Settings”: При установке модуля содержимое директорий будет скопировано в соответсвующие директории asterisk: Скрипт описывает инструкции по удалению модуля. Чистим за собой.  В примере выше описан пример использования глобальной функции с именем “sql”. В качестве аргумента передаем тест запроса для удаления таблицы.  Кроме того, используется интересный вызов “defined('FREEPBX_IS_AUTH')”, проверка авторизован ли пользователь. Лучше ее использовать для всех php скриптов.  Все скрипты и файлы с именем index.php публикуются на web сервере и доступы извне. Если пользователь попробует обратиться к скрипту без авторизации — получит уведомление “No direct script access allowed” В этом файле мы реализуем функции нашего модуля, ключевые возможности: В functions.inc.php могут быть определены hook-функции, которые будут вызваны модулем framework при генерации конфигов.  Такие функции обычно именуются следующим образом: Определим dialplan в extensions_additional.conf Функция “get_config” будет вызвана при создании конфигурационных файлов, когда будет нажата кнопка “Apply Config”.
В качестве параметра будет передана строка “$engine” — имя движка, обычно “asterisk”.  Для создания dialplan использовалась глобальная переменная “$ext”, содержит экземпляр класса “extensions”, класс определен в файле “/var/www/html/admin/libraries/extensions.class.php” и предоставляет нам набор инструментов для генерации dialplan. Результат работы будет добавлен в extensions_additional.conf: Классы “ext_agi” и “ext_hangup” также определены в “extensions.class.php”. Результат работы: Для подключения дополнительного файла использовал хитрость в виде переноса строки — другого решения пока нет. Получение глобальной настройки FreePBX. Используем функционал модуля core: Пожет появиться потребность создать свои конфигурационные файлы.
Для этих целей мы должны определить клас с именем “ModuleName_conf”. Пример класса приведен ниже: Метод “get_filename” возвращает массив файлов, которые будут созданы.
Метод “generateConf” принимает в качестве параметра имя файла и возвращает текстовое содержимое этого файла.  Каждый, кто работал с FreePBX видел поле Set Destination. Каждый модуль может добавлять свои точки назначения. Для этого необходимо определить две процедуры: Функция “pt1ctraining_getdest” должна вернуть массив с одним значением “стока”. Формат “array('ModuleName,'.$exten.',1')” Функция “pt1ctraining_destinations” должна вернуть массив с точками назначения.
Каждый элемент массива — ассоциативный массив с двумя ключами:
'Destination' — содержит Goto совместимые параметры, в дальнейшем перенаправление будет осуществляться в dialplan средствами Goto
'Description' содержит название точки назначение, именно так будет представлено значение пользователю В директории модуля может быть определено сколько угодно файлов с именем формата “page.ModuleName.php”, пример “page.pt1ctraining.php”.  В этих файлах мы можем определить форму html для взаимодействия с пользователем.  Чтобы web интерфейс “узнал” о существовании страницы, мы должны указать на идентификатор страницы в файле “module.xml” в теге “menuitems” тегом с именем страницы: Тут все просто, упаковка модуля должна быть произведена средствами tar: Если модуль подготавливается для FreePBX 12+ то желательно подписать модуль цифровой подписью разработичка, подробности описаны в официальной документации.  Подписать модуль можно используя пакет утилит devtools: Где, “pt1ctraining” — каталог с модулем.  FreePBX интересная платформа. Предлагает обширный функционал для настройки АТС.
Для случая, когда фукнционала FreePBX не достаточно есть возможность расширить набор функции средствами дополнительного модуля.  Собственный модуль позволит получить более тонкую настройку АТС: В качестве источников знаний рекомендую использовать: Программист