348 lines
9.6 KiB
PHP
348 lines
9.6 KiB
PHP
<?php
|
|
|
|
ini_set('memory_limit', '5G');
|
|
|
|
global $cfg;
|
|
|
|
if (!findRight('OTH_BACKUP_ADD') && !findRight('OTH_BACKUP_EDIT') && !findRight('OTH_BACKUP_ERASE')) {
|
|
redirect('launch.php?s=error.php&id=1');
|
|
}
|
|
|
|
$acn = getVal('acn');
|
|
$dbBackup = getVal('dbBackup');
|
|
|
|
if (empty($acn)) {
|
|
$acn = 'show';
|
|
}
|
|
|
|
set_time_limit(6000);
|
|
ignore_user_abort(true);
|
|
|
|
if ($acn == 'do' && !empty($dbBackup)) {
|
|
$do = getVal('do');
|
|
|
|
if ($do == 'erase') {
|
|
if (!findRight('OTH_BACKUP_ERASE')) {
|
|
redirect('launch.php?s=error.php&id=1');
|
|
}
|
|
|
|
// funkce na ukladani zalohy do souboru
|
|
function eraseBackup($filename, &$ErrStr)
|
|
{
|
|
global $cfg;
|
|
|
|
if (@unlink($cfg['Path']['db_backup'].$filename)) {
|
|
$ErrStr = 'Záloha databáze byla odstraněna.';
|
|
|
|
return true;
|
|
} else {
|
|
$ErrStr = 'Stala se chyba při odstraňování databáze - nepodařilo se smazat soubor.';
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (file_exists($cfg['Path']['db_backup'].$dbBackup)) {
|
|
// pokusit se poprve smazat DB zalohu
|
|
if (!eraseBackup($dbBackup, $ErrStr)) {
|
|
// snazi se napravit chybu
|
|
@chmod($cfg['Path']['db_backup'], octdec(777));
|
|
// snazi se napravit chybu
|
|
@chmod($cfg['Path']['db_backup'].$dbBackup, octdec(777));
|
|
|
|
if (!eraseBackup($dbBackup, $ErrStr)) {
|
|
// zalogovat chybu
|
|
logError(__FILE__, __LINE__, 'Chyba odstraneni zalohy databaze: '.$cfg['Path']['db_backup'].$dbBackup);
|
|
}
|
|
} else {
|
|
writeDownActivity('záloha DB - příkaz smazat zálohu '.$dbBackup);
|
|
}
|
|
} else {
|
|
$ErrStr = 'Požadovaný soubor se zálohou databáze nebyl nalezen.';
|
|
}
|
|
|
|
redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr));
|
|
} elseif ($do == 'restore') {
|
|
if (!findRight('OTH_BACKUP_REFRESH') || isLive()) {
|
|
redirect('launch.php?s=error.php&id=1');
|
|
}
|
|
|
|
set_time_limit(0);
|
|
ob_implicit_flush(1);
|
|
while (ob_get_level()) {
|
|
ob_end_clean();
|
|
}
|
|
echo 'Obnovuji zálohu databáze...';
|
|
|
|
$crlf = "\r\n";
|
|
$lines = iterateBzipLines($cfg['Path']['db_backup'].$dbBackup);
|
|
|
|
$sql = [];
|
|
$next = true;
|
|
$count = 0;
|
|
foreach ($lines as $line) {
|
|
$count++;
|
|
if ($count >= 1000) {
|
|
$count = 0;
|
|
echo '.';
|
|
}
|
|
$wrow = trim($line);
|
|
if (substr($wrow, 0, 1) == '#') {
|
|
$wrow = $line = '';
|
|
}
|
|
if (substr($wrow, 0, 2) == '--') {
|
|
$wrow = $line = '';
|
|
}
|
|
|
|
if ($next) {
|
|
$sql[] = $line;
|
|
} else {
|
|
$sql[count($sql) - 1] .= $line;
|
|
}
|
|
if (substr($wrow, -1) == ';') {
|
|
$next = true;
|
|
} else {
|
|
$next = false;
|
|
}
|
|
}
|
|
|
|
// delete all tables
|
|
$tables = sqlQuery('SHOW TABLES')->fetchAll();
|
|
if ($tables) {
|
|
$tables = array_map(function ($value) {
|
|
return reset($value);
|
|
}, $tables);
|
|
sqlQuery('SET FOREIGN_KEY_CHECKS=0;');
|
|
foreach ($tables as $table) {
|
|
sqlQuery("DROP TABLE `{$table}`");
|
|
}
|
|
sqlQuery('SET FOREIGN_KEY_CHECKS=1;');
|
|
}
|
|
|
|
$errNo = 0;
|
|
$errStr = '';
|
|
foreach ($sql as $query) {
|
|
$count++;
|
|
if ($count >= 1000) {
|
|
$count = 0;
|
|
echo '.';
|
|
}
|
|
$query = trim($query);
|
|
if ($query) {
|
|
$SQL = sqlQuery($query);
|
|
|
|
if (!$SQL) {
|
|
$errNo++;
|
|
$errStr .= $query;
|
|
} else {
|
|
$SQL->free();
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($errNo == 0) {
|
|
$ErrStr = 'Databáze byla obnovena ze zálohy.';
|
|
} else {
|
|
// zalogovat chybu
|
|
logError(__FILE__,
|
|
__LINE__,
|
|
'Chyba obnovy zalohy databaze: '.
|
|
$cfg['Path']['db_backup'].$dbBackup."\r\nchybných SQL příkazů: ".$errNo);
|
|
|
|
$ErrStr = 'Vyskytly se chyby při ukládání. Celkem chybných SQL příkazů: '.$errNo;
|
|
}
|
|
|
|
writeDownActivity('záloha DB - příkaz obnovit zálohu '.$dbBackup);
|
|
|
|
redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr));
|
|
} elseif ($do = 'rename') {
|
|
$newName = getVal('new_name');
|
|
if ($newName) {
|
|
$newName = createScriptURL_Text($newName);
|
|
|
|
preg_match('/.sql(.bz2)?/i', $dbBackup, $matches);
|
|
$ext = $matches[0];
|
|
|
|
rename($cfg['Path']['db_backup'].$dbBackup,
|
|
$cfg['Path']['db_backup'].$newName.$ext);
|
|
|
|
$ErrStr = 'Záloha byla přejmenována';
|
|
redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr));
|
|
}
|
|
}
|
|
}
|
|
|
|
// funkce na ukladani zalohy do souboru
|
|
function saveBackup($filename, &$ErrStr)
|
|
{
|
|
global $cfg;
|
|
$fp = bzopen($cfg['Path']['db_backup'].$filename, 'w');
|
|
if ($fp) {
|
|
return $fp;
|
|
} else {
|
|
$ErrStr = 'Chyba při ukládání do souboru.';
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
if ($acn == 'add') {
|
|
if (!findRight('OTH_BACKUP_ADD')) {
|
|
redirect('launch.php?s=error.php&id=1');
|
|
}
|
|
|
|
ini_set('display_errors', '1');
|
|
|
|
$filename = getVal('name');
|
|
if (!$filename) {
|
|
if (empty($return)) {
|
|
$filename = 'db'.date('Y-m-d_H-i-s').'.sql.bz2';
|
|
} elseif ($return == 'logout') {
|
|
$filename = 'logout_backup.sql.bz2';
|
|
}
|
|
} else {
|
|
$filename = createScriptURL_Text($filename).'.sql.bz2';
|
|
}
|
|
|
|
// pokusit se poprve ulozit DB zalohu
|
|
$ErrStr = null;
|
|
$fp = saveBackup($filename, $ErrStr);
|
|
if (!$fp) {
|
|
// snazi se napravit chybu
|
|
@chmod($cfg['Path']['db_backup'], octdec(777));
|
|
// snazi se napravit chybu
|
|
@chmod($cfg['Path']['db_backup'].$dbBackup, octdec(777));
|
|
|
|
$fp = saveBackup($filename, $ErrStr);
|
|
if (!$fp) {
|
|
// zalogovat chybu
|
|
logError(__FILE__, __LINE__, 'Chyba ukladani zalohy databaze: '.$cfg['Path']['db_backup'].$filename);
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$params = [
|
|
'compress' => Ifsnop\Mysqldump\Mysqldump::BZIP2,
|
|
'add-drop-table' => true,
|
|
'single-transaction' => true,
|
|
'disable-foreign-keys-check' => true,
|
|
'add-locks' => false,
|
|
'lock-tables' => false,
|
|
'skip-triggers' => true,
|
|
];
|
|
|
|
$dump = new Ifsnop\Mysqldump\Mysqldump(
|
|
"mysql:host={$cfg['Connection']['host']};dbname={$cfg['Connection']['database']}",
|
|
$cfg['Connection']['user'],
|
|
$cfg['Connection']['password'],
|
|
$params
|
|
);
|
|
|
|
try {
|
|
// Prepare blank backup file
|
|
$filename = realpath($cfg['Path']['db_backup']).'/'.$filename;
|
|
unlink($filename);
|
|
|
|
// prepare for streaming
|
|
set_time_limit(0);
|
|
ob_implicit_flush(1);
|
|
while (ob_get_level()) {
|
|
ob_end_clean();
|
|
}
|
|
$dump->setInfoHook(function ($type, $data) {
|
|
if (isSuperuser()) {
|
|
echo "<br>{$data['name']}: {$data['rowCount']}";
|
|
} else {
|
|
echo '.';
|
|
}
|
|
});
|
|
echo 'Vytvářím zálohu...';
|
|
|
|
$dump->start($filename);
|
|
|
|
$ErrStr .= 'Databáze byla v pořádku uložena.';
|
|
} catch (Exception $e) {
|
|
$ErrStr .= 'Chyba při ukládání do souboru: '.$e->getMessage();
|
|
}
|
|
|
|
if (empty($return)) {
|
|
redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr));
|
|
} elseif ($return == 'logout') {
|
|
redirect('launch.php?s=logout.php');
|
|
}
|
|
}
|
|
|
|
// download db backup
|
|
if ($acn == 'download') {
|
|
$filename = getVal('file');
|
|
if ($filename) {
|
|
downloadBackup($filename);
|
|
}
|
|
}
|
|
|
|
// upload db backup for wpjadmin
|
|
if ($acn == 'upload' && isSuperuser()) {
|
|
$file = $_FILES['upload_db'];
|
|
if ($file) {
|
|
if ($file['type'] == 'application/x-bzip' || pathinfo($file['name'], PATHINFO_EXTENSION) == 'bz2') {
|
|
uploadBackup($file);
|
|
} else {
|
|
$ErrStr = "Nepodporovaný formát {$file['type']}!";
|
|
redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr));
|
|
}
|
|
}
|
|
}
|
|
|
|
function uploadBackup($file)
|
|
{
|
|
$cfg = \KupShop\KupShopBundle\Config::get();
|
|
|
|
$targetLocation = $cfg['Path']['db_backup'].$file['name'];
|
|
if (move_uploaded_file($file['tmp_name'], $targetLocation)) {
|
|
$ErrStr = 'Záloha databáze byla nahrána';
|
|
redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr));
|
|
}
|
|
}
|
|
|
|
function downloadBackup($filename)
|
|
{
|
|
$cfg = \KupShop\KupShopBundle\Config::get();
|
|
|
|
$file = $cfg['Path']['db_backup'].$filename;
|
|
|
|
header('Content-Description: File Transfer');
|
|
header('Content-Type: application/x-bzip');
|
|
header('Content-Disposition: attachment; filename='.basename($file).'');
|
|
|
|
readfile($file);
|
|
exit;
|
|
}
|
|
|
|
function iterateBzipLines($file)
|
|
{
|
|
$fp = bzopen($file, 'r');
|
|
|
|
$data = '';
|
|
while (!feof($fp)) {
|
|
$data .= bzread($fp, 4096);
|
|
|
|
$row = preg_split("/(\r\n|\n)/", $data);
|
|
|
|
$lines = count($row);
|
|
|
|
foreach ($row as $index => $line) {
|
|
// Detect last row
|
|
if ($index == $lines - 1) {
|
|
$data = $line;
|
|
break;
|
|
}
|
|
yield $line;
|
|
}
|
|
}
|
|
|
|
yield $data;
|
|
|
|
bzclose($fp);
|
|
}
|