Если вы не используете уже готовый дистрибутив 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-интерфейс;
  • Мы можем создать несколько таблиц под каждого абонента и блокировать звонящих индивидуально (если в этом есть необходимость).

Все подготовлено по материалам из открытых источников.

Комментарии (2)


  1. BoDRbI
    28.06.2015 15:39
    +1

    На мой взгляд, полезность данной статьи весьма сомнительна, так как нет ничего не обычного, в том чтобы хранить данные в mysql, и реализовать черные список. К тому же, " GotoIf($["${CALLERID(num)}" = "${blacklistid}"]?blacklisted) " зачем их сравнивать, если вы и так в запрос передали CALLERID(num).

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


  1. ilder
    29.06.2015 00:16
    +1

    И каждый звонок будет дергать БД? А не проще в этом случае заюзать agi или лучше даже fastagi с загруженным в память blacklist-ом? Я не думаю что blacklist будет весить гигабайты, но если даже так, то данное решение в любом случае проигрывает… Годиться лишь как объяснение того, как обращаться непосредственно из extensions.conf к DB. Но зачем такой изврат нужен?