#!/usr/bin/php -q 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 } /* PIDFile SYSTEMD * SYSTEMD irá 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; } ?>