OpenEdition / lodel

Science publishing CMS
GNU General Public License v2.0
50 stars 27 forks source link

Pb class.data.php (Sauvegarder les données) #97

Open ssonnet opened 5 years ago

ssonnet commented 5 years ago

Bonjour,

La fonction permettant de sauvegarder les données ne fonctionne pas si on coche la case "Sauvegarder seulement la base de données (pas les fichiers associés : images, documents annexes...)".

J'ai résolu le problème en modifiant la méthode backupAction() du fichier /lodel/scripts/logic/class.data.php. Ligne 292, la variable $files_and_names est indéfinie (et donc vide) si on exporte que la base : elle n'est définie plus haut (lignes 262 à 289) que pour le cas de figure où on exporte la base + les fichiers associés.

Voici la méthode modifiée :

public function backupAction(&$context, &$error)
{
    if(!C::get('adminlodel', 'lodeluser')) trigger_error("ERROR: you don't have the right to access this feature", E_USER_ERROR);

    $context['importdir'] = C::get('importdir', 'cfg');

    if (isset($context['backup'])) { // si on a demandé le backup
        set_time_limit(0);
        $site = C::get('site', 'cfg');
        $outfile = "site-$site.sql";

        $GLOBALS['tmpdir'] = $tmpdir = tmpdir(uniqid('sitebackup'));

        $errors = array();

        /* On fait le dump de la base de données */
        $this->_dump($site, $tmpdir . DIRECTORY_SEPARATOR. $outfile, $errors);

        if($errors) {
            $error = $errors;
            return 'backup';
        }

        // verifie que le fichier SQL n'est pas vide
        if (!file_exists($tmpdir. DIRECTORY_SEPARATOR . $outfile) || filesize($tmpdir. DIRECTORY_SEPARATOR . $outfile) <= 0) {
            $error['mysql'] = 'dump_failed';
            return 'backup';
        }

        // zip le site et ajoute la base
        $archivetmp = tempnam($tmpdir, 'lodeldump_'). '.zip';
        $archivefilename = "site-$site-". date("dmy"). '.zip';

//        // fichiers à exclure de l'archive
//        $GLOBALS['excludes'] = $excludes = array(
//            '#\.htaccess$#',
//            '#index.html$#',
//            '#^docannexe/image/tmpdir-.*$#',
//            '#^docannexe/tmp.*$#'
//        );
//
//        // répertoires à inclure
//        $sitedirs = array(
//            'lodel/icons',
//            'lodel/sources',
//            'docannexe/fichier',
//            'docannexe/file',
//            'docannexe/image',
//        );
//
//        // si sauvegarde des répertoires demandée (en + de la base)
//
//        $files_to_zip = array();
//
//        if (empty($context['sqlonly'])) {
//            /* On créé la liste des fichiers à sauvegarder */
//            $siteroot = realpath(SITEROOT) . DIRECTORY_SEPARATOR;
//
//            foreach($sitedirs as $sitedir)
//            {
//                $files_to_zip = array_merge(
//                    $files_to_zip,
//                    array_filter(glob_recursive( $siteroot . $sitedir . DIRECTORY_SEPARATOR . "*"), 'is_file')
//                );
//            }
//
//            /* Suppression des fichier à exclure */
//            foreach($excludes as $exclude)
//            {
//                $files_to_zip = preg_grep($exclude, $files_to_zip, PREG_GREP_INVERT);
//            }
//
//            /* On définit les chemin dans le zip et dans le filesystem */
//            $files_and_names = array(
//                $tmpdir. DIRECTORY_SEPARATOR . $outfile => $outfile,
//            );
//            foreach($files_to_zip as $file)
//            {
//                $files_and_names[$file] = str_replace($siteroot, '', $file);
//            }
//            unset($files_to_zip);
//        }

        $files_and_names = array(
            $tmpdir. DIRECTORY_SEPARATOR . $outfile => $outfile,
        );

        // si sauvegarde des répertoires demandée (en + de la base)

    if (empty($context['sqlonly'])) {

            // fichiers à exclure de l'archive
            $GLOBALS['excludes'] = $excludes = array(
                '#\.htaccess$#',
                '#index.html$#',
                '#^docannexe/image/tmpdir-.*$#',
                '#^docannexe/tmp.*$#'
            );

            // répertoires à inclure
            $sitedirs = array(
                'lodel/icons',
                'lodel/sources',
                'docannexe/fichier',
                'docannexe/file',
                'docannexe/image',
            );

            $files_to_zip = array();

            /* On créé la liste des fichiers à sauvegarder */
            $siteroot = realpath(SITEROOT) . DIRECTORY_SEPARATOR;

            foreach($sitedirs as $sitedir)
            {
                $files_to_zip = array_merge(
                    $files_to_zip,
                    array_filter(glob_recursive( $siteroot . $sitedir . DIRECTORY_SEPARATOR . "*"), 'is_file')
                );
            }

            /* Suppression des fichier à exclure */
            foreach($excludes as $exclude)
            {
                $files_to_zip = preg_grep($exclude, $files_to_zip, PREG_GREP_INVERT);
            }

            /* On définit les chemin dans le zip et dans le filesystem */
            foreach($files_to_zip as $file)
            {
                $files_and_names[$file] = str_replace($siteroot, '', $file);
            }
            unset($files_to_zip);
        }

        /* On créé le zip dans $archivetmp */
        $ok = create_zip_from_file_list($archivetmp, $files_and_names);

        @unlink($tmpdir. DIRECTORY_SEPARATOR . $outfile);
        if (!file_exists($archivetmp) || true !== $ok) {
            trigger_error("ERROR: the zip command reported an error: «{$ok}».\nArchive: $archivetmp", E_USER_ERROR);
        }

        if($error) { // Pour avoir accès aux erreurs dans les templates
            $context['error'] = $error;
        }

        if (operation($context['operation'], $archivetmp, $archivefilename, $context)) {
            $context['success'] = 1;
            return 'backup';
        }
        else {
            $context['success'] = 1;
            return 'backup';
        }

        return 'backup';
    }
    else {
        return 'backup';
    }
}

Est-il possible de corriger le code sur la branche master ?

Cordialement.