Asterisk® SCF™ + LUA: Configuração do LUA Dialplan (parte 01)

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.lua
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.

In Asterisk 1.8, use return
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).

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.