Владислав Авдеев
25.06.2019
534

Восстановление работоспособности CID Prefix URL в модуле CID Superfecta

В этой статье рассмотрим правки исходного кода модуля CID Superfecta, а именно восстановление работоспособности поля CID Prefix URL. Вообще говоря, функция CID Prefix URL должна работать, что называется, «из коробки». Однако выясняется, что это не всегда так. Коротко о CID Superfecta. Если Вам уже известен принцип работы CID Superfecta, то смело можете переходить к следующему […]

В этой статье рассмотрим правки исходного кода модуля CID Superfecta, а именно восстановление работоспособности поля CID Prefix URL. Вообще говоря, функция CID Prefix URL должна работать, что называется, «из коробки». Однако выясняется, что это не всегда так.

Данные правки актуальны для модуля CID Superfecta версии 13.0.4.1 и FreePBX версии 13.

Коротко о CID Superfecta.

Общий вид модуля CID Superfecta

Если Вам уже известен принцип работы CID Superfecta, то смело можете переходить к следующему разделу – вряд ли Вы узнаете здесь что-то новое. Модуль CID Superfecta предназначен для подмены значения Caller ID (то есть имени звонящего), на заранее определённое. То есть при поступлении звонка, автоматически вызывается модуль CID Superfecta, который проверяет наличие номера звонящего по списку включённых источников. Если данный номер там имеется, то вместо «реального» Caller ID, подставляется найденный Caller ID источника. Подробности о функциях данного модуля можно найти в статье: Обзор, установка и настройка модуля CID Superfecta во FreePBX 13.

В поле CID Prefix URL указывается URL внешнего источника, на котором следует искать Caller ID.

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

Принцип заполнения поля CID Prefix URL

Для правильной работы данной функции необходимо указывать URL в следующем формате: https://IP_адрес_вашего_сервера/Путь_к_скрипту/superfecta.php?phone_number=[thenumber].

В данном примере, в качестве [thenumber] будет подставляться входящий 10-тизначный номер телефона. Таким образом, в скрипт передаётся в качестве параметра номер телефона.

Функция CID Prefix URL настроена таким образом, что будет перехватывать весь вывод, который будет в superfecta.php. Такой вывод и будет считаться необходимым к постановке Caller ID. Иными словами, в скрипте достаточно будет сделать:

echo “Test_Superfecta”;

для того чтобы в качестве Caller ID подставилось Test_Superfecta. Данный скрипт мы рассмотрим позднее в этой статье.

Пример заполнения поля CID Prefix URL

Перейдём к правкам скриптов и паралелльно рассмотрим, что же не работает в текущем функционале.

Правки скриптов

Перед началом тестирования необходимо создать файл, к которому будем обращаться из поля CID Prefix URL. Я воспользуюсь файлом, указанным на рис. 2, то есть файлом superfecta.php. Создать его необходимо на сервере, с которого будем получать информацию о CallerID.

Выведем в качестве CallerID, используя наш скрипт фразу “abra-kadabra”. Для этого в созданном файле superfecta.php я пропишу следующий код:

<?php
echo “abra-kadabra”;
?>

На этом файл сохраняем закрываем. Также не забываем установить в качестве владельца asterisk (чтобы модуль CID Superfecta мог без проблем получить к нему доступ). Делается это командой:

chown asterisk:asterisk superfecta.php

Теперь, когда файл создан, вернёмся к веб-интерфейсу модуля.

Для удобства дебага в модуле CID Superfecta имеется собственный встроенный функционал тестового запуска схемы. Находится он в разделе редактирования схемы.
Тестовый запуск схемы

Для того, чтобы вывод ни с чем не конфликтовал при дебаге, рекомендуется на этапе текущей разработки отключить все использующиеся источники данных CallerID. На основной странице схемы они находятся в блоке Data Source.

Итак, тестовый запуск провели, но, как видим, ничего не произошло. То есть “abra-kadabra” нигде не фигурирует. Переходим к правкам исходного кода.

Открываем для редактирования файл Superfecta.class.php.

В нём находим функцию execute(…).

В данной функции находим строку:

if ((isset($scheme_param['Prefix_URL'])) && (trim($scheme_param['Prefix_URL']) != '')) {

В данном условии разработчиками допущена ошибка. Дело в том, что массива $scheme_param не существует в коде, поэтому данное условие никогда не выполнится. Вместо этого необходимо было использовать другой массив: $options. Строку, описанную выше можно закомментировать, а после неё вставить исправленное условие:

if ((isset($options['scheme_settings']['Prefix_URL'])) && (trim($options['scheme_settings']['Prefix_URL'])) != '') {

Сохраняем файл, возвращаемся в web-интерфейс, запускаем тест и смотрим, что получилось:

Проверяем промежуточные значения

Если вывод при тестовом запуске сменился на тот, что указан на скриншоте, то это хорошо. Значит мы на верном пути и скрипт начал получать значение поля CID Prefix URL. Теперь размерёмся что же выдаёт нам тестовый запуск. Во-первых, это предупреждение об отсутствии сертификата (его отключим впоследствии). А также ошибка следующего вида: Cannot access protected property superfecta_single::$prefix”, “file” : “\/var\/www\/html\/admin\/modules\/superfecta\/Superfecta.class.php”, “line”:170. Это означает, что функция  не смогла получить доступ к защищённому свойству класса $superfecta->prefix.

Для исправления данной ошибки открываем файл …/includes/superfecta_base.php. В нём описан класс superfecta_base, в котором и описано данное свойство.

Расширим область видимости свойства $prefix. Для этого строку:

protected $prefix = '';

изменим на следующую:

public $prefix = '';

Вновь переходим в веб-интерфейс и запускаем тест. Если видим, что ошибка сменилась на ту, что указана в скриншоте – значит мы на верном пути.

Продолжение исправления ошибок

Следующая ошибка которая появилась означает, что происходит обращение к необъявленной функции mctime_float. Всё дело в том, что была допущена ошибка при вызове метода класса. Исправим её. Для этого открываем файл Superfecta.class.php. Находим уже знакомую функцию execute(…). В ней находим строку:

$this->out(sprintf(_("Prefix Url result took %s seconds."),number_format((mctime_float() - $start_time), 4)));

И заменяем её на

$this->out(sprintf(_("Prefix Url result took %s seconds."),number_format(($superfecta->mctime_float() - $start_time), 4)));

Тем самым определили, что функция mctime_float, на самом деле является методом класса superfcta_base.

Сохраняем, запускаем проверку:

Проверка исправлений

Если всё выполнено верно, то ошибок в коде больше не будет обнаружено. Останется последняя – ошибка сертификата.

Для отключенияпроверки сертификата открываем в режиме редактирования файл …/includes/superfecta_base.php и находим в нём функцию get_url_contents. Она отвечает за отправку curl-запроса с параметрами на URL, в поле CID Prefix URL.

Находим строку:

$ret = trim(curl_exec($crl)); 

И перед ней вставляем опцию отключения проверки сертификата:

curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, FALSE);

Сохраняем, проверяем:

Конечный результат

Если всё было выполнено верно и по инструкции – увидим волшебное «abra-kadabra» в результате нашего теста.Соответственно, подключение к URL было выполнено успешно. Теперь можно переходить к написанию «полезного» скрипта, вместо нашего тестового superfecta.php.

На этом восстановление работоспособности CID Prefix URL в модуле CID Superfecta завершено.

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices