Если вы не используете уже готовый дистрибутив Asterisk как например FreePBX и у вас нет к нему web GUI то задача добавления номеров в Blacklist сводится к работе с AstDB. С этим в принципе все просто. Но база данных Blacklist Asterisk общая и если нам необходимо разграничить списки заблокированных номеров по абонентам то в таком случае лучше прибегнуть к помощи внешней БД.
Итак для этого нам нужно:
Приступим. У нас следующий план действий:
С помощью phpmyadmin создадим БД и тестовую таблицу с полями
Теперь напишем макрос для проверки в плане набора на наличие номера в нашем blacklist. Для этого в секции general добавим блок globals где объявим все наши переменные необходимые для подключения к нашей базе.
В самом макросе, а мы будем использовать его обновленную и более стабильную версию GoSub(), пропишем команды подключения к базе (будем использовать оператор Asterisk MySQL) и поиск по таблице нужного значения CALLERID.
После выборки из базы проверяем найденное значение с CALLERID звонящего и завершаем звонок в случае совпадения.
Далее вызываем наш макрос в плане наборов и после его перезагрузки в консоли (dialplan reload) проверяем работоспособность.
В итоге мы получили следующий функционал:
Все подготовлено по материалам из открытых источников.
Итак для этого нам нужно:
- Сам Asterisk (ну как же без него)
- БД на MySQL
- GUI phpmyadmin для более наглядного управления базой
Приступим. У нас следующий план действий:
- Создание базы для номеров и таблиц в ней
- Создание макроса в dialplan Asterisk
- Проверка работы макроса в dialplan
С помощью phpmyadmin создадим БД и тестовую таблицу с полями
- id (ключевое поле)
- callerid (сам заблокированый номер)
- blockenabled (поле для установки включена ли блокировка для этого номера)
- notes (заметки)
Теперь напишем макрос для проверки в плане набора на наличие номера в нашем 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)
ilder
29.06.2015 00:16+1И каждый звонок будет дергать БД? А не проще в этом случае заюзать agi или лучше даже fastagi с загруженным в память blacklist-ом? Я не думаю что blacklist будет весить гигабайты, но если даже так, то данное решение в любом случае проигрывает… Годиться лишь как объяснение того, как обращаться непосредственно из extensions.conf к DB. Но зачем такой изврат нужен?
BoDRbI
На мой взгляд, полезность данной статьи весьма сомнительна, так как нет ничего не обычного, в том чтобы хранить данные в mysql, и реализовать черные список. К тому же, " GotoIf($["${CALLERID(num)}" = "${blacklistid}"]?blacklisted) " зачем их сравнивать, если вы и так в запрос передали CALLERID(num).
странный поход — создавать таблицу для каждого пользователя, почему бы не доработать имеющуюся.