#!/usr/bin/php -q getMessage(); /* * Esta mensagem é 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ção da Portabilidade concluí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ã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ã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ã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ã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çã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ção da portabilidade solicitada, iniciando atualização!"; //throw new Exception (GetExcept("Solicitada atualizaçã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ão ser removidas em outra versao, * todas existem na unit util ou shared; foram * introduzidas aqui apenas para garantir que * funcionem em qualque versão. */ function ExecStart($fileExec) { return true; if (file_exists($fileExec)) { exit; } /* * Cria o arquivo caso ele nã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'])); } ?>