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.
 
 
 
 
 
 

286 lines
9.4 KiB

#!/usr/bin/php -q
<?php
error_reporting(E_ERROR);
ini_set('display_errors', 0);
include("util/constantes.php");
include("util/util.php");
include("funcoes/shared.php");
include("bd.php");
include("util/funcoesAmi.php");
include("phpmailer/class.phpmailer.php");
/*
* Habilita o log do ami.
*/
$debugAmi = 1;
/*
* Indica se a mensagem deve ser enviada sempre que houver uma verificacao
* ou apenas quando existir um erro.
*/
$enviaSomenteErro = true;
/*
* Log do sistema.
*/
$pathLog = "/var/log/asterisk/monitor_0800.log";
/*
* Captura numeros passados na linha de comando ou usa numeros atribuidos diretamente
*/
$numerosDiscar = array('08000068280', '08000068281');
$clienteNome = "Simples IP";
/*
* Tipo de envio
* 1 -> E-mail
* 2 -> SMS
* 3 -> Telegram
* 4 -> Whatsapp
*/
$tipoEnvio = 1;
$destinos = array(
array("nome" => "Amarildo Pereira", "destino" => "amarildo.pereira@simplesip.com.br"),
array("nome" => "Higor F. Silva", "destino" => "higorfsudi@gmail.com"),
array("nome" => "Alan Pablo", "destino" => "alan.pablo@simplesip.com.br")
);
// array("nome" => "Alan Pablo", "destino" => "alan.pablo@simplesip.com.br")
$paramsEnvio = array(
'email_smtp' => 'mail.simplesip.com.br',
'email_auth' => true,
'email_conta_envio' => 'marketing@simplesip.com.br',
'email_senha_envio' => '$m@rk2t3ng_#',
'email_port' => '587',
'email_retorno' => 'noreply@simplesip.com.br',
'email_retorno_nome' => 'Monitor 0800',
'email_envio' => null,
'email_envio_nome' => '',
'email_html' => true,
'email_assunto' => 'Monitoramento para 0800',
'email_body' => '',
'email_charset' => 'iso-8859-1',
'email_template' => '',
'email_template_info' => array()
);
if (isset($argv[1])) {
$numerosDiscar = array();
for ($i = 1; $i < count($argv); $i++) {
$numero = soNumero($argv[$i]);
if ((substr($numero, 0, 4) == "0800") && (strlen($numero) == 11)) {
if (array_search($numero, $numerosDiscar) === false) {
$numerosDiscar[] = $numero;
}
}
}
}
try {
/*
* Verifica se os pre-requisitos para o monitor estao cadastrados:
* 1 -> Um ramal n<EFBFBD>o registrado para o monitor no campo Callerid deve conter "Monitor 0800";
* 2 -> Um anuncio de silencio com o nome "Monitor 0800";
* 3 -> Lista Negra para interceptar a ligacao e direcionara para o an<EFBFBD>ncio do Monitor, o nome da lista deve ser "Monitor 0800".
*/
if (!Monitor0800Check($dbcon)) {
RaiseExcept("Verifique os parametros \"An<EFBFBD>ncio, Lista Negra e Ramal\" do monitor 0800 para continuar!");
}
$params = GetParamsMonitor0800($dbcon);
$ramal = $params['ramal'];
$numeroOrigem = $params['numero_origem'];
$idAnuncio = $params['id_anuncio'];
$maxBilhete = $params['id_bilhetes'];
if (!$socket = ConectaAmi()) {
RaiseExcept("N<EFBFBD>o foi poss<EFBFBD>vel conectar ao servidor!!!", true);
}
$result = array();
foreach ($numerosDiscar as $numDisc) {
if (!AlarmeAmi($socket, "SIP/{$ramal}", $numDisc, $ramal)) {
$result[$numDisc] = array("result" => 9, "data" => date("d/m/Y H:i:s"));
continue;
}
sleep(10);
$result[$numDisc] = MonitorVerificaRetorno($dbcon, $numeroOrigem, $idAnuncio, $maxBilhete);
}
if (!$enviaSomenteErro || GetErro0800($result)) {
/*
* Formata o email para envio, de acordo com os resultados
* coletados no teste.
*/
$paramsEnvio["email_body"] = GetMsg0800($result);
/*
* Envias as informa<EFBFBD><EFBFBD>es de acordo com o metodo escolhido.
*/
EnviaNotificacao($dbcon, $paramsEnvio, $destinos, $tipoEnvio);
}
} catch (Exception $ex) {
GravaLog($ex->getMessage(), $pathLog);
}
function Monitor0800Check($db) {
$query = "select count(*) from (
select '' from pbx_sip_ramais where UPPER(callerid) = 'MONITOR 0800'
union all
select '' from pbx_anuncios where UPPER(nome) = 'MONITOR 0800'
union all
select '' from pbx_listanegra where UPPER(nome) = 'MONITOR 0800'
) as monitor;";
$result = pg_query($db, $query);
$row = pg_fetch_row($result);
return ((int) $row[0] === 3);
/*
select nome from pbx_sip_ramais where UPPER(callerid) = 'MONITOR 0800';
select id from pbx_anuncios where UPPER(nome) = 'MONITOR 0800';
select numero from pbx_listanegra where UPPER(nome) = 'MONITOR 0800';
*/
}
function GetParamsMonitor0800($db) {
$query = "select (select coalesce(max(id_bilhetes), 0) from ast_bilhetes) as id_bilhetes, (select trim(callerid2) from pbx_sip_ramais where UPPER(callerid) = 'MONITOR 0800' ) as numero_origem, (select nome from pbx_sip_ramais where UPPER(callerid) = 'MONITOR 0800') as ramal, ('a' || (select id from pbx_anuncios where UPPER(nome) = 'MONITOR 0800')) as id_anuncio";
$result = pg_query($db, $query);
$row = pg_fetch_array($result, null, PGSQL_ASSOC);
return $row;
}
function MonitorVerificaRetorno($db, $numeroOrigem, $idAnuncio, &$maxBilhete) {
global $pathLog;
$query = sprintf("select id_bilhetes from ast_bilhetes where src = '%s' and dst = '%s' and id_bilhetes > '%s' ;", $numeroOrigem, $idAnuncio, $maxBilhete);
$result = pg_query($db, $query);
if (pg_num_rows($result)) {
$row = pg_fetch_array($result, null, PGSQL_ASSOC);
$maxBilhete = $row["id_bilhetes"];
return array("result" => 1, "data" => date("d/m/Y H:i:s"));
}
return array("result" => 0, "data" => date("d/m/Y H:i:s"));
}
function EnviaNotificacao($dbcon, $paramsEnvio, $destinos, $tipoEnvio) {
/*
* Tipo de envio
* 1 -> E-mail
* 2 -> SMS
* 3 -> Telegram
* 4 -> Whatsapp
*/
foreach ($destinos as $dadosDestino) {
$paramsEnvio["email_envio_nome"] = $dadosDestino["nome"];
$paramsEnvio["email_envio"] = $dadosDestino["destino"];
switch ($tipoEnvio) {
case 1:
$result = SendEmail($paramsEnvio);
break;
case 2:
$result = SendSMS($paramsEnvio);
break;
case 3:
$result = SendTelegram($paramsEnvio);
break;
case 4:
$result = SendWhatsapp($paramsEnvio);
break;
default:
$result = SendEmail($paramsEnvio);
break;
}
}
/*
* As funcoes quando executadas com sucesso devem retornar "true" para que a verificacao
* funcione, qualquer valor diferente sera considerado uma mensagem de erro.
*/
if (!($result === true)) {
GravaLog($result, $pathLog);
}
}
function GetMsg0800($dadosVerificacao) {
/*
* $dadosVerificacao = array("result" => 9, "data" => date("d/m/Y H:i:s"));
* "result":
* 0 -> Discou para o 0800 mas a chamda n<EFBFBD>o foi recebida;
* 1 -> Chamada Atendiada ok;
* 9 -> A chamamada n<EFBFBD>o saiu, portanto algum problema com o tronco de saida;
*/
$tplH = '<table cellspacing="2" cellpadding="3" border="0" style="font-family:Arial; padding: 3; margin: 0; color:black;min-width: 600px">
<tr>
<td align="left">
<h1 style="font-family:Arial; font-weight:bold;font-size:large; color:black;">Verifica<EFBFBD><EFBFBD>o Ralizada para os seguintes n<EFBFBD>meros:</h1>
</td>
</tr>';
$tplB = '<tr>
<td align="left">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="font-family:Arial; padding: 3; margin: 5px; color:black;width: 100%;">
<tr>
<th align="left" width="180">N<EFBFBD>mero:</th>
<td align="left">{NUMERO}</td>
</tr>
<tr>
<th align="left">Resultado:</th>
<td align="left">{RESULTADO}</td>
</tr>
<tr>
<th align="left">Data:</th>
<td align="left">{DATA}</td>
</tr>
</table>
</td>
</tr>';
$tplF = ' <tr>
<td align="left">
<h3 style="font-family:Arial; font-weight:bold;font-size:large; color:black;">Suporte T<EFBFBD>cnico Simples IP</h3>
<p style="font-family:Arial; font-size:medium; color:black;"><strong>0800 006-8280</strong><br/>
<em>suporte@simplesip.com.br</em><br/>
<strong>www.simplesip.com.br</strong></p>
</td>
</tr>
</table>';
$tpl = '';
foreach ($dadosVerificacao as $key => $value) {
switch ($value["result"]) {
case 0: $msg = "<p>Verifica<EFBFBD><EFBFBD>o realizada, a chamada n<EFBFBD>o completou pode indicar problema no 0800!</p>";
break;
case 1: $msg = "<p>A verifica<EFBFBD><EFBFBD>o foi realizada com sucesso!</p>";
break;
default:
$msg = "<p>Falha na verifica<EFBFBD><EFBFBD>o, a chamda n<EFBFBD>o foi realizada, pode indicar problemas com os troncos locais!<p>";
break;
}
$tpl .= $tplB;
$tpl = str_replace("{NUMERO}", $key, $tpl);
$tpl = str_replace("{RESULTADO}", $msg, $tpl);
$tpl = str_replace("{DATA}", $value["data"], $tpl);
}
return $tplH . $tpl . $tplF;
}
function GetErro0800($dadosVerificacao) {
/*
* A chave result com valor 9 indica um erro na discagem(tronco local)
* A chave result com valor 0 indica problema no 0800.
*/
foreach ($dadosVerificacao as $key => $value) {
if (($value["result"] == 0) || ($value["result"] == 9)) {
return true;
}
}
return false;
}