first commit

This commit is contained in:
2025-08-02 16:30:27 +02:00
commit 23646bfcee
14851 changed files with 1750626 additions and 0 deletions

347
admin/dbbackup.php Normal file
View 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);
}