PABX da Simples IP
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.
 
 
 
 
 
 

461 lines
16 KiB

#!/usr/bin/php -q
<?php
include('util/constantes.php');
include('util/util.php');
include('util/funcoesApl.php');
include('funcoes/shared.php');
include('util/funcoesLgpd.php');
include('bd.php');
/*
* Arquivo de log de erros.
*/
$pathLog = '/var/log/asterisk/lgpd_monitora.log';
$seq = 1;
GravaLog("\n\nInicio [{$seq}]\n\n", $pathLog);
/*
* Necessaro ajustar este campos em instalacoes novas.
*/
// psql -c "alter table pbx_supervisor_agentes alter column sala_1 type varchar(100)" -d pbx
// psql -c "alter table pbx_supervisor_agentes alter column sala_2 type varchar(100)" -d pbx
// alter table pbx_supervisor_agentes add lgpd_canal_supervisor varchar(128);
// alter table pbx_supervisor_agentes add lgpd_canal_monitorado varchar(128);
// alter table pbx_supervisor_agentes add lgpd_lgpdm_id varchar(32);
/*
psql -c "create table pbx_lgpd_monitora(
lgpdm_id bigint not null primary key,
lgpdm_matricula_supervisor varchar(10),
lgpdm_matricula_monitorado varchar(10),
lgpdm_uid varchar(32),
lgpdm_inicio timestamp not null default now(),
lgpdm_resposta_supervisor int,
lgpdm_resposta_supervisor_reg timestamp,
lgpdm_resposta_monitorado int,
lgpdm_resposta_monitorado_reg timestamp,
lgpdm_fim timestamp,
lgpdm_content text
);" -d pbx
*
* Acessa entrada padrao para executar comandos ami.
*/
ob_implicit_flush(true);
set_time_limit(6);
$in = fopen("php://stdin", "r");
$stdlog = fopen("/var/log/asterisk/intercala_lgpd.log", "w");
// toggle debugging output (more verbose)
$debug = true;
// parse agi headers into array
while ($env = read()) {
$s = explode(": ", $env);
$agi[str_replace("agi_", "", $s[0])] = trim($s[1]);
if (($env == "") || ($env == "\n")) {
break;
}
}
/*
* Parametros de linha de comando vindo do dialplan.
*/
$tipo = $argv[1];
$canal_agente = $argv[2];
$features = isset($argv[3]) ? $argv[3] : '';
$ramal_agente = isset($argv[4]) ? $argv[4] : '';
$arg = print_r($argv, true);
try {
$host = "127.0.0.1";
$porta = "5038";
$usuario = "manager";
$senha = "manager007";
/*
* Se n<EFBFBD>o conseguir se conectar ao socket aborta o script.
*/
if (!$socket = conecta_ami($host, $porta, $usuario, $senha)) {
$msg = "Nao foi poss<EFBFBD>vel conectar ao socket. Erro: " . ErrorGetLast();
GeraExcept($msg);
}
try {
GravaLog("\n\n###\n VARIAVEIS LGPD Tipo: {$tipo} Canal Agente: {$canal_agente} Features: {$features} Ramal Agente: {$ramal_agente} Argv: {$arg}\n###\n\n", $pathLog);
} catch (Exception $ex) {
GravaLog($ex->getMessage(), $pathLog);
}
if ($tipo == 'SUPERVISOR') {
try {
GravaLog(sprintf("### INICIO [%s] SUPERVISOR ###\n", ++$seq), $pathLog);
$infoLgpd = ___GetInfoLgpd($ramal_agente, '0');
/*
* Dial plan espcifico para supervisor.
*/
$canal_intercala = $argv[3];
$query = "update pbx_supervisor_agentes set lgpd_canal_supervisor = '$canal_intercala' where ramal = '$ramal_agente'";
if (!$result = pg_query($conexao, $query)) {
$msg = "Erro ao registrar canal do suspervisor.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GeraExcept($msg);
}
/*
* Registra a resposta do supervisor
*/
$repostaSupervisor = is_numeric($argv[2]) ? $argv[2] : '0';
$pLgpd = $infoLgpd['lgpd_lgpdm_id'];
$query = "update pbx_lgpd_monitora set lgpdm_resposta_supervisor = '{$repostaSupervisor}', lgpdm_resposta_supervisor_reg = now() where lgpdm_id = '{$pLgpd}'";
if (!$result = pg_query($query)) {
$msg = "Erro ao registrar a resposta do supervisor.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GeraExcept($msg);
}
GravaLog(sprintf("\n### FIM SUPERVISOR %s ###\n", ''), $pathLog);
} catch (Exception $ex) {
GravaLog($ex->getMessage(), $pathLog);
}
} else if ($tipo == 'INICIA') {
GravaLog(sprintf("\n####INICIA [%s] ######\n", ++$seq), $pathLog);
/*
* Envia aviso para o monitorado.
*/
envia_aviso($conexao, $socket, $ramal_agente);
GravaLog("envia_aviso Ramal Agnete: $ramal_agente\n", $pathLog);
usleep(300000);
/*
* Envia aviso ao supervisor
*/
configura_features($conexao, $socket, $canal_agente, $features);
GravaLog("configura_features Canal Agente: $canal_agente, Features: $features\n", $pathLog);
usleep(300000);
GravaLog(sprintf("\n### FIM INICIA %s ###\n", ''), $pathLog);
} else if ($tipo == 'AGENTE') {
GravaLog(sprintf("\n#### AGENTE [%s] ####\n", ++$seq), $pathLog);
/*
* o ramal do agente era obtido atraves da variavel callerid, entretanto quando
* o sistema manipula este valor, torna-se necess<EFBFBD>rio tentar obtelo da variavel
* RAMAL criada pela aplicacao.
*/
write("GET VARIABLE RAMAL");
$ramal_var = substr(strrchr(read(), "("), 1, -1);
$ramal_agente = ValidaRamalApl($ramal_var) ? $ramal_var : $agi['callerid'];
$resposta = is_numeric(trim($argv[2])) ? $argv[2] : '0';
GravaLog(sprintf("ramal_agente = %s resposta = %s RAMAL = %s\n", $ramal_agente, $resposta, $ramal_var), $pathLog);
/*
* PARA LIGACOES RECEBIDAS NA FILA O CALLERID NAO EH O NUMERO DO RAMAL E PRECISA RECUPERAR O CANAL_INTERCALA PELA MATRICULA
*/
// $canal = $agi['channel'];
// $agente = explode("/", $canal);
// $matricula = $agente[1];
write("GET VARIABLE MATRICULA");
$matricula = substr(strrchr(read(), "("), 1, -1);
GravaLog(sprintf("callerid = %s canal = %s\n", $agi['callerid'], $agi['channel']), $pathLog);
$query = "select canal_agente, uniqueid2 from pbx_supervisor_agentes where (ramal = '$ramal_agente') or (matricula = '$matricula')";
if (!$result = pg_query($query)) {
$msg = "Erro ao recuperar o ramal e canal intercala do agente na resposta 1.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GeraExcept($msg);
}
$dados = pg_fetch_row($result);
$canal_agente = $dados[0];
$uid = $dados[1];
GravaLog("Reupera canal do agente: canal-agente: {$canal_agente} uid: {$uid} \n{$query}\n", $pathLog);
/*
* Registra a resposta do agente
*
*/
$infoLgpd = ___GetInfoLgpd($ramal_agente, $matricula);
$pLgpd = $infoLgpd['lgpd_lgpdm_id'];
$query = "update pbx_lgpd_monitora set lgpdm_resposta_monitorado = '{$resposta}', lgpdm_uid = '{$uid}', lgpdm_resposta_monitorado_reg = now() where lgpdm_id = '{$pLgpd}'";
if (!$result = pg_query($query)) {
$msg = "Erro ao registrar a resposta do agente.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GravaLog($msg, $pathLog);
}
GravaLog("Update Monitoria do agente: \n{$query}\n", $pathLog);
/*
* CASO O AGENTE AUTORIZE
*/
if ($resposta == '1') {
try {
write("STREAM FILE activated 0 0");
read();
/*
* RECUPERA O RAMAL INTERCALA E CANAL INTERCALA GUARDADO TEMPORARIAMENTE NOS CAMPOS sala_1 E sala_2
*
*/
$query = "select lgpd_canal_supervisor from pbx_supervisor_agentes where (ramal = '$ramal_agente') or (matricula = '$matricula')";
if (!$result = pg_query($query)) {
$msg = "Erro ao recuperar o ramal e canal intercala do agente na resposta 1.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GeraExcept($msg);
}
GravaLog("Resposta 1 canal do agente: \n{$query}\n", $pathLog);
$dados = pg_fetch_row($result);
$canal_intercala = $dados[0];
if (!$socket) {
$msg = "Erro socket nao acessivel ao iniciar monitoria.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GeraExcept($msg);
}
inicia_monitora($conexao, $socket, $ramal_agente, $ramal_intercala, $canal_intercala);
GravaLog("Chama inicia_monitora, canal-agente: {$canal_intercala} resposta agente = 1\n", $pathLog);
} catch (Exception $ex) {
GravaLog($ex->getMessage(), $pathLog);
}
} else {
try {
/*
* CASO O AGENTE NAO AUTORIZE
*/
write("STREAM FILE de-activated 0 0");
read();
/*
* RECUPERA O RAMAL INTERCALA E CANAL INTERCALA GUARDADO TEMPORARIAMENTE NOS CAMPOS sala_1 E sala_2
*/
$query = "select lgpd_canal_supervisor from pbx_supervisor_agentes where (ramal = '$ramal_agente') or (matricula = '$matricula')";
if (!$result = pg_query($query)) {
$msg = "Erro ao recuperar o ramal e canal intercala do agente na resposta = 2.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GeraExcept($msg);
}
$dados = pg_fetch_row($result);
$canal_intercala = $dados[0];
hangup($socket, $canal_intercala);
GravaLog("Chama hangup\n", $pathLog);
} catch (Exception $ex) {
GravaLog($ex->getMessage(), $pathLog);
}
}
/*
* Limpa variavel DYNAMIC_FEATURES
*/
configura_features($conexao, $socket, $canal_agente, '');
GravaLog("configura_features Canal Agente: $canal, Features: $features\n", $pathLog);
usleep(300000);
GravaLog(sprintf("\n### FIM AGENTE %s ###\n", ''), $pathLog);
} else if ($tipo == 'FIM') {
GravaLog(sprintf("\n####BLOCO FIM [%s] ####\n", ++$seq), $pathLog);
$ramal_agente = $argv[2];
$infoLgpd = ___GetInfoLgpd($ramal_agente, '0');
$pLgpd = $infoLgpd['lgpd_lgpdm_id'];
/*
* Registra a resposta do agente
*
*/
$query = "update pbx_lgpd_monitora set lgpdm_fim = now() where lgpdm_id = '{$pLgpd}' and lgpdm_fim is null";
if (!$result = pg_query($query)) {
$msg = "Erro ao registrar a resposta do agente.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GravaLog($msg, $pathLog);
}
/*
* Derruba o canal do supervisor.
*/
hangup($socket, $infoLgpd['lgpd_canal_supervisor']);
GravaLog(sprintf("\n### FIM BLOCO FIM %s ###\n", ''), $pathLog);
}
} catch (Exception $ex) {
GravaLog($ex->getMessage(), $pathLog);
}
++$seq;
GravaLog("\n\nFIM [{$seq}]\n\n", $pathLog);
/*
* Funcoes do script
*/
function conecta_ami($host, $porta, $usuario, $senha) {
$timeout = 20;
$socket = fsockopen($host, $porta, $errno, $errstr, $timeout);
__fwrite($socket, "action: login\r\n", 'conecta_ami');
__fwrite($socket, "username: $usuario\r\n");
__fwrite($socket, "secret: $senha\r\n");
$actionid = rand(000000000, 9999999999);
__fwrite($socket, "actionid: " . $actionid . "\r\n\r\n");
if ($socket) {
while (!feof($socket)) {
$bufer = fgets($socket);
if (stristr($bufer, "Authentication accepted")) {
return $socket;
} elseif (stristr($bufer, "Authentication failed")) {
fclose($socket);
return false;
}
}
} else {
$arquivo = fopen('/var/log/manager_lgpd.log', 'a');
$data = date("d/m/Y H:i:s");
__fwrite($arquivo, "$data\n");
__fwrite($arquivo, "Script abortado,falha de conexao com o socket!!!\n\n");
fclose($arquivo);
return false;
}
}
function configura_features($conexao, $socket, $canal_agente, $features) {
//
// Log stdin
//
return true;
__echoLog("DYNAMIC_FEATURES\n");
if ($features == 'originada') {
$features = "app-monitora-aceita-origina#app-monitora-bloqueia-origina";
} else if ($features) {
$features = "app-monitora-aceita-recebe#app-monitora-bloqueia-recebe";
}
__fwrite($socket, "Action: Setvar\r\n", 'configura_features');
__fwrite($socket, "Channel: $canal_agente\r\n");
__fwrite($socket, "Variable: DYNAMIC_FEATURES\r\n");
__fwrite($socket, "Value: $features\r\n\r\n");
}
function configura_lgpd($conexao, $socket, $canal_agente, $features) {
//
// Log stdin
//
__echoLog("LGPD_VAR\n");
__fwrite($socket, "Action: Setvar\r\n", 'configura_lgpd');
__fwrite($socket, "Channel: $canal_agente\r\n");
__fwrite($socket, "Variable: LGPD_VAR\r\n");
__fwrite($socket, "Value: $features\r\n\r\n");
}
function envia_aviso($conexao, $socket, $ramal_agente) {
//
// log stdin
//
__echoLog("ENVIA_AVISO\n");
__fwrite($socket, "Action: Originate\r\n", 'envia_aviso');
__fwrite($socket, "Channel: Local/$ramal_agente@call-intercala-lgpd-inicia\r\n");
__fwrite($socket, "Exten: s\r\n");
__fwrite($socket, "Context: intercala-aviso\r\n");
__fwrite($socket, "Priority: 1\r\n\r\n");
}
function hangup($socket, $canal_intercala) {
//
// log stdin
//
__echoLog("HANGUP-$canal_intercala\n");
__fwrite($socket, "Action: Hangup\r\n", 'hangup');
__fwrite($socket, "Channel: $canal_intercala\r\n\r\n");
}
function inicia_monitora($conexao, $socket, $ramal_agente, $ramal_intercala, $canal_intercala) {
//__fwrite($socket, "Action: Setvar\r\n");
//__fwrite($socket, "Channel: $canal_intercala\r\n");
//__fwrite($socket, "Variable: RAMAL\r\n");
//__fwrite($socket, "Value: $ramal_intercala\r\n\r\n");
//__fwrite($socket, "Action: Setvar\r\n");
//__fwrite($socket, "Channel: $canal_intercala\r\n");
//__fwrite($socket, "Variable: DESTINO\r\n");
//__fwrite($socket, "Value: $ramal_agente\r\n\r\n");
//
// log stdin
//
__echoLog("INICIA_INTERCALA\n");
__fwrite($socket, "Action: Redirect\r\n", 'inicia_monitora');
__fwrite($socket, "Channel: $canal_intercala\r\n");
__fwrite($socket, "Exten: s\r\n");
__fwrite($socket, "Context: call-monitora\r\n");
__fwrite($socket, "Priority: 1\r\n\r\n");
}
function limpa_features($conexao, $socket, $canal_agente, $features) {
__fwrite($socket, "Action: Setvar\r\n", 'limpa_features');
__fwrite($socket, "Channel: $canal_agente\r\n");
__fwrite($socket, "Variable: DYNAMIC_FEATURES\r\n");
__fwrite($socket, "Value: \r\n\r\n");
}
function read() {
global $in, $debug, $stdlog;
$input = str_replace("\n", "", fgets($in, 4096));
if ($debug)
fputs($stdlog, "read: $input\n");
return $input;
}
function errlog($line) {
global $err;
echo "VERBOSE \"$line\"\n";
}
function write($line) {
global $debug, $stdlog;
if ($debug)
fputs($stdlog, "write: $line\n");
echo $line . "\n";
}
function __echoLog($msg) {
return false; //echo $msg;
}
function __fwrite($socket, $value, $function = '', $logOnly = false) {
global $debug, $pathLog;
$path = $pathLog; //sprintf("/var/log/asterisk/lgpd_ami_%s.log", date("Y-m-d"));
if (!$logOnly) {
fwrite($socket, $value);
}
if ($debug) {
if ($function) {
GravaLog("\n[$function]\n", $path);
}
if ($value) {
GravaLog($value, $path);
}
}
}
function ___GetInfoLgpd($ramalAgente, $matriculaAgente) {
global $pathLog;
$query = "select tipo_ligacao, lgpd_canal_supervisor, lgpd_canal_monitorado, lgpd_lgpdm_id from pbx_supervisor_agentes where (matricula = '$matriculaAgente' or ramal = '$ramalAgente')";
GravaLog(sprintf("___GetInfoLgpd [%s]\n", $query), $pathLog);
if (!$result = pg_query($query)) {
$msg = "Erro ao recuperar canal do agente para hangup.\nCMD[{$query}]\nErro: " . ErrorGetLast();
GravaLog($msg, $pathLog);
}
return pg_fetch_array($result);
}
// clean up file handlers etc.
fclose($in);
fclose($stdlog);
?>