Одним из неудобств пользования GoIP шлюзов является замена номера при исходящих звонках. Это связано с ограничениями операторов — нельзя подменять номера при исходящих звонках по Российскому законодательству. Таким образом, при перенаправлении звонка через GoIP шлюз мы теряем входящий номер абонента, поскольку оператор подставляет свой.

В текущей заметке мы создадим приложение на lua языке, используя стандартные возможности FusionPBX и сделаем стандартное приложение, которое можно использовать в системе, не переписывая ядро и диал планы, делая отправку входящих номеров во время перенаправления вызова.

В первую очередь, нужно во FusionPBX перейти в раздел Advanced — Email Temlates.

Создать копию шаблона письма в соответствии вашему языку. Например, скопируем ru-Ru — Missed. В категории укажем forward, в шаблоне пропишем:

Переведенный звонок с номера ${caller_id_number} <${caller_id_number}> по линии ${sip_to_user}

для ${dialed_user}

Сохраним.

Далее заходим на сервер ssh(под root), переходим по пути:

cd /usr/share/freeswitch/scripts/app

mkdir forward_number

chown -R www-data:www-data forward_number

Таким образом мы создали каталог приложения forward_number, которое можно использовать непосредственно в FusionPBX.

Создаем файл index.lua в каталоге:

touch index.lua

chown www-data:www-data index.lua

В файл index.lua вставляем следующий код:

--debug
debug["info"] = false;
debug["sql"] = false;
--include config.lua
require "resources.functions.config";
require "resources.functions.explode";
require "resources.functions.trim";
require "resources.functions.base64";
--load libraries
require 'resources.functions.send_mail'
    if (session ~= nil and session:ready()) then
        uuid = session:getVariable("uuid");
        domain_uuid = session:getVariable("domain_uuid");
        domain_name = session:getVariable("domain_name");
        context = session:getVariable("context");
        originate_disposition = session:getVariable("originate_disposition");
        originate_causes = session:getVariable("originate_causes");
        hangup_on_subscriber_absent = session:getVariable("hangup_on_subscriber_absent");
        hangup_on_call_reject = session:getVariable("hangup_on_call_reject");
        caller_id_name = session:getVariable("caller_id_name");
        caller_id_number = session:getVariable("caller_id_number");
        call_direction = session:getVariable("call_direction");
        if (caller_direction == "local") then
            caller_id_name = session:getVariable("effective_caller_id_name");
        end
        sip_to_user = session:getVariable("sip_to_user");
        dialed_user = session:getVariable("dialed_extension");
        missed_call_app = session:getVariable("missed_call_app");
        missed_call_data = session:getVariable("missed_call_data");
        sip_code = session:getVariable("last_bridge_proto_specific_hangup_cause");
            --set the sounds path for the language, dialect and voice
                default_language = session:getVariable("default_language");
                default_dialect = session:getVariable("default_dialect");
                default_voice = session:getVariable("default_voice");
                if (not default_language) then default_language = 'en'; end
                if (not default_dialect) then default_dialect = 'us'; end
                if (not default_voice) then default_voice = 'callie'; end

            --connect to the database
                local Database = require "resources.functions.database";
                local dbh = Database.new('system');

            --get the templates
                local sql = "SELECT * FROM v_email_templates ";
                sql = sql .. "WHERE (domain_uuid = :domain_uuid or domain_uuid is null) ";
                sql = sql .. "AND template_language = :template_language ";
                sql = sql .. "AND template_category = 'forward' "
                sql = sql .. "AND template_enabled = 'true' "
                sql = sql .. "ORDER BY domain_uuid DESC "
                local params = {domain_uuid = domain_uuid, template_language = default_language.."-"..default_dialect};
                if (debug["sql"]) then
                    freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "; params:" .. json.encode(params) .. "\n");
                end
                dbh:query(sql, params, function(row)
                    subject = row["template_subject"];
                    body = row["template_body"];
                end);

            --prepare the headers
                local headers = {}
                headers["X-FusionPBX-Domain-UUID"] = domain_uuid;
                headers["X-FusionPBX-Domain-Name"] = domain_name;
                headers["X-FusionPBX-Call-UUID"]   = uuid;
                headers["X-FusionPBX-Email-Type"]  = 'forward';

            --remove quotes from caller id name and number
                caller_id_name = caller_id_name:gsub("'", "&#39;");
                caller_id_name = caller_id_name:gsub([["]], "&#34;");
                caller_id_number = caller_id_number:gsub("'", "&#39;");
                caller_id_number = caller_id_number:gsub([["]], "&#34;");

            --prepare the subject
                subject = subject:gsub("${caller_id_name}", caller_id_name);
                subject = subject:gsub("${caller_id_number}", caller_id_number);
                subject = subject:gsub("${sip_to_user}", sip_to_user);
                subject = subject:gsub("${dialed_user}", dialed_user);
                subject = trim(subject);
                subject = '=?utf-8?B?'..base64.encode(subject)..'?=';

            --prepare the body
                body = body:gsub("${caller_id_name}", caller_id_name);
                body = body:gsub("${caller_id_number}", caller_id_number);
                body = body:gsub("${sip_to_user}", sip_to_user);
                body = body:gsub("${dialed_user}", dialed_user);
                body = body:gsub(" ", "&nbsp;");
                body = body:gsub("%s+", "");
                body = body:gsub("&nbsp;", " ");
                body = body:gsub("\n", "");
                body = body:gsub("\n", "");
                body = trim(body);

            --send the emails
                send_mail(headers,
                    missed_call_data,
                    {subject, body}
                );

                if (debug["info"]) then
                    freeswitch.consoleLog("notice", "[forward number] " .. caller_id_number .. "->" .. sip_to_user .. "emailed to " .. missed_call_data .. "\n");
                end
    end

Нужно сохраниться и после этого можно добавлять приложения в нужные места. У нас это — места перенаправления звонка: Call forward, Follow Me, Not registred.

Переходим в меню Dialplan — Dialplan Manager. Ищем диалпланы follow-me-destinations, call_forward_all, call-forward-not-registered,. Добавляем в предпоследнюю строчку:

action lua app.lua forward_number

После этого нужно сбросить кеш и перегрузить XML файлы из меню Status — Sip Status.

Для получения почты нужно настроить smtp агента в настройках FusionPBX: Меню Advanced — Default Settings — Раздел Email, а так же в настройках номера в разделе Missed Call указать тип Email и внести актуальный email адрес.

Таким простым способом мы теперь не будем судорожно узнавать, а кто же позвонил. Нам на почту всегда придет письмо с номером, который бы потерялся при перенаправлении через GSM шлюз.

Так же возможно получать номер через смс шлюз (причем c того же GoIP) нажав dсего одну клавишу на сотовом телефоне во время разговора.

Tags: , , ,