Страница 1 из 1

whitelist в AstDB

Добавлено: 16 апр 2024, 09:35
BuferlorD
Всем Всем хорошего настроения!
Немного предисловия.
Задача такая организовать для определенного пула телефонных номеров переадресацию на другой номер при наборе xxxx. (Номера в разнобой)
Решил попробовать реализовать через AstDB , вписав в whitelist. Зашел в cli: database put whitelist 1001 "VIP"
Тем самым добавил его в базу.
Кусок из диалплана
exten => 2222,1,NoOp()
exten => 2222,n,GotoIf($[${REGEX("[**]"${CALLERID(num)})}]?cut_prefix:passthrough)
exten => 2222,n(cut_prefix),Set(CALLERID(num)=${CALLERID(number):2})
exten => 2222,n(passthrough),Set(PEERNAME=${EXTEN})
exten => 2222,n,Answer()
;exten => 2222,n,GotoIf($["${CALLERID(num)}" : "27594"]?help-VIP,2221,1) - вариант рабочий но добавлять в диалплан кучу строк (порядка 40) думаю не очень.
;exten => 2222,n,System($[${/etc/asterisk/checkwhitelistVIP.sh()}=1]?help-VIP,2221,1) - пробовал через sh скрипт, что то не взлетело, выдает ошибку синтаксиса, нужно разбираться сдя по всему лишних скобок напилил

exten => 2222,n,GotoIf($[${DB_EXISTS(WHITELIST()}=1]?help-VIP,2221,1) - не работает, просто проходит мимо
exten => 2222,n,GotoIf($[${WHITELIST()}=1]?help-VIP,2221,1) - тоже не работает
exten => 2222,n,GotoIf($[${BLACKLIST()}=1]?help-VIP,2221,1) - Если добавить нужный номер в базе в Blacklist, и сделать так то все работает, т.к. при обращении выдает 1 = если есть и 0 если нету.
Не могу понять.... про whitelist в книжке ничего не нашел что касаемо AstDB. Все примеры с blacklist.
Можно подумать что при обращении к белому листу он обращается в переменную, а не в базу, но вроде как добавил DB_EXISTS.

Re: whitelist в AstDB

Добавлено: 16 апр 2024, 18:37
ded
Предложу не конструировать велосипед из соломы, а воспользоваться уже готовым.
В популярной оболочке FreePBX это делается сервисным кодом *72 Call forward All

Предлагается голосом ввести номер, на который делается переадресация, и всё. Отключить перенаправление - по сервисному коду *73.
Более того, системнфый администратор может отключить вообще все перенаправления в системе *74.

Можно выдрать готовые макросы, готовые голосовые сообщенгия, и корректно вставить в ваш диал-план. Или преодолеть себя, и начать уже пользоваться FreePBX полностью.

Код: Выделить всё

*CLI> dialplan show *72@from-internal
[ Included context 'app-cf-on' created by 'pbx_config' ]
  '*72' =>          1. Answer()                                   [pbx_config]
                    2. Wait(1)                                    [pbx_config]
                    3. Macro(user-callerid,)                      [pbx_config]
                    4. Set(fromext=${AMPUSER})                    [pbx_config]
                    5. GotoIf($["${fromext}"!=""]?startread)      [pbx_config]
                    6. Playback(agent-loggedoff)                  [pbx_config]
                    7. Macro(hangupcall,)                         [pbx_config]
     [startread]    8. Gosub(app-cf-on,lang-playback,1(hook_1))   [pbx_config]
                    9. GotoIf($["foo${toext}"="foo"]?startread)   [pbx_config]
                    10. Wait(1)                                   [pbx_config]
                    11. Set(DB(CF/${fromext})=${toext})           [pbx_config]
                    12. Set(CHAN=${DB(DEVICE/${fromext}/dial)})   [pbx_config]
                    13. UserEvent(FOP2CUST,Family: astdbcust,Channel: ${CHAN},Value: ${toext} ) [pbx_config]
                    14. Set(STATE=BUSY)                           [pbx_config]
                    15. Gosub(app-cf-on,sstate,1())               [pbx_config]
                    16. Gosub(app-cf-on,lang-playback,1(hook_2))  [pbx_config]
                    17. Macro(hangupcall,)                        [pbx_config]

Понятно, что ещё нужно субрутину app-cf-on тоже вытащить, и что некоторые шаги, типа
UserEvent(FOP2CUST,Family: astdbcust,Channel: ${CHAN},Value: ${toext} )
можно замаркировать,Но это продуктивнее, чем лепить из глины и палок что-то своё.