|
|
|
|
#!/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);
|