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.
 
 
 
 
 
 

299 lines
9.9 KiB

#!/usr/bin/php -q
<?php
exit;
/*
* Backup
* Autor: Amarildo Pereira
* Data: 27/02/2013
* Objetivo: Efetuar backup do sistema de acordo com as oonfigura??es
* predefinidas no m?dulo de backup da aplica??o web.
*
* Instalar libssh2-php
* yum install libssh2 libssh2-devel
* pecl install -f ssh2
*
* findmnt | grep -i '/dev/sd'
*
* Backup de audio ? feito apenas da data atual ou informada quando o backup ? manual, podendo ser total ou diferencial, neste
* ?ltimo caso se j? tive feito algum backup no dia vai pegar apenas os arquivos n?o registrados.
*/
error_reporting(E_ALL ^ E_DEPRECATED);
ini_set('display_errors', 1);
ini_set("memory_limit", "512M");
ini_set("max_input_time", "-1");
set_time_limit(0);
/*
* Tempo m?ximo em segundos que o servidor
* pode ficar sem responder.
*/
define("TEMPO_EXPIRA", 5);
/*
* Protocolos Destino
*/
define("PROTO_FTP", 1);
define("PROTO_SFTP", 2);
define("PROTO_REDE", 3);
define("PROTO_LOCAL", 4);
define("PROTO_USB", 5);
/*
* Tipos de Backup;
*/
define("BKP_TIPO_AUDIO", 1);
define("BKP_TIPO_CONFIG", 2);
define("BKP_TIPO_CONFIG_DADOS", 3);
define("BKP_TIPO_DADOS", 4);
/*
* Frequ?ncia Backup.
*/
define("BKP_FREQ_DIARIO", 1);
define("BKP_FREQ_SEMANAL", 2);
/*
* Diretorios
*/
define("BACKUP_PATH_BASE", "/hdaux/backup/simples/");
define("BACKUP_PATH_BASE_MANUAL", "/var/www/html/aplicativo/audio/");
define("BACKUP_PATH_AUDIO", "/var/spool/asterisk/monitor/");
include('utils/classes/StringClass.php');
include('util/util.php');
include("funcoes/shared.php");
include("classes/BackupInfo.php");
include("classes/BackupConfig.php");
include("util/datas.php");
include("phpmailer/class.phpmailer.php");
include('utils/Net/SSH2.php');
include('funcoes.php');
include('vendor/autoload.php');
/**
* @var $bkpConfig BackupConfig
*/
$bkpConfig = BackupConfig::getInstance($argv);
/*
* Identificador da empresa ou outro label que informe a origem do backup;
*/
$origem = "Simples IP LTDA";
/*
* Nivel do log.
*/
$_nivelLog = _LOG_MSG_DISPLAY;
/*
* Inicializa variaveis globais.
*/
$diaSemana = date('w');
$horaAtual = (int) date("H");
$dataAtual = date('d/m/Y');
/*
* Formato do banco de dados;
*/
$dataAtualBD = !$horaAtual ? GetDataServer(-3, 'Y-m-d') : GetDataServer(0, 'Y-m-d');
$dataAtualServer = !$horaAtual ? GetDataHoraServer(-3, 'Y-m-d H:i:s') : GetDataHoraServer(0, 'Y-m-d H:i:s'); //date("Y-m-d H:i:s");
/*
* Confugura??es do backup
*/
$config = $configAgd = $configEmail = $configDestino = $configDestinoUid = array();
/*
* Se n?o forem definidas aqui as configura??es ser?o recuperadas a partir
* das configura??es do Workflow.
*/
/*
$wkfParam["wkf_smtp"] = "mail.simplesip.com.br";
$wkfParam["wkf_smtp_port"] = "587";
$wkfParam["wkf_smtp_user"] = "workflow@simplesip.com.br";
$wkfParam["wkf_smtp_senha"] = "#w0rkFl0w@";
$wkfParam["wkf_smtp_user"] = "workflow@simplesip.com.br";
*/
$wkfParam = null;
/*
* Se n?o for definido uma conex?o para o banco de dados aqui, o sistema ir?
* usar a configura??o padr?o baseada nas informa??es contidas no arquivo
* /var/lib/asterisk/scripts/callcenter/bd e retornadas pela fun??o GetDefStrDb()
* contida no arquivo funcoes/shared.php localizado no diretorio include.
*/
$conStr = false;
//$conStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL');
$erroBackup = null;
try {
/*
* Se a configura??o n?o foi definida manualmente retorna a configura??o padr?o.
*/
if ($conStr === false) {
$conStr = GetDefStrDb();
}
/*
* Inicia a conex?o com banco de dados.
*/
$conn = pg_connect($conStr);
if (!$conn) {
Excpt("N<EFBFBD>o foi poss<EFBFBD>vel conectar ao banco:\n$conStr", "backupManual");
}
if (!$bkpConfig->isManual) {
/*
* Apaga arquivos de backup setados manualmete.
*/
ApagaBkp($conn);
/*
* Apaga arquivos de backup expirados.
*/
ApagaBkpTmp($conn);
}
/*
* Carrega as configura??es do banco de dados.
*/
$config = GetConfiguracoes($bkpConfig->isManual);
$bkpConfig->setBackupConfig($config);
foreach ($bkpConfig->getConfig() as $configId => $bkpData) {
$bkpRealizado = 0;
$arConfig = $bkpData['config'];
$configAgd = $bkpData['agenda'];
/*
* Verifica se existe agendamento para o horario atual ou dia da semana.
*/
$agenda = $arConfig["frq_id"] == BKP_FREQ_DIARIO ? $horaAtual : $diaSemana;
$existeBackup = VerificaBkpReg($configId, $dataAtualBD, $agenda);
$taNaHora = in_array($agenda, $configAgd);
if (($taNaHora && $bkpConfig->isManual) || $debug) {
$bkpInfo = array();
$bkp = null;
/** @var AbstractBackup $backupHandler */
$backupHandler = null;
try {
/*
* Inicializa agendamento.
*/
BackupConfig::log(sprintf("Executando backup da configura<EFBFBD><EFBFBD>o [%s]", $arConfig['cfg_descricao']));
$configs = $bkpData['destino'];
$tipoBkp = (int) $arConfig["tp_id"];
$tpAudio = (int) BKP_TIPO_AUDIO;
$protoRede = $arConfig["prt_id"] == PROTO_REDE;
$bkpInfo = array("cfg_id" => $configId, "cfg_descricao" => $arConfig['cfg_descricao'], "size_bkp" => 0,
"tp_id" => $tipoBkp, "data" => substr($dataAtualServer, 0, 10), "hora" => $agenda,
"dir" => $arConfig['dst_diretorio']);
$backupHandler = $bkpConfig->determineHandler($configs['proto']);
/*
* A fun??o "GetConfiguracoes" alimenta a vari?vel global "$configDestino" com
* as informa??es necess?rias para se conectar ao destino do backup e que ? usada
* para inicializar o objto $bkp que cont?m os metodos para transferencia dos arqui_
* vos.
*/
$bkp = new BackupInfo($configs, $backupHandler);
if (!$bkp->connect()) {
$msg = $bkp->GetMessage();
// throw new Exception($bkp->GetLastHandlerException());
Excpt($bkp->GetLastHandlerException(), get_class($backupHandler) . "::connect()");
}
/*
* Empacota os arquivos para o bakcup.
*/
$bkpFile = GetBkpFiles($configId, $agenda, $arConfig["tp_id"], $bkpConfig);
if (is_array($bkpFile) && count($bkpFile)) {
$dirBkp = $backupHandler->Pwd(!$protoRede);
$dirAtu = $dirBkp;
if ($tipoBkp == $tpAudio) {
$dir = "bk_audio-" . substr($dataAtualServer, 0, 10);
$dirAtu = $backupHandler->Pwd() . $dir;
/*
* Se o diret?rio de ?udio n?o existe tenta cria-lo.
*/
if (!$backupHandler->Chdir($dirAtu)) {
if (!$backupHandler->Mkdir($dirAtu)) {
Excpt($bkp->GetMessage(), get_class($backupHandler) . "::Mkdir()");
}
/*
* Tenta acessar o diret?rio recem criado.
*/
if (!$backupHandler->Chdir($dirAtu)) {
Excpt($bkp->GetMessage(), get_class($backupHandler) . "::Chdir()");
}
}
}
$statusFile = array();
/*
* N<EFBFBD>o faz upload para audio quando o backup ? manual
* pelo fato dos arquivos permanecerem no diret?rio de
* origm.
*/
$somaSize = 0;
foreach ($bkpFile as $arquivo => $dadosArquivo) {
$size = filesize($dadosArquivo['file']);
$upload = $backupHandler->Upload($dadosArquivo, $arquivo);
if (!$upload) {
Excpt($bkp->GetMessage(), get_class($backupHandler) . "::Upload('" . implode("', '", array($dadosArquivo['file'], $arquivo)) . "')");
}
$statusFile[$arquivo] = array("origem" => $dadosArquivo['file'], "destino" => $dirAtu,
"log" => $upload ? "ok" : "erro", "size" => $size,
'hash' => $dadosArquivo['hash']);
$somaSize += $size;
}
/*
* Compleata informa??es para registro do backup.
*/
$bkpInfo['size_bkp'] = $somaSize;
$bkpInfo['dir'] = $dirAtu;
/*
* Registra o backup no banco de dados.
*/
RegistraBkp($conn, $bkpInfo, $statusFile);
}
unset($backupHandler);
} catch (Exception $e) {
$erroBackup = $e;
RegistraBkp($conn, $bkpInfo, null, GetErroBkp($bkp, $e->getMessage()));
$log = sprintf("Backup [%s - %s] finalizado com erro!", $configId, $arConfig['cfg_descricao']);
BackupConfig::log($log);
if (!is_null($backupHandler) && is_object($backupHandler)) {
unset($backupHandler);
}
}
}
}
} catch (Exception $e) {
$erroBackup = $e;
}
$msg = "Backup efetuado com sucesso!";
if ($bkpConfig->getCountBackups()) {
if (!is_null($erroBackup)) {
$msg = "Backup efetuado com erro: " . $erroBackup->getMessage();
}
} else {
$msg = "Backup efetuado com sucesso, por<EFBFBD>m n<EFBFBD>o existem arquivos para realizar backup.";
}
BackupConfig::log($msg);
echo $msg;
/*
* Libera a execucao do scrit.
*/
//print_r($bkpConfig);
unset($bkpConfig);