Александр Мисюрин
17.06.2021
940525

Ограничение вызовов на определенные группы внутренних номеров. Разграничение для различных звонящих. Использование AstDB, сервисные коды добавления запретов/разрешений

Зачастую возникает необходимость запретить/разрешить вызовы на определенную группу номеров, стандартный функционал FreePBX не всегда позволяет сделать необходимое, либо это неудобно/долго. В данной статье рассмотрим вариант запрета вызовов на определенные группы внутренних номеров, с возможностью добавлять/удалять новые направления посредством сервисного кода. В статье рассмотрим: Работу с диалпланом Asterisk Работу с MySQL Создание своих сервисных кодов Управление […]

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

В статье рассмотрим:

  • Работу с диалпланом Asterisk
  • Работу с MySQL
  • Создание своих сервисных кодов
  • Управление базой вручную
  • Работу с ODBC и AstDB
Работы проводились на системе с установленными Asterisk 13, FreePBX 13, MariaDB 10.1.33.

Информацию по установке ODBC (если не установлен), можно найти в статье.

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

Обычно в стандартные контексты включается и custom контекст, воспользуемся этим, чтобы управлять нужными вызовами. В контекст from-internal-custom пропишем:

exten => _10X/_10X,1,Hangup()

Этой строкой мы просто запретили вызовы между внутренними номерами из пула 100-109.

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

Рассмотрим вариант с базой:

В MySQL добавляем таблицу (добавляем в стандартную базу Asteriskcdrdb):

Create table blcklstin (numto varchar (5) NOT NULL, numfrom varchar(5) NOT NULL);

И добавляем записи (по желанию и для проверки).

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

Создаем функцию, отдающую номер по номеру направления. В файл «/etc/asterisk/func_odbc.conf» прописываем:

[BLCK_LST]
dsn=asteriskcdrdb
readsql=SELECT numfrom FROM blcklstin WHERE numto='${ARG1}' and numfrom='${ARG2}';

В диалплан для проверки:

exten => _10X,1,Set(blcklst_num=${ODBC_BLCK_LST(${EXTEN},${CALLERID(num)})});Проверяем есть ли такая пара в базе (номер целевой, номер звонящего)
same => n,NoOp(${blcklst_num});Вывод в консоль результата (если есть будет номер целевой, но можете изменить на другое значение)
same => n,GotoIf($["${blcklst_num}" != ""]?end);Если пара есть, отправляем на сброс вызова
same => n,Goto(from-internal-additional,${EXTEN},1);Если пары нет, отправляем далее на вызов внутреннего номера
same => n(end),Hangup()
Блокировка вызова с номера 102 на номер 101
Блокировка вызова с номера 102 на номер 101

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

Это проще сделать с помощью AstDB, добавляем запись через консоль CLI:

test*CLI> database put blcklst_accepted 102 yes

И изменяем диалплан:

exten => _10X,1,Set(blcklst_num=${ODBC_BLCK_LST(${EXTEN},${CALLERID(num)})})
same => n,NoOp(${blcklst_num})
same => n,GotoIf($[${DB_EXISTS(blcklst_accepted/${CALLERID(num)})}]?dial);Проверка наличия номера звонящего в разрешенных, если есть, отправка сразу на вызов
same => n,GotoIf($["${blcklst_num}" != ""]?end)
same => n(dial),Goto(from-internal-additional,${EXTEN},1)
same => n(end),Hangup()

Реализуем сервисный код добавления записей в базу, для этого сначала напишем функции в ODBC (добавления и удаления).

exten => _*01*1XX*1XX,1,Set(numto=${CUT(EXTEN,\*,3)})
same => n,Set(numfrom=${CUT(EXTEN,\*,4)})
same => n,NoOp(=${numto}=${numfrom})
same => n,Set(ODBC_BLCK_LST_INS(${numto},${numfrom})=1)
same => n,Hangup()

exten => _*02*1XX*1XX,1,Set(numto=${CUT(EXTEN,\*,3)})
same => n,Set(numfrom=${CUT(EXTEN,\*,4)})
same => n,NoOp(=${numto}=${numfrom})
same => n,Set(ODBC_BLCK_LST_DEL(${numto},${numfrom})=1)
same => n,Hangup()
При необходимости можете добавить оповещение о добавлении/удалении.

Также добавляем сервисные коды добавления/удаления разрешений.

exten => _*03*1XX,1,Set(numfrom=${CUT(EXTEN,\*,3)})
same => n,Set(DB(blcklst_accepted/${numfrom})=yes)
same => n,Hangup()

exten => _*04*1XX,1,Set(numfrom=${CUT(EXTEN,\*,3)})
same => n,Set(del_num=${DB_DELETE(blcklst_accepted/${numfrom})})
same => n,Hangup()
exten => _*03*1XX,1,Set(numfrom=${CUT(EXTEN,\*,3)})
same => n,Set(DB(blcklst_accepted/${numfrom})=yes)
same => n,Hangup()

exten => _*04*1XX,1,Set(numfrom=${CUT(EXTEN,\*,3)})
same => n,Set(del_num=${DB_DELETE(blcklst_accepted/${numfrom})})
same => n,Hangup()
exten => _*03*1XX,1,Set(numfrom=${CUT(EXTEN,\*,3)})
same => n,Set(DB(blcklst_accepted/${numfrom})=yes)
same => n,Hangup()

exten => _*04*1XX,1,Set(numfrom=${CUT(EXTEN,\*,3)})
same => n,Set(del_num=${DB_DELETE(blcklst_accepted/${numfrom})})
same => n,Hangup()

Если необходимо добавить разрешенным номерам возможность звонить всегда только на одну группу номеров, то можно перенести базу в MySQL и настроить запрос аналогично запрету, с выборкой пары номер целевой/номер звонящего.
Тестирование
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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


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

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.