PABX da Simples IP
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.

611 lines
19 KiB

#!/usr/bin/php -q
<?php
// *************************************************************************
// * Coment<EFBFBD>rio atualiza_central *
// * Data de cria<EFBFBD><EFBFBD>o: 19/03/2019 *
// * Autor: Lucas Awade. *
// * Equipe: Desenvolvimento. *
// * Vers<EFBFBD>o: 2.0 *
// * ***********************************************************************
// * Este script tem a finalidade de realizar as atualiza<EFBFBD><EFBFBD>es de acordo com a
// * central de atualiza<EFBFBD><EFBFBD>es composta no banco de dados cadastrado. O script deve
// * ficar em um servidor visivel para que possa ser baixado na central e executado.
// * Todas as informa<EFBFBD><EFBFBD>es geradas s<EFBFBD>o transmitidas para a central de atualiza<EFBFBD><EFBFBD>es
// * para que tenha o controle de cada status.
// *
// * Ele deve estar junto com o arquivo atualizacao.sh em uma pasta atualiza
// * compactado em formato tar.gz
// *
// *************************************************************************
ini_set("memory_limit", "1024M");
// *************************************************************************
// * CHAMADAS DO SCRIPT *
// *************************************************************************
// *
// * MODO MANUAL -> /var/lib/asterisk/scripts/atualizacao/atualiza/atualiza_central.php DB RELOAD
// * OBS: Os argumentos podem estar em letras min<EFBFBD>sculas ou mai<EFBFBD>sculas.
// *
// *************************************************************************
// *
// * MODO AUTOMATICO -> /home/simples/atualiza/atualiza_central.php $1 STEPX &
// * OBS: Esse modo <EFBFBD> feito pela atualiza automatica com o atualizacao.sh.
// *
// *************************************************************************
/*
* Define o tamanho que o disco deve possuir para a instala<EFBFBD><EFBFBD>o da aplica<EFBFBD><EFBFBD>o.
*/
$sizeDisc = 2048; // --> 2 GB
/*
* HABILITA O SISTEMA DE LOG -> /var/log/asterisk/atualiza_central.log
*/
$gravarLog = 1;
/*
* ARQUIVO DO INSTALADOR PARA SER BAIXADO NO SERVIDOR REMOTO
*/
$downInstalador = "http://192.168.115.12/downloads/instalador_simplesip/atualizacao_automatica";
/*
* ARQUIVO DA BASE PARA SER BAIXADO NO SERVIDOR REMOTO
*/
$downBase = "http://192.168.115.12/downloads/banco/";
/*
* DIRETORIO DE LOG's GERADOS
*/
$pathLog = "/home/simples/atualiza_central.log";
/*
* DIRETORIO DO ARQUIVO PARA INSTALACAO
*/
$pathInstall = "/home/simples/aplicativo-simplesip/";
/*
* DIRETORIO DO ARQUIVO DE INSTALADOR
*/
$pathAtualiza = "/home/simples/atualiza/";
/*
* DIRETORIO DE BACKUP
*/
$pathBackup = "/hdaux/backup/";
/*
* ARQUIVO SQL
*/
$nomeSQL = null;
/*
* VERSAO PHP DE INSTALACAO
*/
$versaoPHP = '5.6';
/*
* $argv[1] -> IP DA VPN
* $argv[2] -> PARTE DA ATUALIZACAO
*/
try {
/*
* VERIFICA OS ARQUIVOS DE INCLUDE DO PROJETO
*/
___Includes();
/*
* ATUALIZA<EFBFBD><EFBFBD>O DA BASE DE DADOS
* $versao[0] -> Vers<EFBFBD>o que vai ser atualizada a aplica<EFBFBD><EFBFBD>o
* $versao[1] -> Arquitetura do sistema operacional 32 ou 64 bits
* $versao[2] -> Vers<EFBFBD>o atual da aplica<EFBFBD><EFBFBD>o
* $versao[3] -> Tamanho do disco
*/
if (strtoupper($argv[1]) != "DB") {
if (!$argv[1]) {
GravarLog('ERRO[8] IP/VPN', 'ERROR');
throw new Exception('ERRO[8] IP/VPN');
}
$connect = ___GetConectPG();
$versao = GetLastVersao($argv[1]);
chdir('/home/simples/');
}
switch (strtoupper($argv[2])) {
case 'STEP1':
GravarLog('Executando STEP 1', 'DEBUG');
___Process('stop');
___AnalisaDisco($sizeDisc);
___GetAtualizaBase(GetVersao(), $versao[0]);
___GetDownload("aplicativo-simplesip_v{$versao[0]}.tar.gz");
break;
case 'STEP2':
GravarLog('Executando STEP 2', 'DEBUG');
___AnalizaArquivos($pathInstall, $pathBackup, $versao[0]);
break;
case 'STEP3':
GravarLog('Executando STEP 3', 'DEBUG');
$localcon = ___GetConnectLocal();
___Process('start');
___GetMontaTabelas($localcon);
___Process('restart');
___SetAtualizacao($argv[1], 'ATUALIZADA', $versao[0]);
GravarLog('Fim da instalacao com sucesso!', 'DEBUG', 1);
break;
case 'RELOAD':
GravarLog('Executando RELOAD', 'DEBUG');
$localcon = ___GetConnectLocal();
___GetMontaTabelas($localcon, true, true, true);
GravarLog("Logs gerados em $pathLog", 'INFO');
GravarLog('Fim da instalacao.', 'DEBUG', 1);
break;
default:
GravarLog("Problemas nos STEPS", 'ERRO');
}
exit();
} catch (Exception $ex) {
$msg = $ex->getMessage();
___SetAtualizacao($argv[1], $msg, null);
GravarLog('Fim da instalacao com erro!', 'CRITICAL');
MataProcesso();
}
// *************************************************************************
// * *
// * FUNCOES NECESSARIAS DA ATUALIZACAO *
// * *
// *************************************************************************
/*
* VERIFICA SE A VERS<EFBFBD>O EST<EFBFBD> ATUALIZADA
*/
function GetLastVersao($ip) {
global $connect;
$query = "SELECT sistema_central, versao_central, disco_central,atualizar_versao_central AS versao_atualizacao FROM central_atualizacao WHERE ip_central = '$ip'";
$result = pg_query($connect, $query);
$versaoCli = pg_fetch_assoc($result);
GravarLog('Verificando a versao do sistema para ser instalada.', 'DEBUG');
if ($versaoCli['versao_central'] == $versaoCli['versao_atualizacao']) {
GravarLog('A versao do sistema ja possui as configuracao atualizadas.', 'DEBUG');
throw new Exception('[9] ATUALIZADA');
}
$string = explode("|", $versaoCli['sistema_central']);
$arquitetura = $string[1];
return array($versaoCli['versao_atualizacao'], $arquitetura, $versaoCli['versao_central'], $versaoCli['disco_central']);
}
function ___AnalisaDisco($sizeDisc) {
GravarLog('Analizando espaco em disco.', 'DEBUG');
$disco = exec("df -m / | egrep '/$|/hd2$' | egrep -o '.+G|.+%|.+T|.+M' | sed -e 's/^\/dev.*sda[0-9]//g' | sed -e 's/.*root//g' | awk {'print $3'}");
/*
* VERIFICA O ESPACO EM DISCO
*/
if ($disco <= $sizeDisc) {
GravarLog("O disco tem menos que $sizeDisc MB.", 'CRITICAL');
throw new Exception("[2] DISCO CHEIO (MENOR $sizeDisc GB)");
}
GravarLog('Leitura do disco', 'OK');
}
/*
* REALIZA A MANUTEN<EFBFBD><EFBFBD>O DO BANCO DE DADOS REFERENTES AS VES<EFBFBD>ES TRATADAS!
*/
function ___GetAtualizaBase($versaoAtual, $versaoNova) {
global $downBase, $nomeSQL;
if (!$versaoAtual && !$versaoNova) {
throw new Exception('[13]N<EFBFBD>o foi poss<EFBFBD>vel identificar vers<EFBFBD>es!');
}
$conhost = ___GetConnectLocal();
$search = array();
$nomeSQL = "pbx-upd-{$versaoAtual}-{$versaoNova}.sql";
GravarLog('Iniciando atualizacao da base de dados ', 'DEBUG');
exec("wget --spider --quiet http://192.168.115.12/downloads/banco/$nomeSQL && echo 'OK' || echo 'FAIL'", $search);
GravarLog("Status do arquivo SQL no servidor", $search[0]);
/*
* VERIFICA SE O ARQUIVO J<EFBFBD> EXISTE
*/
if ($search[0] == "OK") {
/*
* ESPERA O DOWNLOAD DO ARQUIVO
*/
while (!file_exists($nomeSQL)) {
GravarLog('Efetuando Download do arquivo ', 'DEBUG');
exec("wget " . $downBase . $nomeSQL);
sleep(2);
}
$handle = fopen($nomeSQL, 'rb');
$contents = fread($handle, filesize($nomeSQL));
fclose($handle);
GravarLog('Executando instrucao SQL DIFF da base de dados', 'DEBUG');
pg_query($conhost, "BEGIN;");
pg_query($conhost, $contents);
$errorbase = pg_last_error();
if ($errorbase) {
pg_query($conhost, "ROLLBACK;");
GravarLog('[6] ATUALIZAR BASE ' . $errorbase, 'CRITICAL');
throw new Exception("[6] ATUALIZAR BASE " . $errorbase);
}
pg_query($conhost, "COMMIT;");
GravarLog('SQL DIFF', 'OK');
unlink($nomeSQL);
GravarLog('Removendo arquivo SQL DIFF.', 'DEBUG');
} else {
GravarLog('N<EFBFBD>o foi poss<EFBFBD>vel encontrar a instrucao SQL DIFF.', 'ERROR');
throw new Exception('[10] N<EFBFBD>o foi poss<EFBFBD>vel encontrar a instrucao SQL DIFF');
}
}
function ___GetDownload($arquivo) {
global $downInstalador;
if (file_exists($arquivo)) {
GravarLog('Arquivo ja localizado!', 'DEBUG');
} else {
GravarLog('Iniciando download do arquivo...', 'DEBUG');
/*
* ESPERA O DOWNLOAD DO ARQUIVO
*/
while (!file_exists($arquivo)) {
exec("wget $downInstalador/$arquivo");
sleep(3);
}
GravarLog('Executando o download do arquivo!', 'DEBUG');
}
GravarLog('Procurando arquivo de instalacao.', 'DEBUG');
exec("tar -xzf $arquivo");
exec("/bin/rm -Rf $arquivo");
}
function ___AnalizaArquivos($pathInstall, $pathBackup, $versao) {
$dirBackup = $pathBackup . "backup_" . date("Y-m-d") . "_" . rand(0, 99);
$dirHtml = "/var/www/html/";
GravarLog('O backup dos arquivos antigos: ' . $dirBackup, 'INFO');
/*
* Cria um novo diretorio de backup
*/
if (!is_dir($pathBackup)) {
mkdir($pathBackup);
}
mkdir($dirBackup);
/*
* Diretorios de substituicao
*/
$diretorios = array(
"asterisk" => array(
'/var_lib_asterisk/',
'/etc_asterisk/',
'/hdaux_utilitarios_scripts/'
),
"agenda" => array(),
"aplicativo" => array(),
"include" => array()
);
foreach ($diretorios as $key => $patch) {
/*
* Verifica se <EFBFBD> um diretorio e se existe
*/
if (is_dir($pathInstall . $key) && count($patch)) {
/*
* Percorre as outras estruturas composta do arquivo
*/
foreach ($patch as $subDir) {
if (is_dir($pathInstall . $key . $subDir)) {
/*
* Renomeia os arquivos com _ para /
*/
$patchSub = str_replace("_", "/", $subDir);
/*
* Realiza o backup da pasta do arquivo.
*/
exec("/bin/cp -Rap $patchSub $dirBackup");
exec("/bin/rm -Rf $patchSub");
mkdir($patchSub);
/*
* Copia os novos arquivos.
*/
exec("/bin/cp -Rap " . $pathInstall . $key . $subDir . "* $patchSub");
sleep(2);
}
}
} else if (is_dir($pathInstall . $key)) {
/*
* Realiza o backup da pasta do arquivo.
*/
exec("/bin/cp -Rap " . $dirHtml . $key . " $dirBackup");
exec("/bin/rm -Rf " . $dirHtml . $key);
/*
* Copia os novos arquivos.
*/
exec("/bin/cp -Rap " . $pathInstall . $key . " " . $dirHtml);
sleep(3);
}
}
/*
* COPIA O BACKUP astdb.sqlite3
*/
exec(sprintf("/bin/cp -Rfap %s %s", $dirBackup . "/asterisk/astdb.sqlite3", "/var/lib/asterisk/"));
/*
* VERIFICACAO DE ARQUIVOS CRIPTOGRAFADOS
*/
if ($versao >= '1.7.3') {
global $versaoPHP;
$search = array();
if (!file_exists('/etc/ioncube_loader.so')) {
//COPIANDO NOVO PHP.INI
exec(sprintf("/bin/cp -Rfap %s %s", $pathInstall . "include" . "/scriptdb/install/php/php.ini", "/etc/php.ini"));
//ARQUITETURA DO SERVIDOR
exec('uname -m', $search);
$arquitetura = $search[0] == "x86_64" ? "x64" : "x32";
//COPIANDO ioncube -
$patchIoncube = $pathInstall . "include/scriptdb/install/php/encoder/$arquitetura/ioncube_loader_lin_$versaoPHP.so";
exec(sprintf('/bin/cp -Rap %s %s', $patchIoncube, "/etc/"));
//renomeando o ioncube.so
rename("/etc/ioncube_loader_lin_$versaoPHP.so", "/etc/ioncube_loader.so");
GravarLog('Instalacao do Ioncube', 'OK');
}
}
GravarLog('A copia dos arquivos foram efetuadas', 'DEBUG');
exec("/bin/rm -Rf $pathInstall");
}
// *************************************************************************
// * *
// * CONEXOES E SCRIPTS SQL *
// * *
// *************************************************************************
/*
* ESCREVE NO BANCO AS INFORMA<EFBFBD><EFBFBD>ES GERADAS PELA ATUALIZA<EFBFBD><EFBFBD>O
*/
function ___SetAtualizacao($ip, $status, $atualizado = '') {
global $connect;
if ($atualizado == GetVersao()) {
$atualizado = sprintf(", versao_central = '$atualizado', atualizar_versao_central = '', data_atualizacao = '%s'", date('Y-m-d'));
}
$query = "UPDATE central_atualizacao SET atualizar_central = 0, status_central = '$status' $atualizado WHERE ip_central = '$ip'";
pg_query($connect, $query);
if (pg_last_error()) {
GravarLog('[12] SQL - ' . pg_last_error(), 'CRITICAL');
throw new Exception("[12] SQL - " . pg_last_error());
}
}
/*
* CONEX<EFBFBD>O COM O BANCO DE DADOS DA CENTRAIS DE ATUALIZA<EFBFBD><EFBFBD>O
*/
function ___GetConectPG() {
$dbhost = '192.168.115.12';
$port = '5432';
$db = 'atualizacoes';
$user = 'contacte';
$passwd = 'ctepgSQL';
GravarLog("Conectando com o servidor $dbhost.", 'DEBUG');
$connect = pg_connect("host=$dbhost port=$port dbname=$db user=$user password=$passwd");
if (pg_last_error()) {
GravarLog('[5] CONEX<EFBFBD>O ' . pg_last_error(), 'CRITICAL');
throw new Exception("[5] CONEX<EFBFBD>O C/$dbhost");
}
GravarLog("Conexao com o servidor $dbhost", 'OK');
return $connect;
}
/*
* CONEX<EFBFBD>O COM O BANCO DE DADOS DA CENTRAIS DE ATUALIZA<EFBFBD><EFBFBD>O
*/
function ___GetConnectLocal() {
$localhost = "127.0.0.1";
GravarLog("Conectando com o servidor $localhost", 'DEBUG');
//$conlocal = pg_connect("host=$localhost port=5432 dbname=pbx user=contacte password=ctepgSQL");
$conlocal = pg_connect(GetDefStrDb());
if (pg_last_error()) {
GravarLog('[5] CONEX<EFBFBD>O DB - ' . pg_last_error(), 'CRITICAL');
throw new Exception("[5] CONEX<EFBFBD>O C/$localhost");
}
GravarLog("Conexao com o servidor $localhost", 'OK');
return $conlocal;
}
// *************************************************************************
// * *
// * GERACAO DE ERROS E LOGS *
// * *
// *************************************************************************
/*
* FUN<EFBFBD><EFBFBD>O PARA GERAR LOGS NA OPERA<EFBFBD><EFBFBD>O
*/
function GravarLog($log, $type = 'ERROR', $lastLog = null) {
global $gravarLog, $pathLog;
if ($gravarLog) {
$logs = date('d/m/Y H:i:s') . str_pad(" [ $type ]", 15) . $log . "\n";
file_put_contents($pathLog, $logs, FILE_APPEND);
if ($lastLog) {
exec("/bin/mv $pathLog /home/simples/atualiza_central_" . date('Y-m-d_H-i-s') . ".log");
}
}
}
/*
* FUN<EFBFBD><EFBFBD>O PARA VALIDAR DADOS
*/
function MataProcesso() {
global $nomeSQL;
GravarLog('Executando MataProcesso!', 'DEBUG');
if (file_exists($nomeSQL)) {
unlink($nomeSQL);
}
___Process('start');
$pid = exec("ps aux|grep atualizacao.sh | awk {'print $2'} | head -n1");
shell_exec("kill -9 $pid");
GravarLog('Executado MataProcesso!', 'INFO', 1);
}
function ___GetMontaTabelas($conexao, $reload = true, $reloadUra = true, $hdaux = false) {
GeraKhomp($conexao, 1);
IncluiAgenteFile($conexao);
$tabelas = array(
// ARQUIVO RELOAD DIALPLAN
array('AGENTS_GENERAL', 'N', 'N'),
array('ANUNCIOS', 'Y', 'N'),
array('CALLBACK', 'N', 'N'),
array('CALLBACK', 'Y', 'N'),
array('CONTEXTOS', 'N', 'N'),
array('CONTEXTOS', 'Y', 'N'),
array('CONFERENCIA', 'Y', 'N'),
array('DISA', 'Y', 'N'),
array('DGV', 'Y', 'N'),
array('FACILIDADES', 'Y', 'N'),
array('FEATURES_APPLICATION', 'N', 'N'),
array('FEATURE_FEATUREMAP', 'Y', 'N'),
array('FEATURE_GENERAL', 'Y', 'N'),
array('HORARIOS', 'N', 'N'),
array('HORARIOS', 'Y', 'N'),
array('IAX_PBX', 'Y', 'N'),
array('IAX_GENERAL', 'Y', 'N'),
array('DISA', 'Y', 'N'),
array('MUSICHOLD_GRUPOS', 'Y', 'N'),
array('PBX', 'Y', 'N'),
array('QUEUES_GRUPOS', 'Y', 'N'),
array('ROTA_ENTRADA', 'Y', 'N'),
array('ROTAS_SAIDA', 'N', 'N'),
array('SIP_RAMAIS', 'Y', 'N'),
array('SIP_GENERAL', 'Y', 'N'),
array('TESTES', 'Y', 'N'),
array('URA', 'N', 'N'),
array('VOICEMAIL', 'Y', 'N'),
array('URA', 'Y', 'Y')
);
foreach ($tabelas as $dados) {
GravarLog('INICIANDO ' . str_pad($dados[0], 20, ' '), 'DEBUG');
$idxGeraArq = $dados[0];
$reload = $dados[1] === 'Y' ? $reload : false;
$dialPlan = $dados[2] === 'Y' ? $reloadUra : false;
$modoReload = $dados[1] === 'Y' || $dados[2] === 'Y' ? 'RELOAD ' : 'GERADO ';
gera_arquivos($conexao, $idxGeraArq, $reload, $dialPlan);
GravarLog($modoReload . str_pad($dados[0], 20, ' '), 'OK');
sleep(2);
}
if ($hdaux) {
exec("/hdaux/utilitarios/scripts/permissoes_atualizacao.sh");
}
GravarLog('Atualizando permissoes ' . str_pad($dados[0], 20, ' '), 'OK');
GravarLog('Ajusta_tabelas Finalizado.', 'DEBUG');
}
function ___Process($type) {
$local = "/etc/init.d/";
$processos = array(
"httpd",
"rc.pbx",
"supervisor",
"crond",
"abrt",
"cnvrtd"
);
foreach ($processos as $processo) {
// Executa Processo no limbo
if (file_exists($local . $processo)) {
exec(sprintf("%s %s >> %s &", $local . $processo, strtolower($type), "/dev/null"));
GravarLog("service $processo $type", 'DEBUG');
sleep(3);
}
}
}
function ___Includes() {
$includes = array(
"/var/www/html/include/util/funcoesAmi.php",
"/var/www/html/include/util/funcoesApl.php",
"/var/www/html/aplicativo/admin/funcoes.php",
"/var/www/html/aplicativo/contacteFunc.php",
"/var/www/html/include/util/util.php",
"/var/www/html/include/util/constantes.php"
);
foreach ($includes as $inclue) {
if (file_exists($inclue)) {
include($inclue);
} else {
GravarLog("N<EFBFBD>o foi encontrado o arquivo para incluir $inclue", 'CRITICAL');
throw new Exception('N<EFBFBD>o foi poss<EFBFBD>vel incluir ' . $inclue);
}
}
}