Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ssonnet opened this issue Jan 16, 2019 · 0 comments
Open

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

ssonnet opened this issue Jan 16, 2019 · 0 comments

Comments

@ssonnet
Copy link

ssonnet commented Jan 16, 2019

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant