|
|
#!/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); |
|
|
?>
|
|
|
|