Ковыряем FusionPBX

Чтобы посмотреть список записей и вызовов в прилинкованом сервере PostgreSQL на сервере MSSQL

FS — имя прилинкованого сервера PostgreSQL

fusionpbx — имя базы на сервере PostgreSQL

выполняем:

DECLARE @SQLtext nvarchar(max)
SET @SQLtext = 'select * from fusionpbx.public.v_call_recordings'
SET @SQLtext = 'SELECT * FROM OPENQUERY(FS, '+ CHAR(39) + @SQLtext + CHAR(39) +') AS derivedtbl_1'

insert #dataset exec (@SQLtext) - если создана таблица #dataset
или просто
exec (@SQLtext)

-- можно и так

select * from FS.fusionpbx.[public].[v_countries]

 


Из глюков:

Создал правило по времени, все нормально отрабатывает. Стоит зайти и пересохранить, то вместо домена записывается IP адрес, ну и привет правилу.

Замена на ${domain_name} не помогла.

Через какое то время — все нормально стало.


При отправке на email информации о пропущенном вызове (missed) или записанном сообщении (voicemail) наблюдаем ошибку:

[ERR] mod_lua.cpp:203 /usr/share/freeswitch/scripts/app/hangup/index.lua:80: attempt to index global 'subject' (a nil value)
stack traceback:
/usr/share/freeswitch/scripts/app/hangup/index.lua:80: in function 'missed'
/usr/share/freeswitch/scripts/app/hangup/index.lua:148: in main chunk
/usr/share/freeswitch/scripts/app.lua:48: in main chunk

Лечится созданием фалов по аналогии с каталогом

/usr/share/freeswitch/scripts/app/missed_calls/resources/templates/en/us/

Создаем

/usr/share/freeswitch/scripts/app/missed_calls/resources/templates/ru/RU/

И копируем туда из en/us

Тоже самое с voicemail, ну и оставляем в шаблонах включенными только default

После этого почта приходит, остается поправить кодировку писем.


 

Поиск файлов

 find / -name pg_hba.conf -type f 2>/dev/null

Мультифон и FusionPBX

Рассмотрим 2 варианта работы :

  • один через Issabel(asterisk) — далее через транк — на FusionPBX
  • второй —  непосредственно на FusionPBX.

 

с Issabel поднялось без проблем. Делаем прохождение через Issabel.

Через *137# включаем Multifon

Через строку в запросе выставляем режим работы

https://sm.megafon.ru/sm/client/routing/set?login=7927NOMER@multifon.ru&password=PASSWORD&routing=2

0 = Только GSM

1 = Только ПК

2 = ПК и GSM

В ответ придет xml с кодом 200 OK или ошибка.

Надо запустить пару раз с разными кодами (прочитано из форумов) например с кодом 0, а затем с кодом 2 !!! Заодно убеждаемся в правильности пароля.

Issabel и FusionPBX находятся в одной локальной сети.

На Issabell создаем транк multifon1234

Опции PEER

username=7927NOMER
type=peer
secret=PASSWORD
qualify=yes
port=5060
insecure=invite,port
host=sbc.megafon.ru
fromuser=7927NOMER
fromdomain=multifon.ru
canreinvite=no

Опции USER оставляем пустым

Добавляем строку регистрации

7927NOMER@multifon.ru:PASSWORD:7927NOMER@193.201.229.35:5060/7927NOMER

Смотрим состояние транка.

Добавляем в Issabell  транк на freeswitch

Опции PEER

host=IPADDRESSFUSIONPBX
username=issabel
secret=PASSWORDGW
fromdomain=IPADDRESSISSABEL
port=5080
type=peer

На Issabell меняем маршрутизацию входящих на транк freeswitch

На FusionPBX создаем шлюз с Issabel

Указываем имя пользователя issabel

Пароль PASSWORDGW

Прокси IPADDRESSISSABEL

Регистрация НЕТ

Контекст public

Профиль internal

Добавляем направление

Направление IPADDRESSISSABEL

Контекст public

В направлении маршрутизации меняем первую строку на

condition          $(sip_from_host)               ^(IPADDRESSISSABEL)$

В статусе sip  должен появиться шлюз issabel с состоянием NOREG

Проверяем прохождение звонка с мультифона на Issabel, затем с Issabel на FusionPBX.

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

Схема соединения была такой (БС — базовая станция):

Абонент-БС-БС-Goip4-Freeswitch-Goip4-БС-БС-Сотрудник

Стала:

Абонент-БС-Мультифон-Issabel-Freeswitch-Goip4-БС-БС-Сотрудник

Итак в результате экспериментов получилось подружить мультифон и fusionpbx

Создаем шлюз

Имя пользователя                     7927NOMER
Пароль                               PASSWORDMULTIFON
От пользователя                      7927NOMER
From domain                          multifon.ru
Прокси                               multifon.ru
Область (realm)                      sbc.multifon.ru
Имя Пользователя для авторизации     7927NOMER
Время жизни регистрации              120
Повтор попытки регистрации           60
Регистрация                          Да
Прокси-сервер регистрации            sbc.multifon.ru
Исходящий прокси-сервер              sbc.multifon.ru
Идентификатор вызывающего абонента   да
Подавление CNG                       да
SIP идентификатор CID вызывающего    да
Домен                                глобальный
Контекст                             public
Профиль                              external

В маршрутизации входящих условие — destination_number = 7927NOMER

Схема соединения стала такой:

Абонент-БС-Мультифон-Freeswitch-Goip4-БС-БС-Сотрудник

 

Данные о регистрации из программы sngrep, для отладки:


 


в русском ivr не хватает файлика в каталоге /usr/share/freeswitch/sounds/ru/RU/elena/ivr

ivr-enter_destination_telephone_number.wav

, для всех частот

из-за этого не работает перевод звонка


При ошибках Permission denied

chown freeswitch /var/lib/php/session

Отображение имени по номеру звонящего (cidlookup)

Создаем таблицу в базе Postgresql, например

CREATE TABLE public.otrs_customer
(
otrs_customer text COLLATE pg_catalog."default",
otrs_number text COLLATE pg_catalog."default"
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.otrs_customer
OWNER to fusionpbx;

Наполняем ее данными из базы Mysql, у меня это — OTRS (5 и 6 версия). Запрос выполняется из MSSQL.

DECLARE @SQLtext nvarchar(max)

SET @SQLtext = 'Select last_name,first_name,street, mobile,phone from customer_user '
SET @SQLtext = 'SELECT * FROM OPENQUERY(OTRS, '+ CHAR(39) + @SQLtext + CHAR(39) +') AS derivedtbl_1'

create table #dataset( 
last_name nvarchar(1000)
,first_name nvarchar(1000)
,street nvarchar(1000)
, mobile nvarchar(1000)
,phone nvarchar(1000))

insert #dataset exec (@SQLtext)

--Чуток приводим к нужному виду
select 
(last_name + ' ' + first_name + char(13) + char(10) + ' ' + street) as otrs_customer
, (mobile + ',' + phone ) as otrs_number
into #datasetn
from #dataset
update #datasetn SET otrs_number = otrs_number + ',' + REPLACE(otrs_number,'+7','8')
delete from #datasetn where len(otrs_number) < 4

--Добавляю данные из MSSQL
INSERT INTO #datasetn (otrs_customer,otrs_number) select FIONAME,MOBILEPHONE  from ETP_Users

--Очищаем таблицу на сервере FS
DECLARE @SQLmysql nvarchar(max)
SET @SQLmysql = 'TRUNCATE TABLE public.otrs_customer;'
EXEC (@SQLmysql) AT FS

--Вставляем данные 
INSERT INTO FS.fusionpbx.[public].otrs_customer (otrs_customer, otrs_number)
SELECT otrs_customer, otrs_number From #datasetn where otrs_number is not NULL

Получили список с Фамилиями, адресами и номерами.

Включаем модуль cidlookup

Правим cidlookup.conf.xml в панели FusionPBX :

Дополнительно — Редактор XML — autoload_configs — cidlookup.conf.xml

 <param name="odbc-dsn" value="pgsql://host=localhost dbname=fusionpbx user=fusionpbx password=MYPASSWORDPOSTGRESQL options='-c client_min_messages=NOTICE' application_name='fusionpbx'" />
 <param name="sql" value="SELECT otrs_customer.otrs_customer as name, otrs_customer.otrs_number as number from otrs_customer where otrs_customer.otrs_number like CONCAT('%','${caller_id_number}','%') LIMIT 1"/>

Добавляем в план нумерации caller-details строку

action — set — effective_caller_id_name=${cidlookup(${caller_id_number})}

XML будет выглядеть так:

<extension name="caller-details" continue="true" uuid="6ff0c4">
<condition field="" expression="" break="never">
<action application="export" data="call_direction=inbound" inline="true"/>
<action application="set" data="caller_destination=${destination_number}" inline="true"/>
<action application="set" data="caller_id_name=${caller_id_name}" inline="true"/>
<action application="set" data="caller_id_number=${caller_id_number}" inline="true"/>
<action application="set" data="effective_caller_id_name=${cidlookup(${caller_id_number})}" inline="true"/>
</condition>
</extension>

Перегружаем XML, очищаем кэш в меню «Статус SIP»

Теперь в детализации звонков наблюдаем имя вместо номера CID NAME

Тоже самое можно сделать, не создавая таблицу, а беря данные напрямую из OTRS.

Оптимальным наверно будет запускать хранимую процедуру в MySQL.

Строка для Mysql в cidlookup.conf.xml  примерно выглядит так:

<param name="odbc-dsn" value="odbc://DRIVER=mysql;SERVER=IPADDRESSMYSQL;UID=USERMYSQL;PWD=PASSWORD;DATABASE=otrs;OPTION=67108864"/>

Работоспособность не проверял, возможно и не сработает.

Но я дополняю список public.otrs_customer еще из другой базы MSSQL, поэтому пока так — как есть.

OpenVPN, Grandstream, FusionPBX, FreeSWITCH, Centos 7