You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

257 lines
8.2 KiB

#!/usr/bin/php -q
<?php
/* * *****************************************************************************************
* Data: 17/04/2019.
* Autor: Amarildo Pereira
* Descrição: Monitoramento dos eventos gerados na central.
* Objetivo: Prover dados para para monitoramento em tempo real, para aplicações como supervi-
* sor, agente, diacador etc.
* Funcoes:
* -sGravaLog -> Grava log de erros gerados pelo serviç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çoes gené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 é 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ão for informado.
*/
GetDaemon($notDaemon);
/*
* Handler de conexã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çõ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ão for chamado com daemon sai sem executar nada.
*/
if ($notDaemon) {
return 0;
}
$pid = pcntl_fork();
if ($pid) {
exit(0); //success
}
// 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;
}
?>