forked from SimplesIP/pabx-app
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.
417 lines
13 KiB
417 lines
13 KiB
<?php |
|
|
|
/* |
|
* Limpar o buffer |
|
*/ |
|
ob_flush(); |
|
|
|
/* |
|
* Declaração de vá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ção</th><th>Status</th><th>Canal</th><th></th></tr>"; |
|
|
|
try { |
|
|
|
/* |
|
* Botã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ão do usuá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ão foi possivel conectar ao manager, por favor verifique sua conexão ou informações as de acesso!</th></tr>"; |
|
} |
|
} |
|
|
|
$jsJQuery[] = "$('#message b').text('$mensagem');"; |
|
} catch (Exception $ex) { |
|
$mensagem = $ex->getMessage(); |
|
} |
|
|
|
/* |
|
* CHAMADA DO METODO DE ATUALIZAÇÃ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ÇÕES PARA FORNECER DADOS AO APLICATIVO * |
|
//* ***************************************** * |
|
//************************************************************************** |
|
|
|
/* |
|
* Funçã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ã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ão foi possí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ÇÕES PARA OBTER DADOS DO MANAGER * |
|
//* *********************************** * |
|
//************************************************************************** |
|
|
|
function ___GetMonitoramentoChamadas($socket) { |
|
|
|
/* |
|
* Inicialização das vá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Á 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ÃO ESTÃ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; |
|
} |
|
?>
|
|
|