Asterisk - Monitorando ligações gravadas através de página em PHP
Neste artigo mostrarei como monitorar ligações gravadas pelo Asterisk através de uma página em PHP. Além de escutar as gravações, você poderá filtrá-las e exportar os registros para uma planilha.
O que precisamos
Para que tudo funcione, é necessário ter um servidor Asterisk funcionando. Além disso, vamos precisar:
Não mostrarei como configurar nenhum servidor, somente instalaremos o MonitorAsterisk e modificar algumas configurações para que o mesmo funcione.
Vamos começar clonando o MonitorAsterisk no seu servidor Apache:
git clone https://github.com/hudymoreira/MonitorAsterisk/
Edite o arquivo DbHelper.php para conficurar o acesso ao banco de dados MySQL:
vi ~/MonitorAsterisk/app/DbHelper.php
Na string de conexão, altere para que funcione com o seu banco de dados e usuário.
Tabela "Ligacoes" contem todos os dados pertinentes a cada ligação, incluindo o nome do arquivo de áudio, e a duração de cada um.
Tabela "Usuario" contem somente os usuários que você deseja associar a cada ligação:
adiante, iremos montar um script que depende da nomenclatura do arquivo de áudio para alimentar o banco de dados. No extensions.conf do seu Asterisk, altere suas configurações, para se adequar a algo parecido com isso:
O arquivo gerado terá o seguinte formato:
[data]_[hora]_[ramal]_[numro do telefone].wav
O script usará o delimitador "_" para extrair as informações que precisa do nome do arquivo.
E, por fim, vamos criar um link simbólico na pasta raiz da nossa página MonitorAsterisk, apontando o diretório onde se encontram as ligações. Ex.:
cd /var/www/html/MonitorAsterisk
sudo ln -s /var/spool/asterisk/monitor/ audio
Chamei o link de 'audio', porém você pode mudar, desde que você edite os arquivos PHP correspondentes a essa alteração, onde fica a instrução que carrega os arquivos na página.
No arquivo /MonitorAsterisk/views/ligacoes.tpl.php, você pode mudar o "src" para o que quiser, desde que o link seja o mesmo.
Neste ponto, você deve criar por conta própria uma melhor forma de automatizar esse script.
Caso já tenha massa crítica para testar, você pode filtrar as ligações que deseje escutar. Seguem alguns screenshots:
Obrigado...
- Um banco de dados MySQL;
- Um servidor Apache;
- Alterar o nome dos arquivos de áudio salvos pelo Asterisk;
- Criar um Script que alimente o banco de dados.
Não mostrarei como configurar nenhum servidor, somente instalaremos o MonitorAsterisk e modificar algumas configurações para que o mesmo funcione.
Vamos começar clonando o MonitorAsterisk no seu servidor Apache:
git clone https://github.com/hudymoreira/MonitorAsterisk/
Edite o arquivo DbHelper.php para conficurar o acesso ao banco de dados MySQL:
vi ~/MonitorAsterisk/app/DbHelper.php
Na string de conexão, altere para que funcione com o seu banco de dados e usuário.
$this->con = new PDO("mysql:host=localhost;dbname=SeuBancoDeDados", "usuario", "senha");
Criando Tabelas
Criaremos agora duas tabelas no seu banco de dados, que serão alimentadas pelo script que é consumado pelo PHP:Tabela "Ligacoes" contem todos os dados pertinentes a cada ligação, incluindo o nome do arquivo de áudio, e a duração de cada um.
CREATE TABLE `Ligacoes` (
`id_ligacao` INT(11) NOT NULL AUTO_INCREMENT,
`ramal` INT(11) NULL DEFAULT NULL,
`data_ligacao` DATETIME NULL DEFAULT NULL,
`arquivo` VARCHAR(254) NULL DEFAULT NULL,
`numero` VARCHAR(20) NULL DEFAULT NULL,
`duracao` DOUBLE NULL DEFAULT NULL,
`bk` BIT(1) NULL DEFAULT NULL,
PRIMARY KEY (`id_ligacao`)
)
`id_ligacao` INT(11) NOT NULL AUTO_INCREMENT,
`ramal` INT(11) NULL DEFAULT NULL,
`data_ligacao` DATETIME NULL DEFAULT NULL,
`arquivo` VARCHAR(254) NULL DEFAULT NULL,
`numero` VARCHAR(20) NULL DEFAULT NULL,
`duracao` DOUBLE NULL DEFAULT NULL,
`bk` BIT(1) NULL DEFAULT NULL,
PRIMARY KEY (`id_ligacao`)
)
Tabela "Usuario" contem somente os usuários que você deseja associar a cada ligação:
CREATE TABLE `Usuario` (
`id_usuario` INT(11) NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(254) NULL DEFAULT NULL,
`ramal` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id_usuario`)
)
`id_usuario` INT(11) NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(254) NULL DEFAULT NULL,
`ramal` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id_usuario`)
)
Asterisk, string de salvamento e link simbólico para o PHP (Apache)
Agora, vamos ligar com a forma que o áudio é salvo pelo Asterisk.adiante, iremos montar um script que depende da nomenclatura do arquivo de áudio para alimentar o banco de dados. No extensions.conf do seu Asterisk, altere suas configurações, para se adequar a algo parecido com isso:
exten => _XX.,1,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d_%H.%M.%S)}_${CDR(src)}_${CDR(dst)}_${CDR(billsec)})
exten => _XX.,n,Mixmonitor(${MONITOR_FILENAME}.wav)
exten => _XX.,n,Dial(SIP/${EXTEN}@tronco-que-centraliza-todas-ligacoes,50)
exten => _XX.,n,Mixmonitor(${MONITOR_FILENAME}.wav)
exten => _XX.,n,Dial(SIP/${EXTEN}@tronco-que-centraliza-todas-ligacoes,50)
O arquivo gerado terá o seguinte formato:
[data]_[hora]_[ramal]_[numro do telefone].wav
O script usará o delimitador "_" para extrair as informações que precisa do nome do arquivo.
E, por fim, vamos criar um link simbólico na pasta raiz da nossa página MonitorAsterisk, apontando o diretório onde se encontram as ligações. Ex.:
cd /var/www/html/MonitorAsterisk
sudo ln -s /var/spool/asterisk/monitor/ audio
Chamei o link de 'audio', porém você pode mudar, desde que você edite os arquivos PHP correspondentes a essa alteração, onde fica a instrução que carrega os arquivos na página.
No arquivo /MonitorAsterisk/views/ligacoes.tpl.php, você pode mudar o "src" para o que quiser, desde que o link seja o mesmo.
<source src="audio/<?php echo $ligacao->getArquivo();?>" type="audio/wav">
Script que alimenta as tabelas
O script a seguir varre o diretório /var/spool/asterisk/monitor/ e testa cada arquivo, divide os delimitadores no nome e preenche as variáveis. E com o 'sox', extrai a duração de cada áudio em segundos. Com as variáveis preenchidas, ele verifica se a ligação não foi registrada. Caso não, ele grava a informação no banco.
#!/bin/bash
local="/var/spool/asterisk/monitor"
cd $local
for i in `ls`; do
ramal=`cut -d_ -f 3 <<< $i`
data=`cut -d_ -f 1 <<< $i`
hora=`cut -d_ -f 2 <<< $i`
numero=`cut -d_ -f 4 <<< $i`
dataL="$data $(sed "s/./:/g" <<< $hora)"
arquivo=$i
query=`echo "select ramal from Ligacoes where arquivo = '$arquivo' " | mysql MeuBandoDeDados -u usuario -pSenha`
if [ ${#query} -lt 4 ];then
sox $i -n stat 2>/tmp/Mtmp.txt
tmp=`cat /tmp/Mtmp.txt | grep Len`
duracao=`echo $tmp | cut -d: -f2`
rm /tmp/Mtmp.txt
echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values ($ramal,'$dataL','$arquivo','$numero',$duracao,0)" | mysql MLigacao -u root -pmaster
fi
done
Neste ponto, você deve criar por conta própria uma melhor forma de automatizar esse script.
Utilização - filtro
Se tudo estiver ok, você poderá, através do seu navegador, acessar a página de monitoramento. Óbvio que se não tiver ligações, ou caso tenha e o Script não for rodado nenhuma vez, não terá nada para ver.Caso já tenha massa crítica para testar, você pode filtrar as ligações que deseje escutar. Seguem alguns screenshots:
Utilização - Ligações
Nessa lista, temos o áudio a ser escutado e os detalhes da ligação:Utilização - Exportar para o Excel
Você pode exportar o resultado das pesquisa para o Excel, caso precise:Utilização - Usuário
Caso queira associar o nome de usuário à um ramal ,você pode fazer isso por aqui. Bom é isso.Obrigado...
root@asterisk13:~# bash /sbin/mixmonitor.sh
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0)' at line 1