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

Ограничение донабора из IVR

Добавлено: 21 авг 2020, 09:04
niknav
Добрый день.
У меня телефония организована на базе дистрибутива FreePBX Distro.
Есть IVR меню через которое можно с помощью донабора набрать внутренний номер.
Необходимо запретить донабор на определенные номера.
Подскажите как лучше это сделать?

Re: Ограничение донабора из IVR

Добавлено: 21 авг 2020, 10:37
ded
Если посмотрите как устроен контекст ivr-1, который система создаёт при организации ИВР через вэб-интерфейс, то увидите такой инклюд:
Include => 'ivr-1-custom'
но такого контекста 'ivr-1-custom' нет в диал-плане. Это зародыш для кастомизации.
Можно создать такой контекст в файле extensions_custom.conf где указать номера, на которые нельзя будет попасть из ИВР.

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

[ivr-1-custom]
exten => 111,1,Hangup(16)

Re: Ограничение донабора из IVR

Добавлено: 21 авг 2020, 13:57
niknav
У меня в файле extensions_custom.conf контекст ivr-1 выглядит следующим образом:

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

[ivr-1] ; Test
include => ivr-1-custom
exten => fax,1,Goto(${CUT(FAX_DEST,^,1)},${CUT(FAX_DEST,^,2)},${CUT(FAX_DEST,^,3)})

exten => s,1,Set(INVALID_LOOPCOUNT=0)
exten => s,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT})
exten => s,n,Set(_IVR_CONTEXT=${CONTEXT})
exten => s,n,Set(__IVR_RETVM=)
exten => s,n,GotoIf($["${CHANNEL(state)}" = "Up"]?skip)
exten => s,n,Answer
exten => s,n(skip),Set(IVR_MSG=custom/Test)
exten => s,n(start),Set(DIGITS=)
exten => s,n,Set(IVREXT=)
exten => s,n,Set(NODEFOUND=0)
exten => s,n,Set(LOCALEXT=0)
exten => s,n,Set(DIREXT=0)
exten => s,n(beforewhile),ExecIf($["${IVREXT}" != ""]?Set(DIGITS=${DIGITS}${IVREXT}))
exten => s,n,While($["${NODEFOUND}" = "0"] )
exten => s,n,Read(IVREXT,${IVR_MSG},1,,0,20)
exten => s,n,Set(IVR_MSG=)
exten => s,n,GotoIf($["${READSTATUS}" = "OK" & "${IVREXT}" = ""]?#,1)
exten => s,n,GotoIf($["${READSTATUS}" = "TIMEOUT" & "${DIGITS}" != ""]?i,1)
exten => s,n,GotoIf($["${READSTATUS}" = "TIMEOUT" & "${IVREXT}" = ""]?t,1)
exten => s,n,Noop(${DB(DEVICE/${DIGITS}${IVREXT}/user)})
exten => s,n,ExecIf($["${DB(DEVICE/${DIGITS}${IVREXT}/user)}" != ""]?Set(LOCALEXT=1))
exten => s,n,GotoIf($["${LOCALEXT}" = "1"]?from-did-direct-ivr,${DIGITS}${IVREXT},1)
exten => s,n,Noop(${CONTEXT}${DIGITS},${IVREXT},1)
exten => s,n,ExecIf($["${DIALPLAN_EXISTS(${CONTEXT},${DIGITS}${IVREXT},1)}" != "0"]?Set(NODEFOUND=1))
exten => s,n,GotoIf($["${NODEFOUND}" = "0"]?beforewhile:nodedial)
exten => s,n,EndWhile
exten => s,n,GotoIf($["${DIALPLAN_EXISTS(${CONTEXT},${DIGITS},1)}" = "0"]?i,1)
exten => s,n(nodedial),Goto(${DIGITS}${IVREXT},1)

exten => i,1,Set(INVALID_LOOPCOUNT=$[${INVALID_LOOPCOUNT}+1])
exten => i,n,GotoIf($[${INVALID_LOOPCOUNT} > 3]?final)
exten => i,n,Set(IVR_MSG=no-valid-responce-pls-try-again)
exten => i,n,Goto(s,start)
exten => i,n(final),Playback(no-valid-responce-transfering)
exten => i,n,Goto()

exten => t,1(final),Goto()

exten => return,1,Set(_IVR_CONTEXT=${CONTEXT})
exten => return,n,Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT_${CONTEXT}})
exten => return,n,Set(IVR_MSG=custom/Test)
exten => return,n,Goto(s,start)

exten => h,1,Hangup

exten => hang,1,Playback(vm-goodbye)
exten => hang,n,Hangup

;--== end of [ivr-1] ==--;
И при добавлении строки написанной вами ничего не меняется.

Re: Ограничение донабора из IVR

Добавлено: 21 авг 2020, 15:08
ded
Скорее всего этот контекст у вас в extensions_additional.conf (если его руками кто-то не перенес в extensions_custom.conf)

Смотрите на вот эти шаги:
exten => s,n,Noop(${CONTEXT}${DIGITS},${IVREXT},1)
exten => s,n,ExecIf($["${DIALPLAN_EXISTS(${CONTEXT},${DIGITS}${IVREXT},1)}" != "0"]?Set(NODEFOUND=1))
exten => s,n,GotoIf($["${NODEFOUND}" = "0"]?beforewhile:nodedial)

Если вы посмотрите состояния переменных в первом шаге во время выполнения вызова в CLI то увидите в каком контексте ищутся внутренние номера.
Я думаю можно добавить строку после этого
exten => s,n,GotoIf(${${DIGITS} = 111 | 222 | 333}?hang,1) ; синтаксис проверьте, пишу наобум
где 111 222 и 333 - номера для примера, на которые не получится делать донабор.