/**
 * [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);
}
Example #2
0
/**
 * 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;
}