Asterisk® SCF™ + LUA: início rápido
Faz alguns anos, que venho postando vários artigos sobre o uso do Dialplan em LUA (extensions.lua) no Asterisk® SCF™. Esta é uma maneira divertida de escrever Dialplans flexíveis e poderosos. Mas para tentar esta forma de escrever Dialplans, você precisa gastar um certo tempo: instalando as bibliotecas necessárias, reconstruindo no Asterisk® SCF™ as opções necessárias.
Além disso, muitos usuários do Asterisk® SCF™ têm experiências diferentes: alguns estão mais próximos da administração do sistema, ou mesmo da telefonia tradicional, do que da programação. Além das especificidades da telefonia - é melhor não carregar sistemas em execução com experimentos desconhecidos, mas você realizar testes e experimentos em seu laptop - você tem que bagunçar o sistema. Em geral, há muitos motivos para "estudar e colocar a mão na massa!".
Neste post, quero mostrar a todos que desejam e trabalham com Asterisk® SCF™, como, usar o docker, para você poder obter rapidamente uma amostra dos scripts flexíveis em LUA. E então decida se vai usar ou não na prática.
Fonte: Internet, imagens free
Palavra introdutória
No âmbito do trabalho em vários dos meus projetos, seguindo a tendência moderna de embalar tudo em contentores, preparei uma imagem astolua (Asterisk® SCF™ + LUA). O Dockerfile contém comandos para instalar Asterisk® SCF™ na sua versão 11, e LUA na sua versão 5.1, luarocks (gerenciador de pacotes para lua), luamongo (driver para acessar mongodb), alguns pacotes LUA Rocks. No futuro, você pode pegar apenas coisas úteis no repositório docker-astolua e construir seu burro de carga.
Sem dúvida, a vantagem do docker é a capacidade de baixar a imagem, realizar testes-experimentos-testes e, em seguida, excluir as imagens, deixando seu sistema operacional limpo e na ordem usual.
Com base na imagem astolua, criaremos nossa própria imagem de trabalho, na qual usaremos os arquivos de teste de configuração do Asterisk® SCF™ e o Dialplan fazendo uso do extensions.lua.
Preparação
Precisamos do docker. Se você não o instalou, instale primeiro o docker (documentação oficial). Também precisamos do git instalado. Além disso, informo que este post foi elaborado sobre o sistema operacional Ubuntu 14.04. Logo acredito que para as versões mais atuais (20.04), será necessário algumas adaptações. Se você estiver usando outro Linux, em teoria não deve haver diferenças nos comandos, mas as nuances não são excluídas.
Baixe a imagem astolua
Nós compactamos a imagem (atenção, a imagem será baixada do repositório hub.docker.com com um tamanho de ~600 MB).
# docker pull antirek/astolua
Amostra
Clone docker-astolua-sample - este é um conjunto de arquivos pré-preparado para este artigo.# git clone https://github.com/antirek/docker-astolua-sample.git # cd docker-astolua-sample
Agora vamos parar na amostra e ver o conteúdo do diretório. Arquivo
Dockerfile
Para construir nossa imagem de trabalho. Nele, indicamos que estamos tomando astolua como base. Em seguida, adicionamos o script autoload after_start.sh, que será executado quando o contêiner iniciar. O log do console do Asterisk® SCF™ será exibido no console onde iniciamos o contêiner.
Crie um arquivo
Dentro do container do Docker vamos criar um arquivo para construir a imagem de nosso Dockerfile de amostra.
# docker build -t "astolua:sample" .
O arquivo de execução
Dentro do arquivo está um comando docker para iniciar um contêiner com base na imagem de amostra, devemos configurar alguns recursos necessários.
docker run \
-v /etc/localtime:/etc/localtime:ro \
-v $(pwd)/store/etc/asterisk:/etc/asterisk \
-v $(pwd)/store/var/log/asterisk:/var/log/asterisk \
-v $(pwd)/store/var/menu:/var/menu/ \
--net=host \
-i -t "astolua:sample"
A pasta de armazenamento
A pasta de armazenamento contém arquivos de configuração do Asterisk® SCF™ (aqueles que geralmente estão localizados em /etc/asterisk) e pastas para registros e menus de voz.
O comando run é o mais interessante porque os recursos necessários para o contêiner são especificados aqui. Por exemplo, com a opção -v $(pwd)/store/etc/asterisk:/etc/asterisk, especificamos que os arquivos de configuração de nossa pasta de armazenamento devem estar dentro do contêiner em seu lugar em /etc/asterisk.
Por que os comandos estão em arquivos? É conveniente editar comandos em arquivos, uma vez que isso acelera o tempo para testar mudanças em comandos com opções diferentes, e também todas as mudanças estão sob controle de versão. E também é conveniente transferir as opções para docker-compose mais tarde se a imagem for compartilhada com outras pessoas.
Vamos voltar ao console.
Vamos fazer uma imagem de astolua: sample (no diretório onde clonamos docker-astolua-sample)
# ./build
Iniciamos o Asterisk® SCF™ (se você já tiver um Asterisk® SCF™ ou outro serviço em execução nas portas 5060, 5061 e 5062 de sua máquina, é melhor interrompê-lo primeiro).
./run
O log de inicialização do Asterisk® SCF™ deve cair no console. Você pode testar a conexão.
O arquivo de configuração do Asterisk® SCF™, sip.conf contém dois assinantes 101 e 102 (senha 1234), e o arquivo queues.conf contém a fila 1234 à qual esses dois assinantes são adicionados. Configure seu EndPoint/EndDevice (softphone ou hardphone) para os assinantes e tente fazer uma chamada do assinante 101 para o assinante 102. (Não há troncos para conexão com serviços de ITSP/VoIP externos ou quaisquer configurações de hardware, portanto, testaremos o Dialplan em chamadas locais). As informações sobre a chamada entre os assinantes devem aparecer no console Asterisk® SCF™.
Os assinantes estão funcionando, as chamadas estão sendo completadas? Ok, então o Asterisk® SCF™ no contêiner do docker funciona como deveria.
Dialplan em LUA (extensions.lua)
O Dialplan em lua está localizado no arquivo extensions.lua. Nos arquivos de configuração do Asterisk® SCF™ na pasta store/etc/asterisk, há um exemplo de um Dialplan em LUA 100% funcional.
Este arquivo deve descrever corretamente as extensões, variáveis e HITS (na terminologia LUA, são "tabelas").
A tabela de extensões contém contextos e extensões correspondentes. Tudo é como em um Dialplan tradicional. Mas cada extensão é processada por uma função própria, na qual você já pode fazer o que quiser em LUA, enquanto interage com o Asterisk® SCF™ através da app e das tabelas de canais.
O exemplo mais simples
extensions = {
["internal"] = {
["_1XX"] = function (context, extension)
-- faça alguma coisa --
app.dial('SIP/'..extension);
-- faça algo de novo --
end;
}
}
Você pode ver que o aplicativo Dialplan está disponível através do aplicativo, aceita todos os mesmos parâmetros do Dialplan tradicional. Todos os aplicativos do Dialplan estão disponíveis via app .
A variável de canal dá acesso às variáveis de canal. É assim que, por exemplo, obtemos dialstatus.
extensions = {
["internal"] = {
["_1XX"] = function (context, extension)
-- faça alguma coisa --
app.dial('SIP/'..extension);
local dialstatus = channel["DIALSTATUS"]:get();
app.noop('dialstatus: '..dialstatus);
end;
}
}
Você pode alterar extensions.lua e, em seguida, usar o comando module reload pbx_lua.so no *CLI> do Asterisk® SCF™ para reler extensions.lua. O Asterisk® SCF™ irá verificar a sintaxe LUA, e se tudo estiver ok, então carregar para execução - você pode testar as mudanças.
O que mais você pode fazer no dialplan lua?
Por exemplo, lidar com o dialstatus é flexível, ele sempre, será retornado pela função Dial(). Não há necessidade de reinventar esses Goto(s-${DIALSTATUS},1). Agora você pode escrever uma verificação de status humanamente.
extensions = {
["internal"] = {
["_1XX"] = function (context, extension)
app.dial('SIP/'..extension);
local dialstatus = channel["DIALSTATUS"]:get();
if dialstatus == 'BUSY' then
-- faça alguma coisa --
elseif dialstatus == 'CHANUNAVAIL' then
-- fazer outra coisa --
end;
end;
}
}
No exemplo extensions.lua, há um exemplo de um IVR/URA simples: chamando 200, você ouvirá uma entrada do arquivo /var/menu/demo e poderá prosseguir pressionando 1 ou 2.
local ivr = function (context, extension)
app.read("IVR_CHOOSE", "/var/menu/demo", 1, nil, 2, 3);
local choose = channel["IVR_CHOOSE"]:get();
if choose == '1' then
app.queue('1234');
elseif choose == '2' then
dial('internal', '101');
else
app.hangup();
end;
end;
Para uma pessoa que escreveu algumas dezenas de linhas de um plano de discagem tradicional (extensions.conf), tudo deve ser familiar aqui. Além disso, todo o poder dos pacotes LUA e luarocks aparece. Espero que seja óbvio que aqui no Dialplan você pode enviar SMS, e-mail, colocar dados no banco de dados, tirar dados do banco de dados, e o banco de dados pode ser qualquer um: MariaDB, PostgreSQL, MySQL, Oracle, SQLite e mongoDB, redis, etc., fazer uma chamada de comando, iniciar outra chamada, faça um roteamento bacana de uma chamada em troncos, etc., sem esquecer, é claro, que tudo funciona dentro do quadro de um asterisco, e é melhor resolver todas as tarefas "pesadas" separadamente.
Qual é o próximo?
Eu sugiro:
- veja a documentação oficial do Asterisk e LUA - Nele tem exemplos e comparações suficientes para você começar;
- veja um exemplo de Dialplan em LUA do Igmar, onde a maior parte da funcionalidade do PBX é implementada: ligações para assinantes, cadastro / cadastro de operadores de fila, webhooks para chamadas entrantes, roteamento dependendo do dia da semana e horário do dia.
- "Corte" algo de sua autoria, ou seja recrie seu Dialplan em LUA, com as suas necessidades :)
- 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)
Espero que este post seja útil para um início rápido, e que você encontre uma noite de inverno agradável! E tente escrever seus Dialplans em LUA.
Fonte: Harb
Deixe um comentário