Курсы по использованию Asterisk

IP-телефония — технология будущего. Обучитесь работе с IP-АТС Asterisk для того чтобы внедрить и профессионально использовать при решении коммуникационных задач.

Работайте с Asterisk профессионально!

Многоуровневая защита IP-АТС Asterisk

Телефонные станции очень часто становятся объектами хакерских атак. Узнайте, каким образом необходимо строить многоуровневую защиту для Вашей IP-АТС.

Не оставьте хакерам шансов. Защитите свой Asterisk от атак.

Используйте Веб-Интерфейс для удобства настройки

Панель управление FreePBX позволяет легко и удобно управлять всей системой. Научитесь эффективно использовать FreePBX для решения своих задач.

Управление станцией и статистика в окне браузера.

Научитесь работать с Asterisk из консоли

Для понимания работы с Asterisk необходимо уметь настраивать его вручную с конфигурационными файлами и командной строкой CLI Asterisk.

Научитесь «тонкой» настройке Asterisk

Цель курсов - максимум практики.

Обучение нацелено на практическую работу с IP-оборудованием: платы потоков E1, VoIP-телефонные аппараты, голосовые шлюзы FXS и прочее.

Обучение на реальном оборудовании — залог успеха.

Расписание работы операторов

База знаний Настройка Asterisk

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

1. Способ интервала времени

2. Способ пошаговой смены операторов



Создавать расписание будем с помощью скриптов на языке bash и php, а так же используя БД MYSQL.

Для работы потребуется установленный Asterisk с установленным модулем ODBC.

Нам необходима форма ввода простого интервала, если мы хотим задать соответствие конкретным дням, для этого будем использовать элементы для веб-страницы date и time:

Дни: <input name=date type='date'> - <input name=date type='date'><br />
Время: <input name=time type='time' value=00:00> - <input name=time type='time' value=00:00><br />

Формы ввода дат и времени

Также необходимо добавить форму вывода списка операторов, с возможностью выбрать необходимых. Для этого используем запрос в БД, за внутренними номерами и их именами, а так же каждому номеру поставим в соответствие свой checkbox, для выбора.

echo "<table border=1><tr><td>#</td><td>Номер</td><td>Имя</td></tr>";
$result = bd_bridge('asterisk','SELECT id, description FROM devices ORDER BY id ASC;');
while ($row = mysqli_fetch_array($result)) {
echo "<tr><td><input type='checkbox' name='int_arr[]' id='".$row[0]."'></td><td>".$row[0]."</td><td>".$row[1]."</td></tr>";
}

Помимо этого нам необходимо числовое поле, если мы будем использовать механизм чередования операторов, например два дня работают одни операторы, два дня другие:

Ввод для чередования

echo "<br /><br /><br /><input id='number' type='number' min='1' max='10'>";

Для ввода операторов, чередующихся через интервал в днях будем использовать два элемента checkbox:

$result = bd_bridge('asterisk','SELECT id, description FROM devices ORDER BY id ASC;');
echo "<table border=1><tr><td>Первые</td><td>Номер</td><td>Имя</td><td>Вторые</td></tr>";
while ($row = mysqli_fetch_array($result)) {
echo "<tr><td><input type='checkbox' name='int_arr[]' id='".$row[0]."'></td><td>".$row[0]."</td><td>".$row[1]."</td><td><input type='checkbox' name='step_arr[]' id='st".$row[0]."'></tr>";
}

Таблицы с операторами

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

Очередь

Для записи в очередь операторов, создадим файл queues_added.conf и добавим его в файл queue_post_custom.conf:

# include queues_added.conf

А также назначим ему пользователя и группу asterisk:


Chown asterisk. /etc/asterisk/queues_added.conf


В этот файл необходимо будет добавлять очередь и агентов для нее, с помощью (+) либо так же включая отдельные файлы, для удобства можем называть их с использованием номера очереди, например, queues_600.conf.


Поскольку очередей может быть несколько, то мы можем как полностью переписывать файл, так и добавлять несколько файлов и включать их в queues_added.conf


Каждый файл должен принадлежать пользователю Asterisk.


В данном примере остановимся на трех очередях, одна для интервала и две для чередования.


Потому создадим три очереди и три файла: queues_800.conf, queues_801.conf и queues_802.conf

Очереди

Файлы


После добавления файлов можем вносить в них изменения.


Стоит помнить, что в файле обязательно должна быть строка вида [номер очереди](+) для того, чтобы Asterisk добавлял изменения в очередь, в нашем случае операторов, а не менял очередь полностью.


Поскольку направление вызова необходимо задавать, мы будем использовать встроенные средства FreePBX, такие как Custom Destination, а также получать направления из Inbound Routes.


Для удобной маршрутизации вынесем отображение направлений в отдельное окно и каждый вариант маршрутизации (интервалом или поочередно) также в отдельный файл.

<?php
include('/usr/Allorien/connectdb.php');
$result = bd_bridge('asterisk','SELECT id, extension, description, destination FROM incoming ORDER BY id ASC;');
echo "<table border=1><tr><td>Номер</td><td>Описание</td><td>Действие</td></tr>";
while ($row = mysqli_fetch_array($result))
{
$str_inc=str_replace(',${EXTEN},1','',$row[3]);
echo "<tr><td>".$row[1]."</td><td>".$row[2]."</td>";
if ( $str_inc=="inbound-interval" ) echo "<td><form action='interval.php' method=post><input type='submit' name='interval' value='interval'></form></td>";
if ( $str_inc=="inbound-step" ) echo "<td><form action='step.php' method=post><input type='submit' name='step' value='step'></form></td>";
if ( ($str_inc != "inbound-step") and ($str_inc != "inbound-interval") ) echo "<td>".$row[3]."</td>";
echo "</tr>";
}
echo "</table>";
?>


В файлы interval.php и step.php вынесем части описанные выше, чтобы при их выборе мы могли изменить маршрутизацию.

Index.php


Способ интервала времени.


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


При выборе даты и времени с помощью input date, данные приходят в числовом виде, для Asterisk необходимо предоставлять месяц в виде трех первых символов на латинице, с маленькой буквы, то есть нам необходимо менять вид.


Для изменения месяца, используем функцию:

function dates(&$row){
$search = array('01','02','03','04','05','06','07','08','09','10','11','12',);
$replace = array('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','fec',);
$res=str_replace($search,$replace,$row);
return $res;
}


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

<input type='checkbox' name='int_arr[]' id='".$row[0]."' value='".$row[0].":".$row[1]."'>

Вывод номер:имя


Далее необходим обработчик нажатия кнопки, при ее нажатии, необходимо получить все переданные переменные и привести их к нужному виду:

if(isset($_POST['interval']))
{


Получаем дату и время из обоих полей.


Все необходимые для заполнения поля необходимо дополнить свойством required, для обязательного заполнения.

$time1=$_POST['time1'];
$time2=$_POST['time2'];
$date1=$_POST['date1'];
$date2=$_POST['date2'];


Также для отладки выведем полученный массив данных:

echo "<pre>".print_r($_POST,true)."</pre>";

Массив передаваемых значений


Необходимо из даты вырезать месяц и число:

$date1place = explode('-',$date1);
$date2place = explode('-',$date2);
$month1 = substr($date1place[1],0,2);
$day1 = substr($date1place[2],0,2);
$month2 = substr($date2place[1],0,2);
$day2 = substr($date2place[2],0,2);


И перевести месяцы в понятный для Asterisk формат:


$month1=dates($month1);
$month2=dates($month2);


После подготовки переменных формируем строку, которую поместим в файл globals_interval.conf, а также начало строки для очереди операторов:


$text="timedate=$time1-$time2\ndaydate=$day1-$day2\nmonthdate=$month1-$month2\n";
$textqueue='[800](+)'."\n";


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


Открываем цикл по переданному списку операторов и формируем строку для внесения в queues_800.conf

foreach ($_POST['int_arr'] as $value){
$num=stristr($value,':',true);
$name=str_replace(':','',stristr($value,':'));
$textqueue.='member=Local/'.$num.'@from-queue/n,0,"'.$name.'",hint:'.$num.'@ext-local'."\n";
}


После формирования обе строки помещаем в файлы и применяем настройки:

Файл с параметрами

Файл с агентами очереди

file_put_contents('/etc/asterisk/queues_800.conf', $textqueue);
file_put_contents('/etc/asterisk/globals_interval.conf', $text);
$tofile=`asterisk -rx 'dialplan reload' && asterisk -rx 'queue reload all'`;


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

Входящий маршрут

Примерный контекст


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

Пример работы


Демонстрация


Способ пошаговой смены операторов.


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


Вывод операторов описан выше, также необходимо дополнить именем оператора. И для отладки выводить массив данных, при нажатии кнопки:

<input type='checkbox' name='step_arr1[]' id='st1".$row[0]."' value='".$row[0].":".$row[1]."'>
echo "<pre>".print_r($_POST,true)."</pre>";

Полученный массив


Для распределения операторов по группам будем использовать вышеописанные файлы queues_801.conf и queues_802.conf, в которые будем вносить изменения аналогично методу интервала.


Помимо этого, нам необходимо передавать данные как в asterisk, так и в скрипт, который будет отвечать за чередование, сделаем это с помощью файла globals_step.conf


При нажатии кнопки в файл помещаем дату смены очереди, количество дней и маркер для смены очереди:

$nextstep = date("Y-m-d", mktime(0, 0, 0, date("m") , date("d")+$_POST['number'], date("Y")));
$textstep="datestep=".$nextstep."\nstep=".$_POST['number']."\nnowqueue=1\n";


Nowqueue – отвечает за то, какая очередь будет использоваться, на эту переменную будем опираться из dialplan.


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

$textqueue1='[801](+)';
foreach ($_POST['step_arr1'] as $value){
$num=stristr($value,':',true);
$name=str_replace(':','',stristr($value,':'));
$textqueue1.='member=Local/'.$num.'@from-queue/n,0,"'.$name.'",hint:'.$num.'@ext-local'."\n";
}
$textqueue2='[802](+)';
foreach ($_POST['step_arr2'] as $value){
//echo $value."<br>";
$num=stristr($value,':',true);
$name=str_replace(':','',stristr($value,':'));
$textqueue2.='member=Local/'.$num.'@from-queue/n,0,"'.$name.'",hint:'.$num.'@ext-local'."\n";
}


Далее все данные вносим в файлы и применяем изменения:

file_put_contents('/etc/asterisk/queues_801.conf', $textqueue1);
file_put_contents('/etc/asterisk/queues_802.conf', $textqueue2);
file_put_contents('/etc/asterisk/globals_step.conf', $textstep);
$tofile=`asterisk -rx 'dialplan reload' && asterisk -rx 'queue reload all'`;

globals_step.conf

queues_801.conf


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


Для корректной работы понадобится функция, с помощью которой будем интерпретировать данные из файла в массив:

function str_to_arr($str){
$piece=array();
$string=array();
$arr=array();
$j=0;
$string = explode ("\n",$str);
for($i=0;$i<count($string);$i++){
$piece=explode("=",$string[$i],2);
if (isset($piece[1])){
$arr[trim($piece[0])]=trim($piece[1]);
}
}
return $arr;
}


Получаем текущую дату:

$ndate=`date +%Y-%m-%d`;


И переводим данные из файла в массив:

$strvars = file_get_contents('/etc/asterisk/globals_step.conf');
$arrayvars=str_to_arr($strvars);


Далее сравниваем даты, при совпадении вносим изменения:

if ( $ndate == $arrayvars['datestep'] ) {
$nowqueue=$arrayvars['nowqueue']*-1;
$nextdate=date("Y-m-d", mktime(0, 0, 0, date("m") , date("d")+$arrayvars['step'], date("Y")));
$nextstep="datestep=".$nextdate."\nstep=".$arrayvars['step']."\nnowqueue=".$nowqueue."\n";
file_put_contents('/etc/asterisk/globals_step.conf', $nextstep);
}


И проверяем работу (для этого можно на время сменить условие или дату):

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


И помещаем на выполнение в крон, каждый день в 0:15.

Crontab


После этого нужно настроить входящую маршрутизацию, вызовы направляем на Custom Context, в котором проверяем маркер и в зависимости от его значения направляем на очередь:

Входящий маршрут

Контекст


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


Демонстрация

asterisk, FreePBX, Time, for, ODBC