|
|
|
|
#!/usr/bin/php -q
|
|
|
|
|
<?php
|
|
|
|
|
/* * *****************************************************************************************
|
|
|
|
|
* Data: 17/04/2019.
|
|
|
|
|
* Autor: Amarildo Pereira
|
|
|
|
|
* Descri<EFBFBD><EFBFBD>o: Monitoramento dos eventos gerados na central.
|
|
|
|
|
* Objetivo: Prover dados para para monitoramento em tempo real, para aplica<EFBFBD><EFBFBD>es como supervi-
|
|
|
|
|
* sor, agente, diacador etc.
|
|
|
|
|
* Funcoes:
|
|
|
|
|
* -sGravaLog -> Grava log de erros gerados pelo servi<EFBFBD>o.
|
|
|
|
|
* ***************************************************************************************** */
|
|
|
|
|
error_reporting(E_ALL);
|
|
|
|
|
ini_set('display_errors', 1);
|
|
|
|
|
ini_set("memory_limit", "512M");
|
|
|
|
|
//define("TEMPO_CICLO", 10000000);
|
|
|
|
|
define("TEMPO_CICLO", 100);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Inclui fun<EFBFBD>oes gen<EFBFBD>ricas.
|
|
|
|
|
*/
|
|
|
|
|
include("util/constantes.php");
|
|
|
|
|
include("util/util.php");
|
|
|
|
|
include("util/funcoesAmi.php");
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Registra o numero de erros em uma operacao.
|
|
|
|
|
*/
|
|
|
|
|
$numErros = 0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Para rodar como um processo normal <EFBFBD> preciso passar "N" como primeiro parametro.
|
|
|
|
|
*/
|
|
|
|
|
$notDaemon = true; // isset($argv[1]) && ( strtoupper($argv[1]) === 'N');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Mostra o help quando passodo --help no primeiro argumento.
|
|
|
|
|
*/
|
|
|
|
|
GetQueudHelp();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Inicializa o daemom quando N n<EFBFBD>o for informado.
|
|
|
|
|
*/
|
|
|
|
|
GetDaemon($notDaemon);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Handler de conex<EFBFBD>o com o servidor manager.
|
|
|
|
|
*/
|
|
|
|
|
$socket = null;
|
|
|
|
|
|
|
|
|
|
$tabelaDacs = "ast_eventos_dacs";
|
|
|
|
|
$path = "/var/log/queue_log.log";
|
|
|
|
|
$pathQueue = "/var/log/asterisk/queue_log";
|
|
|
|
|
$pathQueueOrg = "/var/log/asterisk/queue_log.original";
|
|
|
|
|
$fileQlogData = sprintf("%sqlogdata.dat", substr(__FILE__, 0, strpos(__FILE__, basename(__FILE__))));
|
|
|
|
|
|
|
|
|
|
/* Eventos tratados no log */
|
|
|
|
|
$evtAll = array('COMPLETEAGENTRAMAL', 'COMPLETECALLERRAMAL', 'EXITWITHTIMEOUT', 'TIMEOUT', 'CHAMANDO', 'NOANSWER', 'COMPLETAAGENT', 'COMPLETACALLER', 'BUSY', 'ATENDIDA', 'TRANSBORDANDO', 'TRANSBORDADO', 'ABANDON', 'COMPLETEAGENT', 'COMPLETECALLER', 'CONNECT', 'ENTERQUEUE', 'TRANSFER', 'BUSYS', 'NOANSWERS');
|
|
|
|
|
|
|
|
|
|
/* Eventos relacionados ao status das chamadas */
|
|
|
|
|
$evtCall = array("CHAMANDO", "COMPLETACALLER", "COMPLETAAGENT", "COMPLETEAGENTRAMAL", "COMPLETECALLERRAMAL", "BUSYS", "NOANSWERS");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
/*
|
|
|
|
|
* Registro o inicio da operacao.
|
|
|
|
|
*/
|
|
|
|
|
sGravaLog(sprintf("Server Start: %s [ok]\n", date("Y-m-d H:i:s")));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
declare(ticks = 1);
|
|
|
|
|
pcntl_signal(SIGTERM, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGHUP, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGINT, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGKILL, "sig_handler");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Recupera dados de controle.
|
|
|
|
|
*/
|
|
|
|
|
if (!$data = ReadVarFile($fileQlogData)) {
|
|
|
|
|
$data = array("seek" => 0, "fsize" => 0, "filemv" => 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$fseek = $data['seek'];
|
|
|
|
|
$fsize = $data['fsize'];
|
|
|
|
|
$filemv = $data['filemv'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
if ($fsize != filesize($pathQueue)) {
|
|
|
|
|
sGravaLog(sprintf("Lendo: %s Size: %s [ok]\n", date("Y-m-d H:i:s"), $fsize));
|
|
|
|
|
/*
|
|
|
|
|
* Abre os arquivos da fila.
|
|
|
|
|
*/
|
|
|
|
|
$handle = fopen($pathQueue, 'r');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Posiciona o ponteiro para continuar a percorrer o arquivo.
|
|
|
|
|
*/
|
|
|
|
|
fseek($handle, $fseek);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Importa os dados para o banco.
|
|
|
|
|
*/
|
|
|
|
|
while (!feof($handle)) {
|
|
|
|
|
|
|
|
|
|
$linha = trim(@fgets($handle));
|
|
|
|
|
|
|
|
|
|
list($UID1, $UID2, $FILA, $AGENTE, $EVENTO, $PARAM1, $PARAM2, $PARAM3, $PARAM4) = explode("|", $linha);
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se o envento esta na lista de acetos.
|
|
|
|
|
*/
|
|
|
|
|
if (array_search($EVENTO, $evtAll) !== false) {
|
|
|
|
|
/*
|
|
|
|
|
* Eventos relacionados a chamadas e transferencias recebem um tratamento diferente para os params.
|
|
|
|
|
*/
|
|
|
|
|
if ($EVENTO == "TRANSFER") {
|
|
|
|
|
$PARAM1 = $PARAM3;
|
|
|
|
|
} else if (array_search($EVENTO, $evtCall) !== false) {
|
|
|
|
|
list($PARAM1, $PARAM2, $PARAM3, $PARAM4) = explode(",", $PARAM1);
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
$query = "insert into $tabelaDacs (uid1,uid2,fila,agente,evento,param1,param2,param3,param4) values ('$UID1','$UID2','$FILA','$AGENTE','$EVENTO','$PARAM1','$PARAM2','$PARAM3','$PARAM4')";
|
|
|
|
|
if (!pg_query($dbcon, $query)) {
|
|
|
|
|
RaiseExcept("Erro ao atualizar Base de dados: Cmd:[{$query}]");
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception $dbError) {
|
|
|
|
|
sGravaLog(sprintf("Database Error: %s [%s]\n", date("Y-m-d H:i:s"), $dbError->getMessage()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Posicao atual do ponteiro.
|
|
|
|
|
*/
|
|
|
|
|
$fseek = ftell($handle);
|
|
|
|
|
fflush ($handle);
|
|
|
|
|
fclose($handle);
|
|
|
|
|
|
|
|
|
|
$fsize = filesize($pathQueue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$horamv = ((int) date('H')) == 0;
|
|
|
|
|
$dataAtual = date('Y-m-d');
|
|
|
|
|
if (($filemv != $dataAtua) && $horamv) {
|
|
|
|
|
$filemv = $dataAtual;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Cria uma copia de seguranca do arquivo.
|
|
|
|
|
*/
|
|
|
|
|
exec("cat {$pathQueue} >> {$pathQueueOrg}");
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Apaga os dados do arquivo.
|
|
|
|
|
*/
|
|
|
|
|
if (TruncFile($pathQueue)) {
|
|
|
|
|
$fseek = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Salva dados para controle.
|
|
|
|
|
*/
|
|
|
|
|
SaveVarToFile(array("seek" => $fseek, "fsize" => filesize($pathQueue), "filemv" => $filemv), $fileQlogData);
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
$numErros++;
|
|
|
|
|
sGravaLog(sprintf("Operator Error: %s [%s]\n", date("Y-m-d H:i:s"), $ex->getMessage()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se o processo deve ser encerrado
|
|
|
|
|
*/
|
|
|
|
|
if (sig_status())
|
|
|
|
|
break;
|
|
|
|
|
/*
|
|
|
|
|
* Tempo do ciclo de atualiza<EFBFBD><EFBFBD>es.
|
|
|
|
|
*/
|
|
|
|
|
usleep(TEMPO_CICLO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sGravaLog(sprintf("Server Stop: %s [ok]\n", date("Y-m-d H:i:s")));
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
sGravaLog(sprintf("Server Error: %s [%s]\n", date("Y-m-d H:i:s"), $ex->getMessage()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sGravaLog($log) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Log do sistema
|
|
|
|
|
*/
|
|
|
|
|
$patLog = "/var/log/asterisk/qlogd.log";
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Registra no arquivo de log do sistema.
|
|
|
|
|
*/
|
|
|
|
|
WriteLog(trim($log) . "\n", $patLog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetDaemon($notDaemon) {
|
|
|
|
|
/*
|
|
|
|
|
* Se o script n<EFBFBD>o for chamado com daemon sai sem executar nada.
|
|
|
|
|
*/
|
|
|
|
|
if ($notDaemon) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$pid = pcntl_fork();
|
|
|
|
|
if ($pid) {
|
|
|
|
|
exit(0); //success
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* PIDFile SYSTEMD
|
|
|
|
|
* SYSTEMD ir<EFBFBD> monitorar esse pid para verificar se ainda ativo
|
|
|
|
|
*/
|
|
|
|
|
$PIDFile = fopen( "/var/lock/subsys/qlog.pid", "w+" );
|
|
|
|
|
$pid = getmypid( )
|
|
|
|
|
if( $pid == false ){
|
|
|
|
|
exit( 1 );
|
|
|
|
|
}
|
|
|
|
|
fwrite( $PIDFile, $pid);
|
|
|
|
|
fclose( $PIDFile );
|
|
|
|
|
|
|
|
|
|
// posix_setsid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetQueudHelp() {
|
|
|
|
|
global $argc, $argv;
|
|
|
|
|
|
|
|
|
|
$arg = isset($argv[1]) ? $argv[1] : '';
|
|
|
|
|
|
|
|
|
|
if ($argc && ((stripos($arg, '--h') !== false) || (stripos($arg, '-h') !== false) || (stripos($arg, '/h') !== false))) {
|
|
|
|
|
return displayUsage();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function displayUsage() {
|
|
|
|
|
echo "-------------------------------------------------------------------------------------------------------\n";
|
|
|
|
|
echo "- Servico de sincronizacao de dados em tempo real! -\n";
|
|
|
|
|
echo "-------------------------------------------------------------------------------------------------------\n";
|
|
|
|
|
echo "- Para rodar como um processo normal passe \"N\" como primeiro argumento:\"./amid.php N\"! -\n";
|
|
|
|
|
echo "- Para rodar como Daemon nao passe nenhum argumemento argumento:\"./amid.php \"! -\n";
|
|
|
|
|
echo "-------------------------------------------------------------------------------------------------------\n";
|
|
|
|
|
echo "\n";
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sig_handler($signo) {
|
|
|
|
|
global $statusSignal, $handle, $fseek, $fileQlogData, $pathQueue;
|
|
|
|
|
$statusSignal = 1;
|
|
|
|
|
if ($handle) {
|
|
|
|
|
$fseek = ftell($handle);
|
|
|
|
|
}
|
|
|
|
|
SaveVarToFile(array("seek" => $fseek, "fsize" => filesize($pathQueue), "filemv" => $filemv), $fileQlogData);
|
|
|
|
|
sGravaLog(sprintf("sig_handler: %s Signo: %s [ok]\n", date("Y-m-d H:i:s"), $signo));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sig_status() {
|
|
|
|
|
global $statusSignal;
|
|
|
|
|
pcntl_signal_dispatch();
|
|
|
|
|
return $statusSignal;
|
|
|
|
|
}
|
|
|
|
|
?>
|