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.
273 lines
7.7 KiB
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]; |
|
}
|
|
|