Pull to refresh

Реализация Blacklist в Asterisk с помощью БД на MySQL

Reading time2 min
Views13K
Если вы не используете уже готовый дистрибутив Asterisk как например FreePBX и у вас нет к нему web GUI то задача добавления номеров в Blacklist сводится к работе с AstDB. С этим в принципе все просто. Но база данных Blacklist Asterisk общая и если нам необходимо разграничить списки заблокированных номеров по абонентам то в таком случае лучше прибегнуть к помощи внешней БД.

Итак для этого нам нужно:
  • Сам Asterisk (ну как же без него)
  • БД на MySQL
  • GUI phpmyadmin для более наглядного управления базой

Приступим. У нас следующий план действий:
  1. Создание базы для номеров и таблиц в ней
  2. Создание макроса в dialplan Asterisk
  3. Проверка работы макроса в dialplan

С помощью phpmyadmin создадим БД и тестовую таблицу с полями
  • id (ключевое поле)
  • callerid (сам заблокированый номер)
  • blockenabled (поле для установки включена ли блокировка для этого номера)
  • notes (заметки)

image

Теперь напишем макрос для проверки в плане набора на наличие номера в нашем blacklist. Для этого в секции general добавим блок globals где объявим все наши переменные необходимые для подключения к нашей базе.
В самом макросе, а мы будем использовать его обновленную и более стабильную версию GoSub(), пропишем команды подключения к базе (будем использовать оператор Asterisk MySQL) и поиск по таблице нужного значения CALLERID.
После выборки из базы проверяем найденное значение с CALLERID звонящего и завершаем звонок в случае совпадения.

[general]

[globals]

DBCurrentHost=localhost
DBuser=myuser
DBpass=mysomepassword
DBname=asterisk

[SubMysqlblacklist]
exten => s,1,NoOp(--- MACRO --- BLACKLIST ---)
same => n,MySql(connect connid ${DBCurrentHost} ${DBuser} ${DBpass} ${DBname})
same => n,MySql(query resultid ${connid} select callerid from own_blacklist where callerid=${CALLERID(num)} and blockenabled = 1)
same => n,MySql(Fetch fetchid ${resultid} blacklistid)
same => n,NoOp(FetchID: ${fetchid} Var1: ${blacklistid} ConnID: ${connid} ResultID: ${resultid})
same => n,GotoIf($["${CALLERID(num)}" = "${blacklistid}"]?blacklisted)
same => n,MySql(clear ${resultid})
same => n,MySql(disconnect ${connid})
same => n,Goto(end)
same => n(blacklisted),NoOp(Cannot dial - ${CALLERID(num)} is blacklisted !)
same => n,MYSQL(clear ${resultid})
same => n,MYSQL(disconnect ${connid})
same => n,Hangup()
same => n(end),NoOp(-- Clear --)
same => n,Return()

Далее вызываем наш макрос в плане наборов и после его перезагрузки в консоли (dialplan reload) проверяем работоспособность.

exten => 4445566,1,NoOp(-- to ${EXTEN} -- <from> -- ${CALLERID(num)} --)
same => n,GoSub(SubMysqlblacklist,s,1())
same => n,Dial(SIP/to_user1/555,40)
same => n,Hangup()

В итоге мы получили следующий функционал:

  • Все злостные телефонные вредители у нас блокируются и хранятся в одной базе. И добавлять номера можно не через консоль а через Web-интерфейс;
  • Мы можем создать несколько таблиц под каждого абонента и блокировать звонящих индивидуально (если в этом есть необходимость).

Все подготовлено по материалам из открытых источников.
Tags:
Hubs:
+5
Comments2

Articles

Change theme settings