forked from SimplesIP/pabx-app
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
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; |
|
} |
|
?>
|