Посты с тэгом: FreePBX

[stextbox id=’info’]ИНФОРМАЦИЯ. Немного актуализировал статью под новую версию Debian, чтобы установка из статьи проходила в режиме copy-paste без ошибок.[/stextbox]

Рассмотрим как установить FreePBX 14 в связке с Asterisk 18 на Debian 10 Buster.

 

Подготовка системы

Перед началом установки обновляем систему до актуального состояния:

apt-get update && apt-get upgrade -y

Устанавливаем необходимые зависимости:

apt-get install build-essential linux-headers-`uname -r` apt-transport-https bison flex curl sox libncurses5-dev libssl-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git unixodbc-dev uuid uuid-dev libasound2-dev libogg-dev libvorbis-dev libicu-dev libcurl4-openssl-dev libical-dev libneon27-dev libspandsp-dev subversion libtool-bin python-dev unixodbc dirmngr sudo apache2 mariadb-server mariadb-client default-libmysqlclient-dev -y

[stextbox id=’alert’]ВНИМАНИЕ. Обязательно перезагружаем систему и после этого продолжаем установку.[/stextbox]

 

Устанавливаем PHP версии 5.6 (для корректной работы FreePBX fwconsole):

curl https://packages.sury.org/php/apt.gpg | apt-key add -
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/deb.sury.org.list
apt-get update && apt-get install php5.6 php5.6-curl php5.6-cli php5.6-mysql php5.6-mbstring php5.6-gd php5.6-xml php-pear -y

Устанавливаем NodeJS :

curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
apt-get install nodejs -y
pear install Console_Getopt

Устанавливаем поддержку MariaDB ODBC

wget https://downloads.mariadb.com/Connectors/odbc/latest/mariadb-connector-odbc-3.1.9-debian-buster-amd64.tar.gz
tar -zxvf mariadb*
cp -v mariadb-connector-odbc-3.1.9-debian-buster-amd64/lib/mariadb/libmaodbc.so /usr/lib/x86_64-linux-gnu/odbc/

[stextbox id=’alert’]ВНИМАНИЕ. На момент написание статьи версия MariaDB ODBC — 3.1.9, поэтому обращаем внимание на случай ошибок и при необходимости корректируйте версионность. Последние версии можно посмотреть на оф. сайте — https://downloads.mariadb.com/Connectors/odbc/latest/.[/stextbox]

Рассмотрим как реализовать доступ к FreePBX GUI через HTTPS. Все действия производились на FreePBX установленный на Debian 9 Stretch (как установить можно почитать тут) и Apache.

 

Любым удобным вам способом копируем сертификат, закрытый ключ, промежуточные + корневой сертификат в систему (как это сделать через SSH можно почитать тут). Так как сертификатом будет пользоваться веб-сервер Apache, то не забываем прописать на файлы сертификатов соответствующие права. Я выставляю такие права доступа на файлы сертификатов:

chown root:www-data {путь к файлу}
chmod 640 {путь к файлу}

 

Включаем модуль SSL в Apache:

a2enmod ssl

 

Конфигурация виртуального хоста. Приводим дефолтный вирт. хост /etc/apache2/sites-available/000-default.conf к виду:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine On
        SSLCertificateFile /etc/ssl/crt.crt
        SSLCertificateKeyFile /etc/ssl/key.key
        SSLCACertificateFile /etc/ssl/crt-ca.crt
</VirtualHost>

[stextbox id=’warning’]ВНИМАНИЕ. Обращаю внимание что в SSLCertificateFileSSLCertificateKeyFileSSLCACertificateFile указываем свой путь к файлам.[/stextbox]

Многие пользователи просили сделать возможность переадресации вызовов на мобильный при установке DND (do not disturb) режима на рабочем телефоне. Так как DND режим не предполагает переадресации, то пришлось свою обработку для этого режима.

 

Все ниже описанные действия производились на Asterisk 16 + FreePBX 14.

 

В итоге добавлена возможность активации\де-активации DND режима по звонку самому себе (на всякий слушай, вдруг кому будет так удобней), возможность задание переадресации для конкретных внутренних номеров (не всем пользователям нужно такое поведение DND режима).

 

В файл /etc/asterisk/extentions_custom.conf добавляем (постарался подробно описать что делает и как работают секции):

[from-internal-custom]
include => dnd-on-off
include => dnd-transfer-check

exten => _XXXX,1,GoSub(dnd-on-off,s,1,(${EXTEN}))
exten => _XXXX,n,GoSub(dnd-transfer-check,s,1,(${EXTEN}))
exten => _XXXX,n,Goto(from-internal-additional,${EXTEN},1)


[dnd-on-off]
; --------------------------------------------------------------------------
; Включение\Отключение режима DND по звонку самому себе
;
; -- Инструкция:
; При звонке на свой внутренний номер, включается или отключается режим DND.
; --------------------------------------------------------------------------
;
exten => s,1,NoOp(DND - Activate\Deactivate)
exten => s,n,ExecIf($["${CALLERID(number)}" = "${ARG1}"]?Goto(app-dnd-toggle,*76,1))
exten => s,n,Return()


[dnd-transfer-check]
; --------------------------------------------------------------------------------------------
; Задание необходимой переадресации на мобильный телефон в DND режиме.
;
; -- Инструкция:
; В условии REGEX("^()" в () указываем внутренние номера для которых необходимо перенаправлять
; входящие на мобильные при активном режиме DND. Прим. - REGEX("^(1100|1101)"
; --------------------------------------------------------------------------------------------
;
exten => s,1,NoOp(DND transfer call)
exten => s,n,ExecIf($[${REGEX("^(1100)" ${ARG1})}]?GoSub(dnd-transfer-call,s,1(${ARG1})))
exten => s,n,Return()


[dnd-transfer-call]
; ------------------------------------------------------------------------------------------------
; Проверка на включенный режим DND и указание номера для переадресации.
;
; -- Инструкция:
; Под указателем "insert DND transfer rule below" добавляем строку вида:
; exten => s-XXXX,1,Goto(outbound-allroutes,8XXXXXXXXXX,1), где вместо s-XXXX указываем внутренний 
; номер абонента, а вместо 8XXXXXXXXXX номер мобильного для переадресации.
;
; Прим. - exten => s-1100,1,Goto(outbound-allroutes,8800000000,1)
; ------------------------------------------------------------------------------------------------
;
exten => s,1,NoOp(Transfer Call on DND activate)
exten => s,n,GotoIf($["${DB(DND/${ARG1})}" != ""]?s-${ARG1},1)
exten => s,n,Return()

; insert DND transfer rule below
;exten => s-XXXX,1,Goto(outbound-allroutes,8XXXXXXXXXX,1)

В порядке рабочей необходимости поставилась задача по реализации динамических конференций на FreePBX. Из функционала должна быть возможность перевода активного разговора в конференцию, возможность приглашать новых участников в созданную динамическую конференцию находясь в ней, а так же возможность самостоятельному подключения к активной динамической конференции.

 

В интернете есть несколько примеров реализации подобного рода задачи, но я решил реализовать по своему и так как мне нужно. Итак все ниже описанные действия производились на Asterisk 16 + FreePBX 14 + phpAGI.

[stextbox id=’info’]ИНФОРМАЦИЯ. По-умолчанию phpAGI задействован в FreePBX и дополнительных манипуляций по его настройки не требуется. Если ниже описанные действия будут применяться к голому Asterisk, то как настроить на нем phpAGI можно прочитать из этой статьи.[/stextbox]

 

— Техническое задание:
  • В активном разговоре нажать *7 — создание и перевод участников разговора в конференцию.
  • В конференции нажать *7 — после гудка набрать номер кого хотим пригласить в конференцию и нажимаем #.
  • Набрать внутренний номер с префиксом *7 (прим. *71100) — если конференция с набранным номером (прим. 1100) существует, то будет присоединение к ней, в противном случае будет создана новая конференция.

Понадобилось недавно подключить SIP-транк от Ростелекома к FreePBX 14 в связке с Asterisk 16. В качестве памятки опишу порядок действий, для того чтобы иметь возможность на FreePBX принимать\звонить через SIP-транк Ростелекома.

 

В личном кабинете Виртуальной АТС (Ростелеком) переходим в «Пользователи» и заходим в «user1» (можно создать нового, кому как удобней).

В качестве памятки опишу способ доработки функции второй линии (Call Waiting) в FreePBX 14.

 

По-умолчанию механизм работы второй линии не предполагает никаких уведомлений звонящему в случае если вызываемый абонент уже с кем то разговаривает, а просто воспроизводятся стандартные гудки дозвона. Это создает впечатление у звонящего что вызываемый абонент не хочет брать трубку..

 

Было бы куда информативнее проигрывать звонящему информационное сообщение, о том что абонент разговаривает, оставайтесь на линии или перезвоните позднее..

 

Как оказалось в FreePBX есть определенная обработка macro-dialout-one-predial-hook описанная в /etc/asterisk/extensions.conf и которая срабатывает до момента непосредственного звонка абоненту. В этой обработке можно проверить статус выдываемого абонента и в случае если статус линии занят, то проигрывать звонящему сообщение и продолжить вызов.

 

В файл конфигурации /etc/asterisk/extensions_custom.conf в секцию [from-internal-custom] добавляем:

[from-internal-custom]

;----- Playback Wait for answer in INUSE line -----
[macro-dialout-one-predial-hook]
exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/wait_for_answer))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))

[stextbox id=’info’]ПОЯСНЕНИЕ. Возможные варианты состояния линии (DEVICE_STATE) — UNKNOWN, NOT_INUSE, INUSE, BUSY, INVALID, UNAVAILABLE, RINGING, RINGINUSE, ONHOLD (более подробно можно почитать в оф. документации)[/stextbox]

[stextbox id=’info’]ИНФОРМАЦИЯ. По-умолчанию FreePBX смотрит каталог со звукам по пути — /var/lib/asterisk/sounds/ru[/stextbox]

От коллеги по цеху поступила просьба помочь с реализацией интересной задачи, которая заключается во исполнении №152-ФЗ (Федеральный закон «О персональных данных») по которому необходимо блокировать исходящие звонки на номера клиентов, который дали отказ на них.

 

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

 

Я увидел решение задачи несколькими способами, рассмотрим этим варианты реализации.

 

Исходные данные:

  • Debian 9 Strech
  • Asterisk 16 + FreePBX 14
  • Номерная маска операторов — _146XX

 

Вариант #1

В файл конфигурации /etc/asterisk/extensions_custom.conf добавляем следующую обработку:

[from-internal-custom]
exten => _89858887766/_146XX,1,GoSub(sub-marketing-block,s,1)
exten => _89855554433/_146XX,1,GoSub(sub-marketing-block,s,1)
exten => _89852221100/_146XX,1,GoSub(sub-marketing-block,s,1)
; -- УКАЗЫВАЕМ ОСТАЛЬНЫЕ НОМЕРА КОТОРЫЕ ПОД ЗАПРЕТОМ --

[sub-marketing-block]
exten => s,1,Background(custom/message)
exten => s,2,WaitExten(3)
exten => 1,1,Goto(s,5)
exten => i,1,Goto(s,6)
exten => t,1,Goto(s,6)
exten => s,5,Return()
exten => s,6,Hangup()

В FreePBX 14 Dashboard в Mail Queue висит ошибка:

Mail Queue: Unknown output from mailq: [[“exim: permission denied”], 1]

 

Данная ошибка означает что нет доступа списку очереди exim. Чтобы исправить эту ошибку в файле конфигурации (/etc/exim4/exim4.conf.template) в секцию MAIN CONFIGURATION SETTINGS добавим параметр:

queue_list_requires_admin = false

 

Обновим конфигурацию exim:

update-exim4.conf

 

Рассмотрим как установить FreePBX 14 в связке с Asterisk 16 на Debian 9 Stretch.

 

Подготовка системы

Перед началом установки обновляем систему до актуального состояния:

apt-get update && apt-get upgrade -y

Устанавливаем необходимые зависимости:

apt-get install build-essential linux-image-amd64 linux-headers-* apt-transport-https bison flex curl sox libncurses5-dev libssl-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git unixodbc-dev uuid uuid-dev libasound2-dev libogg-dev libvorbis-dev libicu-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp0-dev libspandsp-dev subversion libtool-bin python-dev unixodbc dirmngr sudo apache2 mariadb-server mariadb-client default-libmysqlclient-dev -y

[stextbox id=’alert’]ВНИМАНИЕ. Обязательно перезагружаем систему и после этого продолжаем установку.[/stextbox]

 

Устанавливаем PHP версии 5.6 (для корректной работы FreePBX fwconsole):

curl https://packages.sury.org/php/apt.gpg | apt-key add -
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/deb.sury.org.list
apt-get update && apt-get install php5.6 php5.6-curl php5.6-cli php5.6-mysql php5.6-mbstring php5.6-gd php5.6-xml php-pear -y

Устанавливаем NodeJS :

curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
apt-get install nodejs -y
pear install Console_Getopt

Устанавливаем поддержку MariaDB ODBC

wget https://downloads.mariadb.com/Connectors/odbc/connector-odbc-2.0.15/mariadb-connector-odbc-2.0.15-ga-debian-x86_64.tar.gz
tar -zxvf mariadb*
cp -v mariadb-connector-odbc-2.0.15-ga-debian-x86_64/lib/libmaodbc.so /usr/lib/x86_64-linux-gnu/odbc/

 

Столкнулся недавно с задачей по маршрутизации звонков между несколькими FreePBX соединенными SIP-транками. Необходимо вызов пришедший из одного SIP-транка на определенный номерной план передать в другой SIP-транк.

 

Имеется три АТС на базе FreePBX (13, 14) — FreePBX «A» (номерной план 1ХХ), FreePBX «B» (номерной план 2ХХ), FreePBX «C» (номерной план 3ХХ). Которые соединены между собой SIP-транками следующим образом:

FreePBX «A» <—-SIP TRUNK «A»—-> FreePBX «B» <—-SIP TRUNK «B»—-> FreePBX «C»

 

Для наглядности рассмотрим к примеру ситуацию когда необходимо дозваниваться с FreePBX «A» (1ХХ) до абонентов находящихся в FreePBX «С» (3ХХ) и в обратном направлении.

 

Можно конечно решить задачу соединив отдельным SIP-транком  FreePBX «A» и FreePBX «С», но рассмотрим другой вариант, когда к примеру нет возможности соединить их на прямую, тогда в этом случае посредником для звонков будет выступать FreePBX «B», т.к. он имеет связь по SIP-транку с FreePBX «С» и FreePBX «A».

В работе имеется связка Asterisk 16.3.0 + FreePBX 14.0.11 и два SIP-провайдера. Задался вопросом как модифицировать/изменить номер телефона (CallerID) при входящем звонке, устанавливая префикс 8 в любом случае. Мне нужно это для удобства обратного набора, на поступивший внешний звонок.

 

В моем случае один SIP-провайдер отдает номер телефона с префиксом 7, прим. 7800-800-80-80 (7XXXXXXXXXX), а другой вообще без префикса, прим. 800-800-80-80.

Чтобы исправить это, нам  необходимо немного модифицировать dialplan, внеся в файл конфигурации /etc/asterisk/extensions_custom.conf следующий код:

[from-pstn-custom]
exten => _X.,1,ExecIF($[${VALID_EXTEN(fix-cid,${CALLERID(num)})}]?Gosub(fix-cid,${CALLERID(num)},1))

[fix-cid]
; Входящий номер с кодом 7
exten => _7XXXXXXXXXX,1,Set(CALLERID(num)=8${CALLERID(num):1})
exten => _7XXXXXXXXXX,n,Return()

; Входящий номер без кода страны
exten => _XXXXXXXXXX,1,Set(CALLERID(num)=8${CALLERID(num)})
exten => _XXXXXXXXXX,n,Return()

Используя в работе голый Asterisk, рано или поздно становится недостаточно стандартных инструментов, для решения нужных задач. В этом случае нам поможет интерфейс AGI, который позволяет Asterisk взаимодействовать со сторонними приложениями, к примеру с приложением написанным на PHP.

 

Рассмотрим как настроить взаимодействие Asterisk с классом phpagi, посредством интерфейса AGI (Asterisk Gateway Interface).

[stextbox id=’info’]Все ниже действия будут производится на Debian 8 JessieAsterisk 13 и версией PHP — 5.6. Хочу обратить внимание что ниже описанное так же будет применимо к FreePBX[/stextbox]

 

Настройка Asterisk

Для подключения класса phpagi, в конфигурационный файл (/etc/asterisk/manager.conf), добавляем параметры подключения его (прим. astphp):

Разберем как выполнить установку Asterisk 13 в связке с FreePBX 13 и с поддержкой протокола SCCP на Debian 8 Jessie/Ubuntu 14.04 Trusty Tahr.

 

Переходим в режим работы под root:

sudo su

 

Подготовка системы

Перед началом установки обновляем систему до актуального состояния:

apt-get update && apt-get upgrade -y

Устанавливаем необходимые зависимости:

apt-get install -y build-essential linux-headers-`uname -r` openssh-server apache2 mysql-server mysql-client bison flex php5 php5-curl php5-cli php5-mysql php-pear php5-gd curl sox libncurses5-dev libssl-dev libmysqlclient-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git unixodbc-dev uuid uuid-dev libasound2-dev libogg-dev libvorbis-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp0-dev libspandsp-dev libmyodbc -y

Перезагружаем систему:

reboot

После перезагрузки, не забываем снова войти под root.

Имеется развернутый Asterisk 11 + FreePBX (по этой статье) на Ubuntu server 14.04.5 LTS и следующая ситуация, что при постановки звонящего на удержание вызова, звонящий слышит в трубке гробовую тишину, дабы как то развлечь звонящего в режиме удержания установим модуль Music On Hold. Т.к. у нас вместе с Asterisk работает FreePBX, то устанавливать модуль мы будем через FreePBX.

Перейдем в Admin Module Admin

moh1

Разберем как выполнить установку Asterisk 11 в связке с FreePBX 2.11 и с поддержкой протокола SCCP на Debian 8 Jessie/Ubuntu Server 14.04 LTS.

 

Переходим в режим работы под root:

sudo su

Обновляем систему до актуального состояния:

apt-get update && apt-get upgrade -y

Устанавливаем необходимые зависимости:

apt-get install -y build-essential linux-headers-`uname -r` openssh-server apache2 mysql-server mysql-client bison flex php5 php5-curl php5-cli php5-mysql php-pear php-db php5-gd curl sox libncurses5-dev libssl-dev libmysqlclient15-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git subversion uuid uuid-dev -y

Перезагружаем систему:

reboot

После перезагрузки, не забываем снова войти под root.