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.

353 lines
9.9 KiB

#!/usr/bin/php -q
<?php
error_reporting(E_ERROR);
ini_set('display_errors', "Off");
ini_set("memory_limit", "512M");
/*
* Diretorio de registro de log do sistema
*/
define("DIRETORIO_LOG", "/var/log/asterisk/portab_atualiza_cli.log");
define("DIRETORIO_DOWNLOAD_CLIENTE", "/import/download/");
/*
* N<EFBFBD>mero m<EFBFBD>ximo de registros em uma transa<EFBFBD><EFBFBD>o.
*/
define("MAX_REG_TRASACAO", 1000);
//include('util/util.php');
//include('funcoes/shared.php');
include 'configCliente.php';
//include 'funcoes.php';
/*
* verifica se o script j<EFBFBD> esta em execu<EFBFBD><EFBFBD>o.
* Outra instancia n<EFBFBD>o deve iniciar at<EFBFBD> que seja conluida a opera<EFBFBD><EFBFBD>o.
*/
$fileExec = sprintf("/tmp/atualiza_cliente_exec_%s.pid", date("Ymd"));
ExecStart($fileExec);
/*
* Se a constante DEBUG for passada na linha de comando o script lancar<EFBFBD>
* mensagem na tela para acompanhamento.
*/
$debug = (isset($argv[1]) && strtoupper($argv[1]) == 'DEBUG') ? 1 : 0;
$sucess = 1;
$msg = "Inicio da opera<EFBFBD><EFBFBD>o: " . date('d/m/Y h:i:s') . "\n";
$statusAtualizacao = array();
GravaLogPorta($msg);
/*
* Instante em que o script inicia.
*/
$startScrpt = microtime_float();
try {
$file = DIRETORIO_DOWNLOAD_CLIENTE . "atualiza_cliente_$cliIdExterno.txt";
$fileDownload = DIRETORIO_DOWNLOAD_CLIENTE . "atualiza_cliente_$cliIdExterno.tar.gz";
/*
* Cria uma conexao com o servidor local.
*/
$dbLocal = dbConnect($pg_local);
if (!$dbLocal)
throw new Exception(GetExcept("N<EFBFBD>o foi possivel se conectar ao servidor local!"));
/*
* Verifica se existe o diretorio para download, se n<EFBFBD>o existir tenta cria-lo!
*/
DisplayDebub("Verificando diretorios da portabilidade!\n");
if (!VerificaDirDownload(DIRETORIO_DOWNLOAD_CLIENTE)) {
throw new Exception(GetExcept("N<EFBFBD>o foi possivel acessar o diret<EFBFBD>rio de download!\n"));
}
/*
* Acessa a API para baixar o arquivo e registrar uma transacao.
*/
DisplayDebub("Baixando o arquivo!\n");
$url = "http://$serverApi/integracao/index.php?method=PortabClienteAtualiza&cliIdExterno=$cliIdExterno&login=$loginApi&senha=$senhaApi&SIPID=0&tipoRetorno=XML";
if (!downloadFile($url, $fileDownload)) {
throw new Exception(GetExcept("N<EFBFBD>o foi poss<EFBFBD>vel copiar o arquivo remoto!"));
}
AtualizaPortabLocal($dbLocal);
DisplayDebub("Finalizando atualizacoes\n");
} catch (Exception $ex) {
$msgErro = $ex->getMessage();
/*
* Esta mensagem <EFBFBD> gerada qdo o sistema indica que as tabelas
* devem ser limpas e recarregadas novamente a partir do servidor.
*/
$atuGeral = strpos($msgErro, '{PORTABILIDADE}') !== false;
if ($atuGeral) {
$msgErro = "Atuliaza<EFBFBD><EFBFBD>o da Portabilidade conclu<EFBFBD>da com sucesso!";
}
DisplayDebub($atuGeral ? $msgErro : "Erro ao executar atualizacao: $idAtualiza!\n");
$sucess = $atuGeral ? 1 : 0;
@GravaLogPorta($msgErro);
}
$endScrpt = microtime_float();
$msg = sprintf("Fim Atualizacao. Concluidada %s! Data: %s Tempo: %ssec.", ($sucess ? "com sucesso" : "com erro"), date('d/m/Y h:i:s'), ($endScrpt - $startScrpt));
DisplayDebub($msg . "\n");
GravaLogPorta($msg);
/*
* Libera a execucao do scrit.
*/
ExecEnd($fileExec);
function AtualizaPortabLocal($dbLocal) {
/*
* Descompacta o arquivo remoto.
*/
global $file, $fileDownload;
DisplayDebub("Preparando o arquivo da portabilidae!\n");
if (!UcompressFile($fileDownload, $file, DIRETORIO_DOWNLOAD_CLIENTE)) {
throw new Exception(GetExcept("N<EFBFBD>o foi possivel descompactar o arquivo remoto!"));
}
$seek = 0;
$handle = null;
$query = '';
$fimArquivo = false;
$numeroRegInserido = 0;
$inTran = false;
try {
DisplayDebub("Iniciando a atualizacao da portabilidade!\n");
/*
* Inicia a transacao com o banco de dados.
*/
if (!pg_query($dbLocal, 'begin')) {
throw new Exception(GetExcept("N<EFBFBD>o foi possivel iniciar uma transacao com o banco de dados!"));
}
$inTran = true;
/*
* Le o arquivo em blocos.
*/
while (!$fimArquivo) {
$linhas = 0;
/*
* Abre o arquivo de comandos para atualizar a tabela de portabilidade.
*/
$handle = @fopen($file, "r+");
/*
* Posiciona o ponteiro para linha correta a ser lida.
*/
fseek($handle, $seek);
while (!feof($handle)) {
/*
* Cada linha do arquivo e um comando insert, update ou delete que
* formara o bloco para ser ececutado no banco de dados.
*/
$buffer = fgets($handle);
/*
* Verifica se o arquivo chegou ao fim.
*/
$fimArquivo = substr($buffer, 0, 3) === '#99';
/*
* Monta o pacote de dados do tamanho de MAX_REG_TRASACAO
* para evitar transacoes longas no banco de dados.
*/
if (!$fimArquivo) {
$query .= $buffer;
$numeroRegInserido++;
}
if (( ++$linhas >= MAX_REG_TRASACAO) || $fimArquivo) {
/*
* Pega a posicao ate onde foi feita a leitura do arquivo.
*/
$seek = ftell($handle);
/*
* Executa comandos no banco de dados.
*/
if ($query && !pg_query($dbLocal, $query)) {
throw new Exception(GetExcept("N<EFBFBD>o foi possivel atualizar a base local da portabilidade!"));
}
$query = '';
break;
}
}
fclose($handle);
}
/*
* Retorna informacoes sobre a atualizacao.
*/
$statusAtualizacao = explode(";", $buffer);
FinalizaAtualizacaoCliente($statusAtualizacao);
if (!pg_query($dbLocal, 'commit')) {
throw new Exception(GetExcept("N<EFBFBD>o foi possivel gravar os dados no banco!"));
}
} catch (Exception $ex) {
if ($inTran) {
pg_query($dbLocal, 'rollback');
}
throw new Exception($ex->getMessage());
}
}
function FinalizaAtualizacaoCliente($info) {
DisplayDebub("Registrando a atualiza<EFBFBD><EFBFBD>o no servidor da portabilidade!\n");
global $cliIdExterno, $serverApi, $loginApi, $senhaApi;
list($end, $status, $cliId, $idAtualiza, $numRegAtu, $statusCli, $msg) = $info;
if ($statusCli == 2) {
exec("/var/lib/asterisk/scripts/portabilidade/install.php > /dev/null");
$msg = "Instala<EFBFBD><EFBFBD>o da portabilidade solicitada, iniciando atualiza<EFBFBD><EFBFBD>o!";
//throw new Exception (GetExcept("Solicitada atualiza<EFBFBD><EFBFBD>o geral da PORTABILIDADE!"));
}
$msg = base64_encode($msg);
$url = "http://$serverApi/integracao/index.php?method=PortabClienteFinaliza&cliIdExterno=$cliIdExterno&cliId=$cliId&idAtualiza=$idAtualiza&numRegAtu=$numRegAtu&msg=$msg&login=$loginApi&senha=$senhaApi&SIPID=0&tipoRetorno=XML";
$xml = simplexml_load_string(file_get_contents($url));
$statusTran = trim($xml->status);
if ($statusTran != 'OK') {
throw new Exception($xml->message);
}
}
/*
* Funcoes dever<EFBFBD>o ser removidas em outra versao,
* todas existem na unit util ou shared; foram
* introduzidas aqui apenas para garantir que
* funcionem em qualque vers<EFBFBD>o.
*/
function ExecStart($fileExec) {
return true;
if (file_exists($fileExec)) {
exit;
}
/*
* Cria o arquivo caso ele n<EFBFBD>o exista.
*/
$arq = fopen($fileExec, 'w');
fclose($arq);
}
function ExecEnd($fileExec) {
return true;
unlink($fileExec);
exit;
}
function DisplayDebub($msg) {
global $debug;
if ($debug) {
echo $msg;
}
}
function GravaLogPorta($txt, $aux = '') {
$txt = trim($txt);
$txt .= trim($aux);
$txt .= (stripos($txt, "Fim") !== false) ? "\n\n" : "\n";
$file = "/var/log/asterisk/portabilidade.log";
$handle = fopen($file, 'a');
fwrite($handle, $txt);
fclose($handle);
}
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec);
}
function dbConnect($pg) {
$conStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", $pg["host"], $pg["port"], $pg["dbname"], $pg["user"], $pg["password"]);
return @pg_connect($conStr);
}
function VerificaDirDownload($dir) {
if (!file_exists($dir)) {
system("mkdir -p $dir");
system("chmod 777 -R $dir");
}
return file_exists($dir);
}
function downloadFile($url, $path) {
$newfname = $path;
$file = fopen($url, "rb");
$contents = stream_get_contents($file);
fclose($file);
$newf = fopen($newfname, "wb");
fwrite($newf, $contents);
fclose($newf);
if (file_exists($newfname)) {
if (filesize($newfname) > 100) {
return true;
}
}
return false;
$newfname = $path;
$file = fopen($url, "rb");
if ($file) {
$newf = fopen($newfname, "wb");
if ($newf)
while (!feof($file)) {
fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
if (file_exists($newfname)) {
if (filesize($newfname) > 100) {
return true;
}
}
return false;
}
function UcompressFile($origem, $arqDestino, $destino = './') {
$result = true;
$cmd = sprintf("tar -xzvf %s -C %s", $origem, $destino);
//$cmd = sprintf("tar -xzf %s -C %s 2>/dev/null", $origem, $destino);
system($cmd, $result);
return file_exists($arqDestino);
/*
* Certifica que o arquivo foi criado com sucesso.
*/
//return file_exists(destino);
}
function GetExcept($msg) {
$ex = error_get_last();
return sprintf("%s\nErro: %s\n", trim($msg), trim($ex['message']));
}
?>