first commit
This commit is contained in:
347
admin/dbbackup.php
Normal file
347
admin/dbbackup.php
Normal file
@@ -0,0 +1,347 @@
|
||||
<?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);
|
||||
}
|
||||
Reference in New Issue
Block a user