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.
352 lines
9.9 KiB
352 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úmero máximo de registros em uma transaçã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á esta em execução. |
|
* Outra instancia não deve iniciar até que seja conluida a operaçã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á |
|
* mensagem na tela para acompanhamento. |
|
*/ |
|
$debug = (isset($argv[1]) && strtoupper($argv[1]) == 'DEBUG') ? 1 : 0; |
|
$sucess = 1; |
|
$msg = "Inicio da operaçã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ão foi possivel se conectar ao servidor local!")); |
|
|
|
/* |
|
* Verifica se existe o diretorio para download, se não existir tenta cria-lo! |
|
*/ |
|
DisplayDebub("Verificando diretorios da portabilidade!\n"); |
|
if (!VerificaDirDownload(DIRETORIO_DOWNLOAD_CLIENTE)) { |
|
throw new Exception(GetExcept("Não foi possivel acessar o diretó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ão foi possível copiar o arquivo remoto!")); |
|
} |
|
|
|
AtualizaPortabLocal($dbLocal); |
|
|
|
DisplayDebub("Finalizando atualizacoes\n"); |
|
} catch (Exception $ex) { |
|
$msgErro = $ex->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'])); |
|
} |
|
?>
|
|
|