|
|
|
|
#!/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", 30000000);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
GetSupervisorHelp();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Inicializa o daemom quando N n<EFBFBD>o for informado.
|
|
|
|
|
*/
|
|
|
|
|
GetDaemon($notDaemon);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Handler de conex<EFBFBD>o com o servidor manager.
|
|
|
|
|
*/
|
|
|
|
|
$socket = null;
|
|
|
|
|
|
|
|
|
|
$paramAmi = ['host' => '192.168.115.2', 'username' => 'monitor', 'secret' => '@monitorSip9102#'];
|
|
|
|
|
//$paramAmi = [];
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
declare(ticks = 1);
|
|
|
|
|
$statusSignal = 0;
|
|
|
|
|
pcntl_signal(SIGTERM, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGHUP, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGUSR1, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGINT, "sig_handler");
|
|
|
|
|
|
|
|
|
|
sGravaLog(sprintf("Server Start: %s [ok]\n", date("Y-m-d H:i:s")));
|
|
|
|
|
/*
|
|
|
|
|
* Inicia uma conexao com o manager.
|
|
|
|
|
*/
|
|
|
|
|
if (AmiConnect($paramAmi)) {
|
|
|
|
|
AmiIniciaMonitor();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$start = 0;
|
|
|
|
|
while (true) {
|
|
|
|
|
try {
|
|
|
|
|
/*
|
|
|
|
|
* Monitora se houve desconexao, e reconecta-se se necessario.
|
|
|
|
|
*/
|
|
|
|
|
AmiReConnect($paramAmi);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Analisa o fluxo de mensagens do manager.
|
|
|
|
|
*/
|
|
|
|
|
AmiAnalise();
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
$numErros++;
|
|
|
|
|
socket_close($socket);
|
|
|
|
|
$socket = null;
|
|
|
|
|
|
|
|
|
|
sGravaLog($ex->getMessage());
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se o processo deve ser encerrado
|
|
|
|
|
*/
|
|
|
|
|
if (sig_status())
|
|
|
|
|
break;
|
|
|
|
|
/*
|
|
|
|
|
* Tempo do ciclo de atualiza<EFBFBD><EFBFBD>es.
|
|
|
|
|
*/
|
|
|
|
|
usleep(TEMPO_CICLO);
|
|
|
|
|
$start++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sGravaLog(sprintf("Server Stop: %s [ok]\n", date("Y-m-d H:i:s")));
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
sGravaLog($ex->getMessage());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AmiProcessaBloco($bloco) {
|
|
|
|
|
|
|
|
|
|
print_r($bloco);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AmiConnect($amiParams = []) {
|
|
|
|
|
global $socket;
|
|
|
|
|
$prc = array('host' => '127.0.0.1', 'port' => '5038', 'username' => 'manager', 'secret' => 'manager007', 'events' => 1);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Sobrescreve os parametros default pelos recebidos no array $amiParams, ex.: ['port' => '5039'] ira substituir
|
|
|
|
|
* a porta padrao.
|
|
|
|
|
*/
|
|
|
|
|
foreach ($amiParams as $key => $value) {
|
|
|
|
|
$prc[$key] = $value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!$socket = socket_create(AF_INET, SOCK_STREAM, 0)) {
|
|
|
|
|
RaiseExcept("N<EFBFBD>o foi poss<EFBFBD>vel criar um objeto de conex<EFBFBD>o!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!socket_connect($socket, $prc['host'], $prc['port'])) {
|
|
|
|
|
RaiseExcept("Nao foi possivel conectar-se ao servidor!", false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AmiExec($socket, AmiLoginAgt($prc['username'], $prc['secret'], $prc['events']));
|
|
|
|
|
do {
|
|
|
|
|
$buffer = socket_read($socket, 1024, PHP_NORMAL_READ);
|
|
|
|
|
if (stristr($buffer, "Authentication accepted")) {
|
|
|
|
|
return true;
|
|
|
|
|
} else if (stristr($buffer, "Authentication failed")) {
|
|
|
|
|
RaiseExcept("Nao foi possivel autenticar-se ao servidor manager!", false);
|
|
|
|
|
} else if (stristr($buffer, "Response: error")) {
|
|
|
|
|
RaiseExcept("Erro na autentica<EFBFBD><EFBFBD>o do usuario!", false);
|
|
|
|
|
}
|
|
|
|
|
} while (true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AmiExec($socket, $cmd) {
|
|
|
|
|
|
|
|
|
|
if (!array_key_iexists('ActionID', $cmd)) {
|
|
|
|
|
$cmd['ActionID'] = rand(000000000, 9999999999);
|
|
|
|
|
}
|
|
|
|
|
foreach ($cmd as $key => $value) {
|
|
|
|
|
$message = sprintf("%s: %s\n", $key, $value);
|
|
|
|
|
if (!socket_write($socket, $message, strlen($message))) {
|
|
|
|
|
RaiseExcept("Erro de comunica<EFBFBD><EFBFBD>o com o servidor!", true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$message = "\n\n";
|
|
|
|
|
if (!socket_write($socket, $message, strlen($message))) {
|
|
|
|
|
RaiseExcept("Erro de comunica<EFBFBD><EFBFBD>o com o servidor!", true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AmiReConnect($amiParams = []) {
|
|
|
|
|
global $socket;
|
|
|
|
|
if (!$socket) {
|
|
|
|
|
AmiConnect($amiParams);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AmiAnalise() {
|
|
|
|
|
global $socket;
|
|
|
|
|
$numErros = 0;
|
|
|
|
|
/*
|
|
|
|
|
* Indica que o blocos comecaram a ser lidos.
|
|
|
|
|
*/
|
|
|
|
|
$start = false;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Armazena os blocos de codigo retornados pelo mananger.
|
|
|
|
|
*/
|
|
|
|
|
$bloco = array();
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
$buffer = socket_read($socket, 1024, PHP_NORMAL_READ);
|
|
|
|
|
|
|
|
|
|
if (trim($buffer) !== '') {
|
|
|
|
|
list($key, $value) = explode(":", $buffer);
|
|
|
|
|
$bloco[$key] = $value;
|
|
|
|
|
$start = true;
|
|
|
|
|
}
|
|
|
|
|
//echo sprintf("Ciclo: %s Cmd: [%s] Chr: %s - %s \n", ++$i, trim(str_replace(array("\n", "\r"), '', $buffer)), ord($buffer[0]), ord($buffer[1]));
|
|
|
|
|
$ch = ord($buffer);
|
|
|
|
|
if (($ch == 13) && $start) {
|
|
|
|
|
AmiProcessaBloco($bloco);
|
|
|
|
|
$bloco = array();
|
|
|
|
|
if (sig_status()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (stristr($buffer, "Response: error")) {
|
|
|
|
|
if (++$numErros > 3) {
|
|
|
|
|
RaiseExcept("Erro ao ler socket!", false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} while (true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AmiLoginAgt($username, $secret, $events) {
|
|
|
|
|
return array("action" => "login", "username" => $username, "secret" => $secret, "events" => ($events ? "on" : "off"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sGravaLog($log) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Log do sistema
|
|
|
|
|
*/
|
|
|
|
|
$patLog = "/var/log/asterisk/amid.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/amid.pid", "w+" );
|
|
|
|
|
$pid = getmypid( )
|
|
|
|
|
if( $pid == false ){
|
|
|
|
|
exit( 1 );
|
|
|
|
|
}
|
|
|
|
|
fwrite( $PIDFile, $pid);
|
|
|
|
|
fclose( $PIDFile );
|
|
|
|
|
// posix_setsid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetSupervisorHelp() {
|
|
|
|
|
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 AmiIniciaMonitor() {
|
|
|
|
|
CarregaRamais();
|
|
|
|
|
CarregaTroncos();
|
|
|
|
|
CarregaFilas();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
$statusSignal = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sig_status() {
|
|
|
|
|
global $statusSignal;
|
|
|
|
|
pcntl_signal_dispatch();
|
|
|
|
|
return $statusSignal;
|
|
|
|
|
}
|
|
|
|
|
?>
|