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.
 
 
 
 
 
 

273 lines
7.7 KiB

#!/usr/bin/php -q
<?php
error_reporting(E_ERROR);
ini_set('display_errors', "Off");
include("util/util.php");
$display = isset($argv[1]) && $argv[1] == "D";
/*
* Tamanho do pacote de dados inserido no banco de uma vez.
*/
define("NUM_PACK_INSERT", 1000);
/*
* Nome dos campos no banco de dados e as posições nos arrays $arLen e $arPos, que contém informações para leitura do arquivo.
*/
$arCampos = array("prefixo" => 0, "prestadora" => 1, "ini" => 2, "fim" => 3, "spid" => 5);
/*
* Quantidade de carecteres do campo referido.
*/
$arLen = array(0 => 7, 1 => 30, 2 => 4, 3 => 4);
/*
* Posição do campo no arquivo.
*/
$arPos = array(0 => 0, 1 => 7, 2 => 37, 3 => 41);
/*
* Campos que não constam no arquivo e são obtidos através de um campo lido no arquivo.
*/
$arCompl = array();
/*
* Diretorio da aplicação.
*/
$baseDir = dirname(__FILE__);
/*
* Diretorio para download dos arquivos.
*/
$dir = "arquivos_cnl";
/*
* Nome para o arquivo remoto.
*/
$remoteFile = sprintf("cnl_movel_%s.zip", date('Y-m-d')); //Arqjuivo compactado.
/*
* Contera o nome do arquivo de dados descompactados, sempre um txt.
*/
$workFile = ''; //Arqjuivo txt.
/*
* url para o arquivo na anatel.
*/
MsgCnl("acessando local do arquivo!");
$urlFile = "http://sistemas.anatel.gov.br/areaarea/N_Download/Tela.asp?varTIPO=CentralCNL&varPRESTADORA=&varCENTRAL=M&varUF=&varPERIODO=&acao=c&cmd=&varMOD=Publico";
//$urlFile = "http://127.0.0.1/tmp/CE_M_185012.ZIP";
MsgCnl("local do arquivo encontrado!");
/*
* Caminho completo para o diretório de download.
*/
$workDir = sprintf("%s/%s/", $baseDir, $dir);
/*
* Caminho completo para o arquivo baixado.
*/
$remoteFile = sprintf("%s%s", $workDir, $remoteFile);
try {
/*
* Verifica se o diretorio exitir apaga seu conteudo do contrario irá cria-lo.
*/
MsgCnl("Verificando diretorios para download!");
if (!file_exists($workDir)) {
mkdir($workDir);
} else {
system(sprintf("rm -rf %s/*", $workDir));
}
/*
* Baixa o aquivo remoto.
*/
MsgCnl("Baixando o arquivo remoto!");
downloadFile($urlFile, $remoteFile);
if (!file_exists($remoteFile)) {
GeraExcept("Não foi possível baixar o arquivo!");
}
/*
* Desconpacta o arquivo baixado.
*/
MsgCnl("Descompactando o arquivo remoto!");
system(sprintf("unzip -q %s -d %s", $remoteFile, $workDir));
/*
* Pega o nome do arquivo que será im?ortado.
*/
$workFile = sprintf("%s%s", $workDir, GetFileByStr($workDir, ".txt"));
/*
* Verifica se o arquivo foi descompactado.
*/
if (!file_exists($workFile)) {
GeraExcept("Não foi possível descompactar o arquivo!");
}
/*
* Importa o arquivo para o banco de dados
*/
MsgCnl("Iniciando a leitura do arquivo!");
if (!($handle = fopen($workFile, 'r'))) {
GeraExcept("Não foi possível abrir o arquivo! $workFile ");
}
/*
* Comando para o banco de dados.
*/
$cmd = sprintf("insert into prefixos(%s)values(%s);\n", GetArrayKey($arCampos), '%s');
/*
* Conexão para o banco de daods;
*/
$connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '192.168.115.12', '5432', 'portabilidade', 'contacte', 'ctepgSQL');
//$connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL');
$conn = CnpFGetConnection($connStr);
/*
* Inicia transação com o banco de dados.
*/
if (!pg_query($conn, "begin")) {
GeraExcept("Não foi possível iniciar uma transação!");
}
MsgCnl("Transação com banco de dados iniciada!");
MsgCnl("Removendo registros existentes!");
if (!pg_query($conn, "truncate table prefixos")) {
GeraExcept("Não foi possível remover os registros existentes!");
}
MsgCnl("Registros existentes removidos!");
MsgCnl("Zerando contadores!");
if (!pg_query($conn, "SELECT setval('public.prefixos_id_reg_seq', 1, true)")) {
GeraExcept("Não foi possível zerar contadores!");
}
MsgCnl("Contadores zerados!");
$i = 0;
$numLines = 0;
$query = "";
while (!feof($handle)) {
$buffer = trim(fgets($handle));
if (!$buffer) {
continue;
}
$values = '';
//Define a operadora
$prestadora = trim(substr($buffer, 7, 30));
foreach ($arCampos as $key => $value) {
if ($value <= 3) {
$pos = GetPosLine($value);
$tam = GetPosLine($value, false);
$str = trim(substr($buffer, $pos, $tam));
} else {
$str = spid($conn, $prestadora);
}
$values .= !$values ? QuotedStr($str) : ',' . QuotedStr($str);
}
$query .= sprintf($cmd, $values);
$numLines++;
if (++$i >= NUM_PACK_INSERT) {
if (!pg_query($conn, $query)) {
GeraExcept("Não foi possível inserir os registros na base de dados!");
}
MsgCnl(sprintf("Inserido %s registros no banco de dados!", str_pad($numLines, 6, '0', STR_PAD_LEFT)), true);
$query = '';
$i = 0;
}
}
/*
* Se $i < 500 ainda devem ter registros para inserir.
*/
if ($query) {
if (!pg_query($conn, $query)) {
GeraExcept("Não foi possível inserir os registros finais na base de dados!");
}
MsgCnl(sprintf("Inserido %s registros no banco de dados!", str_pad($numLines, 6, '0', STR_PAD_LEFT)));
}
/*
* verifica se há algum registro na tabela sem SIPD
*/
$qtde = verificaPrefixo($conn);
if ($qtde > 0)
MsgCnl("ALERTA: foram inseridos $qtde registros sem SPID, favor verificar!");
/*
* Finaliza a transação.
*/
if (!pg_query($conn, "commit")) {
GeraExcept("Não foi possível finalizar a transação!");
}
MsgCnl("Operação finalizada com sucesso!");
fclose($handle);
} catch (Exception $ex) {
$path = '/var/log/asterisk/importa_cnlm.log';
$log = trim($ex->getMessage() . "\n" . GetLasterror() . "\n");
MsgCnl("Erro ao realizar operação: \n" . $log);
WriteLog(str_repeat("-", 255) . "\n", $path);
WriteLog(sprintf("[Data: %s]\n", date('Y-m-d H:i:s')), $path);
WriteLog($log, $path);
WriteLog($query, $path);
WriteLog(str_repeat("-", 255) . "\n", $path);
MsgCnl("Para mais informações consulte o log: $path\n");
}
function GetPosLine($key, $pos = true) {
global $arLen, $arPos;
if ($pos)
return $arPos[$key];
else
return $arLen[$key];
}
function CnpFGetConnection($connStr = '') {
/*
* Se precisar de uma conexão diferente da padrão, espcifique sua propria connection string.
* $connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL');
*/
$connStr = !$connStr ? GetDefStrDb() : $connStr;
$conn = pg_pconnect($connStr);
if (!$conn) {
GeraExcept("Não foi possível estabelecer uma conexão com o banco de dados!");
}
return $conn;
}
function MsgCnl($msg, $bLine = false) {
global $display;
if ($display) {
echo "\r";
echo "\033[K"; // Erase to the end of the line
echo $bLine ? trim(RemoveAcentos($msg)) : ( RemoveAcentos($msg) . "\n");
}
}
function spid($conn, $oper) {
$dados = explode(" ", $oper);
$operadora = $dados[0];
$sql = "select spid from atualiza_routing where upper(prestadora) like(upper('%$operadora%')) limit 1";
$result = pg_query($conn, $sql);
$row = pg_fetch_row($result);
return $row[0];
}
function verificaPrefixo($conn) {
$sql = "select count(*) from prefixos where (spid is null or spid = '')";
$result = pg_query($conn, $sql);
$row = pg_fetch_row($result);
return $row[0];
}