|
|
|
|
#!/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']));
|
|
|
|
|
}
|
|
|
|
|
?>
|