|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Limpar o buffer
|
|
|
|
|
*/
|
|
|
|
|
ob_flush();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Declara<EFBFBD><EFBFBD>o de v<EFBFBD>riaveis
|
|
|
|
|
*/
|
|
|
|
|
$ajax = isset($_GET['ajax']) ? $_GET['ajax'] : '';
|
|
|
|
|
$server = isset($_POST['server']) ? $_POST['server'] : '';
|
|
|
|
|
$api = isset($_GET['f']) ? $_GET['f'] : '';
|
|
|
|
|
$versao = null;
|
|
|
|
|
$usuario = null;
|
|
|
|
|
$senha = null;
|
|
|
|
|
|
|
|
|
|
$row = '';
|
|
|
|
|
$mensagem = '';
|
|
|
|
|
$header = "<tr><th>Origem</th><th>Destino</th><th>Hora</th><th>Dura<EFBFBD><EFBFBD>o</th><th>Status</th><th>Canal</th><th></th></tr>";
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Bot<EFBFBD>o para desconectar do servidor
|
|
|
|
|
*/
|
|
|
|
|
if ($ajax == "desconnect") {
|
|
|
|
|
$_SESSION['SSMonitorServer'] = null;
|
|
|
|
|
$_SESSION['SSMonitorVersao'] = null;
|
|
|
|
|
$_SESSION['SSMonitorUsuario'] = null;
|
|
|
|
|
$_SESSION['SSMonitorSenha'] = null;
|
|
|
|
|
responseJSON(array('status' => 'DESCONNECT'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
___GetVariavel($server, $usuario, $senha, $versao);
|
|
|
|
|
|
|
|
|
|
if (!$_SESSION['SSMonitorServer']) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Atribui o servidor para manter em sess<EFBFBD>o do usu<EFBFBD>rio
|
|
|
|
|
*/
|
|
|
|
|
$select = ___GetServidores();
|
|
|
|
|
|
|
|
|
|
if ($server && isset($_POST['btConectar'])) {
|
|
|
|
|
$_SESSION['SSMonitorServer'] = $server;
|
|
|
|
|
$_SESSION['SSMonitorUsuario'] = $usuario;
|
|
|
|
|
$_SESSION['SSMonitorSenha'] = $senha;
|
|
|
|
|
$_SESSION['SSMonitorVersao'] = $versao;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$row = ___GetMonitoramento($ajax, $api);
|
|
|
|
|
if (!$row) {
|
|
|
|
|
echo "<tr><th style='background:#ff3333'>N<EFBFBD>o foi possivel conectar ao manager, por favor verifique sua conex<EFBFBD>o ou informa<EFBFBD><EFBFBD>es as de acesso!</th></tr>";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$jsJQuery[] = "$('#message b').text('$mensagem');";
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
$mensagem = $ex->getMessage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* CHAMADA DO METODO DE ATUALIZA<EFBFBD><EFBFBD>O REAL TIME
|
|
|
|
|
*/
|
|
|
|
|
$jsJQuery[] = 'AtualizaChamdas();';
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Variaveis para o template
|
|
|
|
|
*/
|
|
|
|
|
$smarty->assign('select', $select);
|
|
|
|
|
$smarty->assign('server', $_SESSION['SSMonitorServer']);
|
|
|
|
|
$smarty->assign('mensagem', $mensagem);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Chamada do template do monitor.
|
|
|
|
|
*/
|
|
|
|
|
GetTemplate($smarty, 'admin/monitorChamadas.tpl');
|
|
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
|
|
|
//* FUN<EFBFBD><EFBFBD>ES PARA FORNECER DADOS AO APLICATIVO *
|
|
|
|
|
//* ***************************************** *
|
|
|
|
|
//**************************************************************************
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Fun<EFBFBD><EFBFBD>o para tratar e montar os dados na grid
|
|
|
|
|
*/
|
|
|
|
|
function ___GetMonitoramento($ajax, $api) {
|
|
|
|
|
global $mensagem;
|
|
|
|
|
|
|
|
|
|
$socket = ConectaAmi($_SESSION['SSMonitorServer'], '', $_SESSION['SSMonitorUsuario'], $_SESSION['SSMonitorSenha']);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica a conex<EFBFBD>o do socket
|
|
|
|
|
*/
|
|
|
|
|
if (!$socket) {
|
|
|
|
|
$_SESSION['SSMonitorServer'] = null;
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Desliga chamada no Hangup de acordo com a channel.
|
|
|
|
|
*/
|
|
|
|
|
if ($ajax == 'hangup') {
|
|
|
|
|
$ret = DesligarAmi($socket, $api);
|
|
|
|
|
$mensagem = $ret == 'ok' ? "Chamada foi encerrada com sucesso! [ " . $api . " ]" : "N<EFBFBD>o foi poss<EFBFBD>vel encerrar a chamada!";
|
|
|
|
|
echo $mensagem;
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($ajax == 'ramais') {
|
|
|
|
|
header('Content-type: application/json');
|
|
|
|
|
responseJSON(___GetRamaisChamadas($socket));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Busca todos os servidores cadastrados na tabela de sites, indiferente de
|
|
|
|
|
* ativo ou inativo;
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function ___GetServidores() {
|
|
|
|
|
$query = "SELECT host,descricao,usuario,senha,basedados FROM pbx_sites";
|
|
|
|
|
|
|
|
|
|
$result = pg_query($query);
|
|
|
|
|
|
|
|
|
|
$resp = pg_fetch_all($result);
|
|
|
|
|
|
|
|
|
|
if (!$resp) {
|
|
|
|
|
throw new Exception('Nenhum servidor cadastrado!');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$select = "<select name='server'>";
|
|
|
|
|
foreach ($resp as $server) {
|
|
|
|
|
$select .= "<option value='{$server['host']}||{$server['usuario']}||{$server['senha']}||{$server['basedados']}'>{$server['host']} - {$server['descricao']}</option>";
|
|
|
|
|
}
|
|
|
|
|
$select .= "</select>";
|
|
|
|
|
|
|
|
|
|
return $select;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function SecondsToStrTime($seconds) {
|
|
|
|
|
$conv_time = convertSecondsToArrayTime($seconds);
|
|
|
|
|
$conv_time['minutes'] = strlen($conv_time['minutes']) == 1 ? '0' . $conv_time['minutes'] : $conv_time['minutes'];
|
|
|
|
|
$conv_time['seconds'] = strlen($conv_time['seconds']) == 1 ? '0' . $conv_time['seconds'] : $conv_time['seconds'];
|
|
|
|
|
return $conv_time['hours'] . ':' . $conv_time['minutes'] . ':' . $conv_time['seconds'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function convertSecondsToArrayTime($seconds) {
|
|
|
|
|
$conv_time = array();
|
|
|
|
|
$conv_time['days'] = floor($seconds / 86400);
|
|
|
|
|
$conv_time['hours'] = floor(($seconds - ($conv_time['days'] * 86400)) / 3600);
|
|
|
|
|
$conv_time['minutes'] = floor(($seconds - (($conv_time['days'] * 86400) + ($conv_time['hours'] * 3600))) / 60);
|
|
|
|
|
$conv_time['seconds'] = floor(($seconds - (($conv_time['days'] * 86400) + ($conv_time['hours'] * 3600) + ($conv_time['minutes'] * 60))));
|
|
|
|
|
return $conv_time;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ___GetVariavel(&$server, &$usuario, &$senha, &$versao) {
|
|
|
|
|
if ($server) {
|
|
|
|
|
$serv = explode("||", $server);
|
|
|
|
|
$server = $serv[0];
|
|
|
|
|
$usuario = $serv[1];
|
|
|
|
|
$senha = $serv[2];
|
|
|
|
|
$versao = $serv[3];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
|
|
|
//* FUN<EFBFBD><EFBFBD>ES PARA OBTER DADOS DO MANAGER *
|
|
|
|
|
//* *********************************** *
|
|
|
|
|
//**************************************************************************
|
|
|
|
|
|
|
|
|
|
function ___GetMonitoramentoChamadas($socket) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Inicializa<EFBFBD><EFBFBD>o das v<EFBFBD>riaveis.
|
|
|
|
|
*/
|
|
|
|
|
$versao = $_SESSION['SSMonitorVersao'];
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Parametros de leitura do manager
|
|
|
|
|
*/
|
|
|
|
|
$params = array('action' => 'command', 'command' => 'core show channels concise');
|
|
|
|
|
$result = GetAmi($socket, $params);
|
|
|
|
|
$res = ___GetConcise($result);
|
|
|
|
|
|
|
|
|
|
if ($versao == "1.4") {
|
|
|
|
|
$chamadas = ___GetChannels($res);
|
|
|
|
|
} else if ($versao == "13") {
|
|
|
|
|
$chamadas = ___GetChannels13($res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $chamadas;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ___GetRamaisChamadas($socket) {
|
|
|
|
|
$ramais = ___GetMonitoramentoRamais($socket);
|
|
|
|
|
$chamadas = ___GetMonitoramentoChamadas($socket);
|
|
|
|
|
|
|
|
|
|
foreach ($ramais as $k => $rm) {
|
|
|
|
|
$ramais[$k]['Duration'] = ' ';
|
|
|
|
|
|
|
|
|
|
foreach ($chamadas as $cm) {
|
|
|
|
|
if (trim($rm['ObjectName']) == trim($cm[8])) {
|
|
|
|
|
$ramais[$k]['CallInput'] = $cm[7];
|
|
|
|
|
$ramais[$k]['Duration'] = SecondsToStrTime($cm[10]);
|
|
|
|
|
$ramais[$k]['StatusCall'] = 'E';
|
|
|
|
|
$ramais[$k]['CallChannel'] = $cm[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (trim($rm['ObjectName']) == trim($cm[7])) {
|
|
|
|
|
$ramais[$k]['CallOutput'] = $cm[8];
|
|
|
|
|
$ramais[$k]['Duration'] = SecondsToStrTime($cm[10]);
|
|
|
|
|
$ramais[$k]['StatusCall'] = 'S';
|
|
|
|
|
$ramais[$k]['CallChannel'] = $cm[0];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $ramais;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ___GetMonitoramentoRamais($socket) {
|
|
|
|
|
$rand = rand(000000000, 9999999999);
|
|
|
|
|
$end = 'PeerlistComplete';
|
|
|
|
|
$write = 0;
|
|
|
|
|
$params = [
|
|
|
|
|
'action' => 'sippeers',
|
|
|
|
|
'ActionID' => $rand
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
foreach ($params as $key => $value) {
|
|
|
|
|
$write = fwrite($socket, "$key: $value\r\n");
|
|
|
|
|
if (!$write) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fwrite($socket, "ActionID: $rand\r\n\r\n");
|
|
|
|
|
if (!$write) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$result = array();
|
|
|
|
|
$x = 0;
|
|
|
|
|
while (!feof($socket)) {
|
|
|
|
|
$line = trim(fgets($socket));
|
|
|
|
|
|
|
|
|
|
if ($line) {
|
|
|
|
|
$var = explode(": ", $line);
|
|
|
|
|
$result[$x][$var[0]] = trim($var[1]);
|
|
|
|
|
} else {
|
|
|
|
|
$x++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (stripos($line, $end) !== false) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ar = array_map(function($z) {
|
|
|
|
|
if ($z['Event'] == 'PeerEntry') {
|
|
|
|
|
return $z;
|
|
|
|
|
}
|
|
|
|
|
}, $result);
|
|
|
|
|
|
|
|
|
|
return array_filter($ar);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ___GetConcise($result) {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Limpando array do AMI.
|
|
|
|
|
*/
|
|
|
|
|
$count = count($result) - 1;
|
|
|
|
|
unset($result[$count]);
|
|
|
|
|
|
|
|
|
|
for ($a = 0; $a < 3; $a++) {
|
|
|
|
|
unset($result[$a]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($result as $key => $chm) {
|
|
|
|
|
$result[$key] = explode('!', $chm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ___GetChannels($chamadas) {
|
|
|
|
|
$arChamadas = array();
|
|
|
|
|
$x = 0;
|
|
|
|
|
|
|
|
|
|
foreach ($chamadas as $chn) {
|
|
|
|
|
|
|
|
|
|
$cham = explode('/', $chn[0]);
|
|
|
|
|
|
|
|
|
|
if ($chn[11] != '(None)') {
|
|
|
|
|
$ramal = explode('/', $chn[0]);
|
|
|
|
|
$ramal = explode('-', $ramal[1]);
|
|
|
|
|
|
|
|
|
|
$chann = explode('/', $chn[11]);
|
|
|
|
|
$chann = explode('@', $chann[1]);
|
|
|
|
|
$chann = explode('-', $chann[0]);
|
|
|
|
|
} else {
|
|
|
|
|
$chann[0] = 'Em Espera';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($cham[0] != 'Local' && $cham[0] != 'Agent') {
|
|
|
|
|
$arChamadas[$x] = $chn;
|
|
|
|
|
$arChamadas[$x][8] = $chann[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($ramal[0] == $chann[0]) {
|
|
|
|
|
unset($arChamadas[$x]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$x++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($arChamadas as $key => $val) {
|
|
|
|
|
foreach ($arChamadas as $rm) {
|
|
|
|
|
if ($val[0] == $rm[11] || $val[7] == $val[8]) {
|
|
|
|
|
unset($arChamadas[$key]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $arChamadas;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ___GetChannels13($chamadas) {
|
|
|
|
|
$arChamadas = array();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* CLASSIFICA O TIPO DE CHAMADA
|
|
|
|
|
*/
|
|
|
|
|
foreach ($chamadas as $key => $chnl) {
|
|
|
|
|
$arChamadas[$key] = $chnl;
|
|
|
|
|
if ($chnl[1] != "ext-transferencia") {
|
|
|
|
|
foreach ($chamadas as $chave => $chn) {
|
|
|
|
|
|
|
|
|
|
if ($chn[12] == $chnl[12] && $chn[0] != $chnl[0] && $chn[5] == "AppDial") {
|
|
|
|
|
$arChamadas[$key][9] = $chn[7];
|
|
|
|
|
unset($arChamadas[$chave]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if ($chnl[1] == "ext-transferencia") {
|
|
|
|
|
if ($chnl[2] == $chnl[7]) {
|
|
|
|
|
unset($arChamadas[$key]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* LIMPA OS DADOS QUE EST<EFBFBD> FORA DE CONTEXTO COM AS CHAMADAS CORRENTES
|
|
|
|
|
*/
|
|
|
|
|
foreach ($arChamadas as $chv => $chamada) {
|
|
|
|
|
if ($chamada[5] == "AppDial" && empty($chamada[9]) && $chamada[3] > 1) {
|
|
|
|
|
unset($arChamadas[$chv]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($chamada[5] == "Dial" && empty($chamada[9]) && $chamada[3] < 18) {
|
|
|
|
|
unset($arChamadas[$chv]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($chamada[1] == "ext-transferencia") {
|
|
|
|
|
unset($arChamadas[$chv]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* LIMPA OS DADOS QUE N<EFBFBD>O EST<EFBFBD>O SENDO UTILIZADOS
|
|
|
|
|
*/
|
|
|
|
|
foreach ($arChamadas as $sc => $cham) {
|
|
|
|
|
|
|
|
|
|
foreach ($arChamadas as $ky => $chm) {
|
|
|
|
|
if ($chm[0] != $cham[0] && $cham[12] == $chm[12] && $chm[5] == "AppDial") {
|
|
|
|
|
unset($arChamadas[$ky]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($chm[0] != $cham[0] && $cham[7] == $chm[7] && $chm[5] == "AppDial") {
|
|
|
|
|
unset($arChamadas[$ky]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($chm[0] != $cham[0] && $cham[7] == $chm[7] && $chm[5] == "Dial") {
|
|
|
|
|
unset($arChamadas[$sc]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$chamadaChn = explode(';', $chm[0]);
|
|
|
|
|
$chamadaChn2 = explode(';', $cham[0]);
|
|
|
|
|
|
|
|
|
|
if ($chamadaChn[0] == $chamadaChn2[0] && $cham[5] == "AppQueue") {
|
|
|
|
|
unset($arChamadas[$sc]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* MONTA O ARRAY DE ACORDO COM A GRID NO MONITOR
|
|
|
|
|
*/
|
|
|
|
|
foreach ($arChamadas as $map => $app) {
|
|
|
|
|
if (strpos($app[9], ".") !== false) {
|
|
|
|
|
$arChamadas[$map][8] = "Em espera";
|
|
|
|
|
} else if ($app[9]) {
|
|
|
|
|
$arChamadas[$map][8] = $app[9];
|
|
|
|
|
} else {
|
|
|
|
|
$arChamadas[$map][8] = "Em espera";
|
|
|
|
|
}
|
|
|
|
|
$arChamadas[$map][10] = $app[11];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $arChamadas;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function responseJSON($data){
|
|
|
|
|
header('Content-type: application/json');
|
|
|
|
|
echo json_encode($data);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
?>
|