sábado, 3 de setembro de 2016

Asterisk - Monitorando ligações gravadas através de página em PHP

O que precisamos

Para que tudo funcione, é necessário ter um servidor Asterisk funcionando. Além disso, vamos precisar:
  • 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`)
)

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`)
)

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)

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.

Referencia: https://www.vivaolinux.com.br/artigo/Asterisk-Monitorando-ligacoes-gravadas-atraves-de-pagina-em-PHP

Nenhum comentário:

Postar um comentário