|
|
|
|
#!/usr/bin/php -Cq
|
|
|
|
|
<?php
|
|
|
|
|
error_reporting(E_ERROR);
|
|
|
|
|
ini_set('display_errors', 0);
|
|
|
|
|
include 'util/util.php';
|
|
|
|
|
include '/var/lib/asterisk/scripts/integracao/constServerIntegra.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/shm.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/localDataBase.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/serverFunctions.php';
|
|
|
|
|
include("util/funcoesAgi.php");
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Parametros recebidos pela linha de comando.
|
|
|
|
|
*/
|
|
|
|
|
$idMetodo = isset($argv[1]) ? $argv[1] : '-1'; //C<EFBFBD>digo do metodo passado no opcao/acao
|
|
|
|
|
$numero = isset($argv[2]) ? $argv[2] : '-1'; //Bina
|
|
|
|
|
$uid = isset($argv[3]) && $argv[3] ? $argv[3] : '-1'; //Uniqueid corrente.
|
|
|
|
|
$uidOld = isset($argv[4]) && $argv[4] ? $argv[4] : '-1'; //Uniqueid transbordado
|
|
|
|
|
$ura = isset($argv[5]) && $argv[5] ? $argv[5] : '-1'; //Variavel capturada na ura
|
|
|
|
|
$nomeMetodo = '';
|
|
|
|
|
//var/lib/asterisk/scripts/integracao/serverAgi.php,1,6002,1460151128.239,1460151128.239,83139656149
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se o tipo de execu<EFBFBD><EFBFBD>o <EFBFBD> custom, se for desvia a execu<EFBFBD><EFBFBD>o
|
|
|
|
|
* para um script customizado para integra<EFBFBD><EFBFBD>o, capturando antes os
|
|
|
|
|
* parametros de entrada. O programas ou scripts ficam localizados
|
|
|
|
|
* no diretorio /var/lib/asterisk/scripts/integracao/custom.
|
|
|
|
|
*/
|
|
|
|
|
if (ExecuteCustom($idMetodo, $nomeMetodo)) {
|
|
|
|
|
__logStr("ExecuteCustom", $nomeMetodo, 'serverAgi', true);
|
|
|
|
|
include($nomeMetodo);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Pega da data da cdr calldate na tabela pbx_bilhetes e callerid name.
|
|
|
|
|
*/
|
|
|
|
|
$agi = GetAgi();
|
|
|
|
|
$dataCdr = sprintf("'%s'", $agi->get_variable('CDR(answer)', true));
|
|
|
|
|
$tronco = $agi->get_variable('CALLERID(name)', true);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Vari<EFBFBD>vel global usada em logStr.
|
|
|
|
|
*/
|
|
|
|
|
$nivelLog = LOG_MSG_DISPLAY;
|
|
|
|
|
$scrpt = $argv[0];
|
|
|
|
|
|
|
|
|
|
$shmSystemKey = ShmGetId(SHM_IPC_FILE);
|
|
|
|
|
$memoryAllocated = Malloc();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Se a memoria ainda n<EFBFBD>o foi criada tenta cria-la.
|
|
|
|
|
*/
|
|
|
|
|
$shmKey = ShmExist($shmSystemKey);
|
|
|
|
|
if (!$shmKey) {
|
|
|
|
|
$msg = "N<EFBFBD>o foi poss<EFBFBD>vel criar a memoria do servidor";
|
|
|
|
|
$shmKey = ShmOpen($shmSystemKey, SHM_ACESS_MODE, SHM_ACESS_PERMISSION, $memoryAllocated);
|
|
|
|
|
if ($shmKey) {
|
|
|
|
|
/*
|
|
|
|
|
* Formata a memoria compartilhada.
|
|
|
|
|
*/
|
|
|
|
|
@CreateSegment($shmKey);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$msg = "N<EFBFBD>o foi poss<EFBFBD>vel abrir a memoria do servidor";
|
|
|
|
|
/*
|
|
|
|
|
* A memoria j<EFBFBD> foi criada tenta abrir o bloco previamente alocado.
|
|
|
|
|
*/
|
|
|
|
|
$shmKey = ShmOpen($shmSystemKey, SHM_ACESS_MODE, SHM_ACESS_PERMISSION, $memoryAllocated);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!$shmKey) {
|
|
|
|
|
$er = error_get_last();
|
|
|
|
|
__logStr("ShmOpen", $msg . "\nErro Geral: " . $er["message"], $scrpt, true);
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Retorna o id do primeiro processo livre do segmento.
|
|
|
|
|
*/
|
|
|
|
|
$idProc = GetFreeProcesses($shmKey);
|
|
|
|
|
if ($idProc == -1) {
|
|
|
|
|
$msg = sprintf("Todos os processos est<EFBFBD>o ocupados, <EFBFBD> necess<EFBFBD>rio alocar mais mem<EFBFBD>ria para o servidor. Total de processos suportados: %s", MEMORY_SEGMENT_COUNT);
|
|
|
|
|
__logStr("Inicio do Processo", $msg, $scrpt, true);
|
|
|
|
|
} else if (ShmWrite($shmKey, PROCESSESS_START, $idProc) === false) {
|
|
|
|
|
/*
|
|
|
|
|
* Marca o processo com iniciado.
|
|
|
|
|
*/
|
|
|
|
|
$msg = sprintf("Nao foi possivel gravar o status inicial do processo. Processo: %s", $idProc);
|
|
|
|
|
__logStr("ShmWrite", $msg, $scrpt, true);
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
$msgReg = '';
|
|
|
|
|
$statusReg = 0;
|
|
|
|
|
$opProc = '';
|
|
|
|
|
@RegistraIntegracao($idMetodo, $uid, $uidOld, $numero);
|
|
|
|
|
$str = sprintf("/var/lib/asterisk/scripts/integracao/agiIntegra.php %s %s %s %s %s %s %s %s > /dev/null & echo $!", $idMetodo, $numero, $uid, $uidOld, $ura, $idProc, $dataCdr, $tronco);
|
|
|
|
|
/*
|
|
|
|
|
* Este script <EFBFBD> ececutado em outro processo para permitir o contro de timeout das querys,
|
|
|
|
|
* assim o processo <EFBFBD> encerrado caso n<EFBFBD>o retorne no tempo m<EFBFBD>ximo definido para timeout.
|
|
|
|
|
*/
|
|
|
|
|
$opProc = (int) soNumero(exec($str));
|
|
|
|
|
//__logStr("agiIntegra", $msg = $str, $scrpt, false);
|
|
|
|
|
/*
|
|
|
|
|
* Recupera informacoes sobre o metodo.
|
|
|
|
|
*/
|
|
|
|
|
$infoMetodo = GetInfoMetodo($idMetodo);
|
|
|
|
|
if ($infoMetodo === false) {
|
|
|
|
|
$msg = "Nao foi possivel obter informacoes sobre o metodo!";
|
|
|
|
|
$msgReg = $msg;
|
|
|
|
|
__logStr("GetInfoMetodo", $msg, $scrpt, true);
|
|
|
|
|
} else {
|
|
|
|
|
$itgc_timeout = $infoMetodo['itgc_timeout'] ? $infoMetodo['itgc_timeout'] : DB_TIMOUT_DEF;
|
|
|
|
|
$maxTimeOut = ($itgc_timeout * 1000000);
|
|
|
|
|
$timeout = 0;
|
|
|
|
|
while (true) {
|
|
|
|
|
usleep(SERVER_CYCLO);
|
|
|
|
|
$st = @GetStatusProcesses($shmKey, $idProc);
|
|
|
|
|
if ($st == PROCESSESS_READ) {
|
|
|
|
|
$data = trim(@ShmRead($shmKey, GetOffSet($idProc), MEMORY_SEGMENT_WITH));
|
|
|
|
|
$dadosConsulta = explode("|", $data);
|
|
|
|
|
/*
|
|
|
|
|
* a.itgm_tipo, a.itgm_comando, itgm_retorno, a.opcao as opcao_metodo, a.stored_params,
|
|
|
|
|
c.itgp_prefix, b.itgc_host, b.itgc_port, b.itgc_database, b.itgc_user, b.itgc_password,
|
|
|
|
|
b.itgc_timeout, b.opcao, b.acao
|
|
|
|
|
*/
|
|
|
|
|
if ($dadosConsulta[2] == '-1') {
|
|
|
|
|
/*
|
|
|
|
|
* Executa a<EFBFBD><EFBFBD>o padrao definida na configura<EFBFBD><EFBFBD>o da integracao.
|
|
|
|
|
*/
|
|
|
|
|
$gotoOpcao = $infoMetodo['opcao'];
|
|
|
|
|
$gotoAcao = $infoMetodo['acao'];
|
|
|
|
|
$msg = "Processo executado mas n<EFBFBD>o retornou dados!\nInfo: " . $data;
|
|
|
|
|
$msgReg = $msg;
|
|
|
|
|
$statusReg = 1;
|
|
|
|
|
} else if (!VerificaRetorno($infoMetodo['opcao_metodo'], $dadosConsulta[2])) {
|
|
|
|
|
/*
|
|
|
|
|
* Executa a<EFBFBD><EFBFBD>o padrao definida na configura<EFBFBD><EFBFBD>o da integracao.
|
|
|
|
|
*/
|
|
|
|
|
$gotoOpcao = $infoMetodo['opcao'];
|
|
|
|
|
$gotoAcao = $infoMetodo['acao'];
|
|
|
|
|
$msg = "Processo executado mas a(o) " . $infoMetodo['opcao_metodo'] . " retornada(0) <EFBFBD> invalida(o)!\n" . $infoMetodo['opcao_metodo'] . ": " . $dadosConsulta[2];
|
|
|
|
|
$msgReg = $msg;
|
|
|
|
|
$statusReg = 2;
|
|
|
|
|
} else {
|
|
|
|
|
/*
|
|
|
|
|
* Executa a<EFBFBD><EFBFBD>o retornada da consulta do banco do cliente.
|
|
|
|
|
*/
|
|
|
|
|
$gotoOpcao = $infoMetodo['opcao_metodo'];
|
|
|
|
|
$gotoAcao = $dadosConsulta[2];
|
|
|
|
|
$msg = "Processo: $idProc executado com sucesso!\nDados: " . $data;
|
|
|
|
|
$msgReg = $msg;
|
|
|
|
|
$statusReg = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__logStr("ProcessRead", $msg, $scrpt, true);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($timeout > $maxTimeOut) {
|
|
|
|
|
/*
|
|
|
|
|
* Garante o encerramento do processo em segundo plano.
|
|
|
|
|
*/
|
|
|
|
|
if ($opProc) {
|
|
|
|
|
exec("kill -9 $opProc");
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Executa a<EFBFBD><EFBFBD>o padrao definida na configura<EFBFBD><EFBFBD>o da integracao.
|
|
|
|
|
*/
|
|
|
|
|
$gotoOpcao = $infoMetodo['opcao'];
|
|
|
|
|
$gotoAcao = $infoMetodo['acao'];
|
|
|
|
|
$msg = sprintf("O processo: %s nao retornou no tempo devido.", $opProc);
|
|
|
|
|
$msgReg = $msg;
|
|
|
|
|
__logStr("Timeout", $msg, $scrpt, true);
|
|
|
|
|
$statusReg = 3;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
$timeout += SERVER_CYCLO;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ShmWrite($shmKey, PROCESSESS_WAIT, $idProc)) {
|
|
|
|
|
$msg = "Nao foi possivel liberar o processo.";
|
|
|
|
|
__logStr("ShmWrite", $msg, $scrpt, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@AtualizaIntegracao($uid, $gotoAcao, $msgReg, $statusReg, $data);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Executa redirecionamento
|
|
|
|
|
*/
|
|
|
|
|
$debug = true;
|
|
|
|
|
$in = fopen("php://stdin", "r");
|
|
|
|
|
$stdlog = fopen("/var/log/asterisk/IntegracaoRedir.log", "w");
|
|
|
|
|
write("SET VARIABLE ACAO $gotoAcao");
|
|
|
|
|
read();
|
|
|
|
|
write("SET VARIABLE opcao $gotoOpcao");
|
|
|
|
|
read();
|
|
|
|
|
$acao = GetAcaoOpcao($gotoOpcao, $gotoAcao);
|
|
|
|
|
write("EXEC $acao");
|
|
|
|
|
read();
|
|
|
|
|
fclose($in);
|
|
|
|
|
fclose($stdlog);
|
|
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($shmKey)
|
|
|
|
|
ShmClose($shmKey);
|
|
|
|
|
|
|
|
|
|
// Do function definitions before we start the main loop
|
|
|
|
|
function read() {
|
|
|
|
|
global $in, $debug, $stdlog;
|
|
|
|
|
$input = str_replace("\n", "", fgets($in, 4096));
|
|
|
|
|
if ($debug) {
|
|
|
|
|
fputs($stdlog, "read: $input\n");
|
|
|
|
|
}
|
|
|
|
|
return $input;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function write($line) {
|
|
|
|
|
global $debug, $stdlog;
|
|
|
|
|
if ($debug) {
|
|
|
|
|
fputs($stdlog, "write: $line\n");
|
|
|
|
|
}
|
|
|
|
|
echo $line . "\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetAcaoOpcao($opcao, $acao) {
|
|
|
|
|
if ($opcao == 'ura') {
|
|
|
|
|
$var = explode('-', $acao);
|
|
|
|
|
return 'Goto ura-' . $var[0] . ',s,1';
|
|
|
|
|
} else if ($opcao == 'grupo') {
|
|
|
|
|
return 'Goto ext-grupos,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'filas') {
|
|
|
|
|
return 'Goto ext-fila,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'voice') {
|
|
|
|
|
$var = explode('/', $acao);
|
|
|
|
|
return 'Goto ext-voicemail,' . $var[0] . ',' . $var[1] . '';
|
|
|
|
|
} else if ($opcao == 'ramal') {
|
|
|
|
|
return 'Goto ext-ramais,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'horarios') {
|
|
|
|
|
return 'Goto ext-horarios,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'disa') {
|
|
|
|
|
return 'Goto ext-disa,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'anuncios') {
|
|
|
|
|
return 'Goto ext-anuncios,a' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'conferencia') {
|
|
|
|
|
return 'Goto ext-conferencia,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'callback') {
|
|
|
|
|
return 'Goto ext-callback-externo,' . $acao . ',1';
|
|
|
|
|
} else if ($opcao == 'rotainterna') {
|
|
|
|
|
return 'Goto ext-rotasinternas,' . $acao . ',1';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function VerificaRetorno($opcao, $acao) {
|
|
|
|
|
$query = "";
|
|
|
|
|
if ($opcao == 'ura') {
|
|
|
|
|
$var = explode('-', $acao);
|
|
|
|
|
$acao = $var[0];
|
|
|
|
|
$query = "select count(*) FROM pbx_ura where id = '$acao'";
|
|
|
|
|
} else if ($opcao == 'grupo') {
|
|
|
|
|
$query = "SELECT count(*) FROM pbx_grupos where numero = '$acao'";
|
|
|
|
|
} else if ($opcao == 'filas') {
|
|
|
|
|
$query = " SELECT count(*) FROM pbx_queues_grupos where numero = '$acao' and status = 'A'";
|
|
|
|
|
} else if ($opcao == 'voice') {
|
|
|
|
|
$var = explode('/', $acao);
|
|
|
|
|
$acao = $var[0];
|
|
|
|
|
$query = "SELECT count(*) FROM pbx_voicemail_usuarios where caixa_postal = '$acao'";
|
|
|
|
|
} else if ($opcao == 'ramal') {
|
|
|
|
|
$query = "select count(*) from pbx_ramais where nome = '$acao'";
|
|
|
|
|
} else if ($opcao == 'horarios') {
|
|
|
|
|
$query = "select count(*) from pbx_horarios where id = '$acao'";
|
|
|
|
|
} else if ($opcao == 'disa') {
|
|
|
|
|
$query = "SELECT count(*) FROM pbx_disa where numero = '$acao'";
|
|
|
|
|
} else if ($opcao == 'anuncios') {
|
|
|
|
|
$query = "SELECT count(*) FROM pbx_anuncios where id = '$acao'";
|
|
|
|
|
} else if ($opcao == 'conferencia') {
|
|
|
|
|
$query = "SELECT count(*) FROM pbx_conferencia where numero = '$acao'";
|
|
|
|
|
} else if ($opcao == 'callback') {
|
|
|
|
|
$query = "select count(*) from pbx_callback where id = '$acao'";
|
|
|
|
|
} else if ($opcao == 'rotainterna') {
|
|
|
|
|
$query = "select count(*) from pbx_rotas_saida_modelos b where modelo = '$acao'";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($query) {
|
|
|
|
|
$connPG = $GLOBALS['connPG'];
|
|
|
|
|
$result = pg_query($connPG, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
$msg = sprintf("Query: %s.\nErro: %s\n", $query, pg_last_error($connPG));
|
|
|
|
|
__logStr('VerificaRetorno', $msg);
|
|
|
|
|
}
|
|
|
|
|
$row = pg_fetch_row($result);
|
|
|
|
|
return $row[0];
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
?>
|