Funções do Dialplan do Asterisk 20
Comando:
EVAL_SUB()
Sinopse:
Executa um `Gosub` e fornece seu valor de retorno como uma string.
Descrição:
A função `EVAL_SUB` executa um trecho do dialplan em um contexto, extensão e prioridade específicos, com argumentos opcionais, e retorna o conteúdo da instrução `Return`. Os argumentos para `EVAL_SUB` são exatamente os mesmos que para o aplicativo `Gosub`.
Esta função é complementar a `EVAL_EXTEN`, mas é mais poderosa, pois permite executar dialplans arbitrários e capturar um resultado como o valor de retorno de uma função do dialplan. Isso possibilita o uso em diversos cenários que não permitem a execução direta do dialplan, mas permitem o uso de variáveis e funções, e onde usar `EVAL_EXTEN` seria difícil ou impossível.
Consequentemente, esta função também permite implementar suas próprias funções arbitrárias no dialplan, que podem então ser encapsuladas usando a interface de funções do Asterisk com `EVAL_SUB`.
Embora esta função seja primariamente destinada a ser usada para executar rotinas `Gosub` que sejam rápidas e não interajam com o canal, é seguro executar dialplans arbitrários, mesmo bloqueantes, na sub-rotina chamada. No entanto, esse tipo de uso não é recomendado.
Esta função sempre retornará, mesmo que o canal seja desligado.
Sintaxe:
[islocal]
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()
EVAL_SUB(context,extensions,priority)
Fonte: Asterisk Wiki