Белый список

Администратор,

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

Хранение и управление списком номеров

Самым простым способом является встроенная в Asterisk база данных - [AstDB]. В нашем примере мы будем использовать именно этот путь, но ничто не мешает использовать для этого любую другую DB или текстовый файл.

Итак, номера белого списка будут храниться в ветви white_list. При входящем звонке будем делать поиск в базе данных, по ветке white_list, где ключем выступает номер звонящего, а значением - номер внутреннего абонента, для которого это активно. Также добавим флаг активности режима "белый список".

Создадим несколько записей:

snowflake*CLI> database put white_list 2323956 700
Updated database successfully
snowflake*CLI> database put white_list 701 700
Updated database successfully
snowflake*CLI> database show
/white_list/2323956                               : 700
/white_list/701                                   : 700
snowflake*CLI>
snowflake*CLI> database put white_list_active 700 1
Updated database successfully

Переходим к написанию плана набора

Диалплан

В контекст обработки входящего звонка надо добавить переход в проверку "белого режима": Gosub(check-white-list,${EXTEN},1), в котором реализовать следующую логику:

[check-white-list]
exten => _X.,1,ExecIf($["${DB(white_list_active/${CALLERID(num)})}" != "1"]|Return) ; если ключа нет или он 
равен 0 - просто вернемся. Иначе белый режим активен.
exten => _X.,2,ExecIf($["${DB(white_list/${EXTEN}}" = "${CALLERID(num)}"]|Return) ; Номер найден, можно
соединять!
exten => _X.,3,Hangup ; Номера нет, вешаем трубку. Как вариан - Ringing и Wait(60) потом Hangup или 
Voicemail, смотря как нужно сделать.