Criado por Matthew Nicholson, modificado pela última vez por Rusty Newton, tradução técnica e adaptação para o Brasil por Angelo Delphini.
O Asterisk® SCF™ suporta a habilidade de escrever instruções de Dialplan na linguagem de programação
LUA. Este método pode ser usado como alternativa ou em combinação com
extensions.conf e/ou
AEL. O PBX LUA permite que os usuários usem todo o poder de
LUA para desenvolver aplicativos de telefonia usando o Asterisk® SCF™. A configuração do Dialplan LUA é feita no arquivo
extensions.lua. Lembro que o CORE/PBX do Asterisk® SCF™ aceita que os três arquivos seja utilizado pelo Dialplan simultaneamente
extensions.conf,
extensions.ael e
extensions.lua.
Dependências
Para usar o
pbx_lua, as bibliotecas de desenvolvimento lua devem ser instaladas antes que o Asterisk® SCF™ seja configurado e compilado. Você pode obter essas bibliotecas diretamente em
http://lua.org , mas é mais fácil instalá-las usando a ferramenta de gerenciamento de pacotes da sua distribuição. O pacote provavelmente é denominado
liblua5.1-dev,
liblua-dev ou
lua-devel, dependendo de sua distribuição
GNU/Linux.
PBX LUA Básico
O arquivo extensions.lua é usado para configurar PBX LUA e é um Script LUA (em oposição a ser um arquivo de configuração de Asterisk® SCF™ padrão). Qualquer coisa que seja um código LUA adequado é permitido neste arquivo. O Asterisk® SCF™ espera encontrar uma tabela global chamada 'extensions' quando o arquivo for carregado. Esta tabela pode ser gerada como você desejar. A maneira mais simples é definir todas as extensões em linha, mas para Dialplans mais complexos podem ser necessários métodos alternativos.
Cada extensão é uma função LUA que é executada quando um canal chega a essa extensão. A função de extensão recebe o contexto atual e a extensão como os dois primeiros argumentos. Eles podem ser ignorados com segurança, se desejado. Não há prioridades (cada função de extensão é tratada como prioridade 1 pelo resto do Asterisk® SCF™). Os padrões são permitidos exatamente como em extensions.conf e a ordem de correspondência é idêntica.
extensions = {
default = {
[ "100" ] = function(context, extension)
app.playback( "please-hold" )
app.dial( "SIP/100" , 60 )
end;
[ "101" ] = function(c, e)
app.dial( "SIP/101" , 60 )
end;
}
|
O arquivo extensions.lua pode ser recarregado, recarregando o módulo
pbx_lua.
*CLI> module reload pbx_lua
Se houver erros no arquivo, eles serão relatados (no *CLI>) e o arquivo extensions.lua existente permanecerá em uso (tal como é com o CONF e AEL).
Os canais que existiam antes do comando reload ser emitido também continuarão a usar o arquivo extensions.lua existente.
Somente após o arquivo ser validado pelo módulo pbx_lua.so que será carregado no CORE/PBX em produção. Lembrando que é altamente recomendado que faça uso somente da versão
Certified do Asterisk® SCF™ para produção junto ao seu cliente.
OBS: Os erros de tempo de execução são registrados e o canal no qual o erro ocorreu é desligado. Logo nunca faça manutenção em seu Dialplan em produção.
Referência Dialplan para LUA
Abaixo está uma referência rápida que pode ser usada para traduzir os conceitos tradicionais do Dialplan em extensions.conf para o poder do extensions.lua.
- Padrões de extensões (Extension Patternes);
- Include em contextos (Context Includes);
- Rotações (Loops);
- Variáveis (Variables);
- Formularios (Applications);
- Macros/GoSub;
- Goto;
Padrões de extensões (Extension Patternes)
A sintaxe de correspondência de padrão de extensão na lógica funciona da mesma forma para extensions.conf e extensions.lua.
extensions.conf
[users]
exten => _1XX, 1 ,Dial(SIP/${EXTEN})
exten => _2XX, 1 ,Voicemail(${EXTEN: 1 })
|
extensions.lua
extensions = {}
extensions.users = {}
extensions.users[ "_1XX" ] = function(c, e)
app.dial( "SIP/" .. e)
end
extensions.users[ "_2XX" ] = function(c, e)
app.voicemail( "1" .. e:sub( 2 ))
end
|
Include em contextos (Context Includes)
extensions.conf
[users]
exten => 100 , 1 ,Noop
exten => 100 ,n,Dial( "SIP/100" )
[demo]
exten => s, 1 ,Noop
exten => s,n,Playback(demo-congrats)
[ default ]
include => demo
include => users
|
extensions.lua
extensions = {
users = {
[ 100 ] = function()
app.dial( "SIP/100" )
end;
};
demo = {
[ "s" ] = function()
app.playback(demo-congrats)
end;
};
default = {
include = { "demo" , "users" };
};
}
|
Rotações (Loops)
extensions.conf
exten => 100 , 1 ,Noop
exten => 100 ,n,Set(i= 0 )
exten => 100 ,n,While($[i < 10 ])
exten => 100 ,n,Verbose(i = ${i})
exten => 100 ,n,EndWhile
|
extensions.lua
i = 0
while i < 10 do
app.verbose( "i = " .. i)
end
|
Variáveis (Variables)
extensions.conf
exten => 100 , 1 ,Set(my_variable=my_value)
exten => 100 ,n,Verbose(my_variable = ${my_variable})
|
extensions.lua
channel.my_variable = "my_value"
app.verbose( "my_variable = " .. channel.my_variable:get())
|
Formularios (Applications)
extensions.conf
exten => 100 , 1 ,Dial( "SIP/100" ,,m)
|
extensions.lua
app.dial( "SIP/100" , nil, "m" )
|
Macros/GoSub
As MACROS pode ser definidas em pbx_lua nomeando um contexto "macro-*" assim como em extensions.conf, mas geralmente onde você usaria macros ou GoSub em extensions.conf você simplesmente usaria uma função em LUA.
extensions.conf
[macro-dial]
exten => s, 1 ,Noop
exten => s,n,Dial(${ARG1})
[ default ]
exten => 100 , 1 ,Macro(dial,SIP/ 100 )
|
extensions.lua
extensions = {}
extensions. default = {}
function dial(resource)
app.dial(resource)
end
extensions. default [ 100 ] = function()
dial( "SIP/100" )
end
|
GoTo
Embora GoTo seja um STAPLE (grampo) extensions.conf, geralmente deve ser evitado em PBX_LUA em favor de funções.
extensions.conf
[ default ]
exten => 100 , 1 ,Goto( 102 , 1 )
exten => 102 , 1 ,Playback( "demo-thanks" )
exten => 102 ,n,Hangup
|
extensions.lua
extensions = {}
extensions. default = {}
function do_hangup()
app.playback( "demo-thanks" )
app.hangup()
end
extensions. default [ 100 ] = function()
do_hangup()
end
|
A função app.goto() não funcionará como esperado em pbx_lua em Asterisk® SCF™ versão 1.8 ou inferior. Se você precisar usar a função app.goto() deve retornar manualmente o controle para o Asterisk® SCF™ usando o return para a função de extensão do Dialplan, caso contrário, a execução continuará após a chamada para app.goto(). As chamadas para app.goto() devem funcionar como esperado para o Asterisk® SCF™ versão 10 e superiores, mas ainda não devem ser necessarias na maioria dos casos.
function extension_function(c, e)
return app. goto ( "default" , "100" , 1 )
-- without that 'return' the rest of the function would execute normally
app.verbose( "Did you forget to use 'return'?" )
end
|
Tkat's All Folks! (É por hoje é só, pessoal!).
Temos uma comunidade, ainda pequena no Telegram, para estudos exclusivos
em Dialplan com LUA no Asterisk® SCF™, você é bem vindo! (Telegram:
https://t.me/asteriskluabr).
Deixe um comentário