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