Funções do Dialplan do Asterisk 23
Descrição:A função
EVAL_SUB executa uma localização do plano de discagem por
context, extension, priority, com argumentos opcionais e retorna o conteúdo da instrução
Return. Os argumentos para
EVAL_SUB são exatamente os mesmos utilizados com
Gosub.
Esta função é complementar à
EVAL_EXTEN. No entanto, é mais poderosa, pois permite executar um plano de discagem arbitrário e capturar algum resultado como valor de retorno de uma função do plano de discagem, permitindo que seja utilizada em uma variedade de cenários que não permitem executar o plano de discagem diretamente, mas permitem o uso de variáveis e funções, e onde o uso de
EVAL_EXTEN seria difícil ou impossível.
Consequentemente, esta função também permite que você implemente suas próprias funções arbitrárias no plano de discagem, que podem então ser encapsuladas usando a interface de função do Asterisk através do
EVAL_SUB.
Embora esta função tenha como finalidade principal ser utilizada para executar rotinas
Gosub rápidas e que não interajam com o canal, é seguro executar um plano de discagem arbitrário, mesmo que bloqueie, na sub-rotina chamada. Dito isto, esse tipo de uso não é recomendado.
Esta função sempre retornará, mesmo que o canal seja encerrado.
Exemplo: Registrar se uma chamada PSTN é local
exten => _X!,1,ExecIf($[${LEN(${EXTEN})}<10]?Return(1))
same => n,Set(LOCAL(npanxx)=${EXTEN:-10:6})
same => n,ReturnIf(${EXISTS(${DB(localcall/${npanxx})})}?${DB(localcall/${npanxx})})
same => n,Set(LOCAL(islocal)=${SHELL(curl "https://example.com/islocal?npanxx=${EXTEN:-10:6}"})})
same => n,Set(LOCAL(islocal)=${FILTER(A-Z,${islocal})}})
same => n,Set(DB(localcall/${npanxx})=${islocal})
same => n,Return(${islocal})
[outgoing]
exten => _1NXXNXXXXXX,1,Set(CDR(toll)=${IF($["${EVAL_SUB(islocal,${EXTEN},1)}"="Y"]?0:1)})
same => n,Dial(DAHDI/1/${EXTEN})
same => n,Hangup()O exemplo acima, é claro, não exige o uso desta função, pois poderia ter sido invocado diretamente usando o aplicativo
Gosub. No entanto, se restrito apenas ao uso de variáveis ou funções, o
EVAL_SUB seria necessário.
Sintaxe:
EVAL_SUB(context,extensions,priority)