PABX criado para pesquisas
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.
 
 
 
 
 
 

303 lines
11 KiB

#!/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ó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ção é custom, se for desvia a execução
* para um script customizado para integraçã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ável global usada em logStr.
*/
$nivelLog = LOG_MSG_DISPLAY;
$scrpt = $argv[0];
$shmSystemKey = ShmGetId(SHM_IPC_FILE);
$memoryAllocated = Malloc();
/*
* Se a memoria ainda não foi criada tenta cria-la.
*/
$shmKey = ShmExist($shmSystemKey);
if (!$shmKey) {
$msg = "Não foi possí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ão foi possível abrir a memoria do servidor";
/*
* A memoria já 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ão ocupados, é necessário alocar mais memó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 é ececutado em outro processo para permitir o contro de timeout das querys,
* assim o processo é encerrado caso não retorne no tempo má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ção padrao definida na configuração da integracao.
*/
$gotoOpcao = $infoMetodo['opcao'];
$gotoAcao = $infoMetodo['acao'];
$msg = "Processo executado mas não retornou dados!\nInfo: " . $data;
$msgReg = $msg;
$statusReg = 1;
} else if (!VerificaRetorno($infoMetodo['opcao_metodo'], $dadosConsulta[2])) {
/*
* Executa ação padrao definida na configuração da integracao.
*/
$gotoOpcao = $infoMetodo['opcao'];
$gotoAcao = $infoMetodo['acao'];
$msg = "Processo executado mas a(o) " . $infoMetodo['opcao_metodo'] . " retornada(0) é invalida(o)!\n" . $infoMetodo['opcao_metodo'] . ": " . $dadosConsulta[2];
$msgReg = $msg;
$statusReg = 2;
} else {
/*
* Executa açã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ção padrao definida na configuraçã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;
}
?>