/** * [ADMIN] Backup API - obnovit zalohu (castecnou nebo jen databaze) * @param string $path cesta k souboru * @return array|bool true pri uspechu, jinak array(err_msg, fatal 1/0) */ function _backupRestore($path) { // priprava global $_lang; $fatal = false; $path = realpath($path); // proces obnovy do { /* ----- nacteni a kontroly ----- */ // kontrola souboru if (($err = _backupCheckFile($path, array(_backup_db, _backup_partial))) !== true) { break; } // nacteni souboru $kzip = new KZip($path); if (!empty($kzip->error)) { $err = str_replace('*errstr*', _htmlStr($kzip->error), $_lang['admin.other.backup.restore.upload.err.load']); break; } $type = $kzip->vars['type']; // uprava merge pole if (isset($kzip->vars['merge'])) { $kzip->vars['merge'] = array_flip($kzip->vars['merge']); } // kontrola prava pro zapis if ($type === _backup_partial) { $a_files = '/files/'; $dirs = $kzip->listFiles($a_files, true); $dirs = $dirs[0]; for ($i = 0; isset($dirs[$i]); ++$i) { if (($err = _emptyDir(realpath(dirname($_SERVER['SCRIPT_FILENAME']) . '/' . _indexroot . $dirs[$i]) . '/')) !== true) { $err = str_replace('*path*', _htmlStr($err), $_lang['admin.other.backup.restore.err.access']); break 2; } } } /* ----- provedeni ----- */ // chyby na teto urovni jsou j*z fatalni $fatal = true; // databaze $dbdump = new DBDump(); // tabulky $tbl_import = $dbdump->importTables($kzip->getFile('/database/struct')); if (!$tbl_import[0]) { $err = $tbl_import[1] . ': <code>' . _htmlStr($tbl_import[2]) . '</code>'; break; } // data $dbstream = $kzip->getFileStream('/database/data'); $data_import = $dbdump->importData($dbstream); $dbstream->free(); if (!$data_import[0]) { $err = $data_import[1]; break; } // aktualizovat hlavni URL, vynutit kontrolu instalace if (($url = _getBaseUrl()) !== false) { DB::query('UPDATE `' . _mysql_prefix . '-settings` SET `val`=' . DB::val(rtrim($url, '/')) . ' WHERE `var`=\'url\''); } DB::query('UPDATE `' . _mysql_prefix . '-settings` SET `val`=\'1\' WHERE `var`=\'installcheck\''); // deaktivovat modrewrite, pokud neexistuje .htaccess if (!file_exists(_indexroot . '.htaccess')) { DB::query('UPDATE `' . _mysql_prefix . '-settings` SET `val`=\'0\' WHERE `var`=\'modrewrite\''); } // soubory if ($type === _backup_partial) { for ($i = 0; isset($dirs[$i]); ++$i) { echo "\n\n"; $dirpath = realpath(dirname($_SERVER['SCRIPT_FILENAME']) . '/' . _indexroot . $dirs[$i]) . '/'; if (!isset($kzip->vars['merge'], $kzip->vars['merge'][$dirs[$i]])) { _emptyDir($dirpath, false); } $kzip->extractFiles($dirpath, $a_files . $dirs[$i] . '/', false, true, array($kzip->vars['void'])); } } // hotovo $kzip->free(); return true; } while (false); // chyba if (isset($kzip)) { $kzip->free(); } return array($err, $fatal); }
/** * Rekurzivne vyprazdnit adresar * @param string $dir cesta k adresari vcetne lomitka * @param bool $check_only pouze zkontrolovat pravo k zapisu 1/0 * @return bool|string true pri uspechu, jinak nazev adresare/souboru ktery vyvolal chybu */ function _emptyDir($dir, $check_only = true, $recursing = false) { // skenovat adersar $handle = opendir($dir); if (!is_resource($handle)) { return $dir; } $dirs = array(); while (false !== ($item = readdir($handle))) { // preskocit blbosti if ($item === '.' || $item === '..') { continue; } // soubor if (is_file($dir . $item)) { if ($check_only) { if (!is_writeable($dir . $item)) { return $dir . $item; } } elseif (!unlink($dir . $item)) { return $dir . $item; } continue; } // adresar $dirs[] = $dir . $item . '/'; } closedir($handle); // zpracovat podadresare for ($i = 0; isset($dirs[$i]); ++$i) { if (($s_dir = _emptyDir($dirs[$i], $check_only, true)) !== true) { return $s_dir; } } // smazani/kontrola adresare if ($recursing) { if (!$check_only && !rmdir($dir) || $check_only && !is_writeable($dir)) { return $dir; } } // vse ok return true; }