Александр Мисюрин
06.11.2019
219

Редактирование состава ринг группы по звонку

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

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

Все настройки проводились на системе: CentOS 6.9, Asterisk 13.21.0, FreePBX 13 PHP PHP 5.6.

В диалплане, который доступен для выбранного внутреннего номера, указываем нужный exten (номер или сервисный код, в данном примере будет код), который отправит нас на выполнение скрипта обработки. Рассмотрим два варианта:

  1. Добавление/удаление номеров в ринг группу списком, с заменой всего списка операторов,
  2. Добавление/удаление номеров в ринг группу посредством голосового меню.

Первый способ предполагает указание в качестве exten списка номеров, начинающихся с номера ринг группы и разделенных «*», например:

exten => _700*XXX.,1,Set(nums=${EXTEN:4});Назначаем список номеров
same => n,Set(numr=${EXTEN:0:3});Назначаем номер группы
same => n,Set(nums=${REPLACE(nums,*,-)});Меняем * на -, поскольку в базе список разделен именно так
same => n,NoOp(Группа:${numr}==Список номеров:${nums});выводим для проверки
Вывод списка номеров и номера группы
Вывод списка номеров и номера группы

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

Диалплан отправки в скрипт:

[from-internal-custom]
exten => _700*.,1,Set(nums=${EXTEN:4})
same => n,Set(numr=${EXTEN:0:3})
same => n,Set(nums=${REPLACE(nums,*,-)})
same => n,NoOp(Группа:${numr}==Список номеров:${nums})
same => n,Read(mark,ru/custom/mark,10)
same => n,Goto(operator_change,${mark},1)
[operator_change]
exten => _[12],1,System(/usr/bin/php -f /var/lib/asterisk/agi-bin/change_rgroups.php ${numr} ${nums} ${EXTEN})
Cкрипт необходим, поскольку для перечитывания конфигураций может потребоваться довольно долгое время.
function bd_bridge($db,$q){
                $link = @mysqli_connect('localhost','user','password',$db) or die("Error: ".@mysqli_connect_error($link));
                $rs = @mysqli_query($link, $q) or die("Error: ".@mysqli_error($link));
                if($rs){
                        return $rs;
                        @mysqli_free_result($rs);
                }
                else{
                }
                mysqli_close($link);
        }

Для проверки скрипт будем писать последовательно, первая часть – добавление, самое простое, поскольку список номеров из диалплана уже в нужном формате, поэтому просто выводим его и номер группы.

Чтобы не создавать несколько скриптов для каждой задачи, укажем метку, по которой будем ориентироваться. Например, отправлять в скрипт третьим аргументом метку 1 или 2.
if ("$argv[3]" == "1") {
	echo "update ringgroups set grplist='".$argv[2]."' where grpnum='".$argv[1]."';";
	}
Вывод запроса добавления в группу
Вывод запроса добавления в группу

Чтобы добавить в базу, указываем:

$result = bd_bridge('asterisk',"update ringgroups set grplist='".$argv[2]."' where grpnum='".$argv[1]."';");

И проверяем добавление, если все прошло успешно, список в соответствующей таблице обновится.

Обновление в базе
Обновление в базе

Для применения конфигураций, необходимо запустить reload FreePBX:

if ("$argv[3]" == "1") {
	$result = bd_bridge('asterisk',"update ringgroups set grplist='".$argv[2]."' where grpnum='".$argv[1]."';");
	$apply=`/var/lib/asterisk/bin/module_admin reload`;
}
Проверка добавления в группу
Проверка добавления в группу

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

Для наглядности выводим все шаги:

if ("$argv[3]" == "2") {
	$result = bd_bridge('asterisk',"select grpnum, grplist from ringgroups where grpnum='".$argv[1]."';");
	$row = mysqli_fetch_array($result); 
	$arraynow = explode ("-",$row[1]);
	$arraydo = explode ("-",$argv[2]);
		echo "Массив сейчас в группе: \n";
		print_r($arraynow);
		echo "Массив из диалплана: \n";
		print_r($arraydo);
		echo "Массив разницы: \n";
		$result = array_diff($arraynow, $arraydo);
		print_r($result);
		$string="";
		foreach ($result as $value) {
			$string.=$value."-";
		}
		$result = bd_bridge('asterisk',"update ringgroups set grplist='".substr($string,0,-1)."' where grpnum='".$argv[1]."';");
		$apply=`/var/lib/asterisk/bin/module_admin reload`;
}
Сравнивать обязательно массив из базы с массивом из диалплана, чтобы в базу не записались случайно введенные лишние номера.
Проверка удаления
Проверка удаления

Второй способ предполагает добавление/удаление номеров по одному или списком, через голосовое меню. Способ реализации аналогичен первому, за исключением добавления еще одного голосового меню в контекст operator_change и кода вызова, а также добавлением пары новых меток в скрипт.

Контекст вызова редактирования группы и контекст запуска скрипта изменяются на следующие:

[from-internal-custom]
exten => *700,1,Set(numr=${EXTEN:1:3})
same => n,NoOp(Группа:${numr})
same => n,Read(mark,ru/custom/mark,10)
same => n,Goto(operator_change_dtmf,${mark},1)

[operator_change_dtmf]
exten => _[12],1,Read(nums,ru/custom/mark,50)
same => n,Set(nums=${REPLACE(nums,*,-)})
same => n,NoOp(Список номеров:${nums})
same => n,System(/usr/bin/php -f /var/lib/asterisk/agi-bin/change_rgroups.php ${numr} ${nums} ${EXTEN})
Поскольку в конце выполнения в скрипт отправится такой же набор данных как и в первом случае, изменять его не требуется.

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

Вывод списка операторов
Вывод списка операторов
 
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