dans ce cas on verifie si le dump est lisible et dans une version connu * -> on affiche un message qui va bien * -> on passe la main a inc/admin qui va verifier les droits a executer * base/import_all (fichier ftp ou webmestres) et lancer ce dernier * * Lorsqu'un timeout se produit, on rerentre par ici : * -> on lit la meta import_all pour voir si on est bien en cours de restauration * -> dans ce cas on passe la main a inc/admin qui verifie les droits et relance * base/import_all * */ // Restauration d'une base. Comme ca peut etre interrompu pour cause // de Timeout, un javascript relance automatiquement (cf inc/import.php) // Comme il peut relancer une action qui vient de se terminer, // il faut ignorer son appel si la meta indiquant l'action en cours // est absente. // http://doc.spip.org/@exec_import_all_dist function exec_import_all_dist() { // permettre l'appel en GET if (!$_POST) $_POST = $_GET; $archive=_request('archive'); if (!strlen($archive)) { $_POST['archive'] = $archive = _request('archive_perso'); } exec_import_all_args($archive); } function exec_import_all_args($archive) { if ($archive) { // On arrive ici en debut d'operation // Est-ce une fusion ou un ecrasement ? $insert = _request('insertion'); if (!$insert AND !autoriser('detruire')) export_all_abort(); $dir = import_queldir(); $_POST['dir'] = $dir; // voir si un message d'avertissement est necessaire $commentaire = verifier_sauvegarde($dir . $archive); } else { // sinon, si on a bien la meta qui donne l'etat d'avancement // on est en cours d'operation // Tester si l'archive est toujous la: // ca sert pour forcer a sortir d'une restauration inachevee if (!isset($GLOBALS['meta']['import_all']) OR (!$request = @unserialize($GLOBALS['meta']['import_all'])) OR (!is_readable($request['dir'] . $request['archive']))) { // on ne sait pas quoi importer, il faut sortir de la export_all_abort(); } $archive = $request['archive']; $insert = $request['insertion']; $commentaire = ''; } $action = _T($insert ? 'info_restauration_sauvegarde_insert' : 'info_restauration_sauvegarde', array('archive' => $archive)); $admin = charger_fonction('admin', 'inc'); echo $admin('import_all', $action, $commentaire, !$insert); } function export_all_abort() { // evacuer la fausse erreur du cas du validateur en boucle. if (_request('exec') == 'valider_xml') return; include_spip('base/import_all'); import_all_fin(array()); include_spip('inc/import'); detruit_restaurateur(); effacer_meta('admin'); // et verifier la session include_spip('inc/auth'); $login = auth_retrouver_login($GLOBALS['visiteur_session']['login']); $id_auteur = sql_getfetsel('id_auteur', 'spip_auteurs', 'login=' . sql_quote($login)); if ($GLOBALS['visiteur_session']['id_auteur'] != $id_auteur) auth_deloger(); else redirige_url_ecrire(); } // http://doc.spip.org/@import_queldir function import_queldir() { global $connect_toutes_rubriques, $connect_login; if ($connect_toutes_rubriques) { $repertoire = _DIR_DUMP; if(!@file_exists($repertoire)) { $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } return $repertoire; } else { $repertoire = _DIR_TRANSFERT; if(!@file_exists($repertoire)) { $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } return sous_repertoire($repertoire, $connect_login); } } /** * Verifier que le dump qu'on essaye d'importer est bien compatible avec la * version en cours, ou alerter des risques et perils * * @global string $spip_version_base * @param string $archive * @return string * message d'avertissement ou d'erreur si necessaire */ function verifier_sauvegarde ($archive) { global $spip_version_base; $g = preg_match(",\.gz$,", $archive); $_fopen = $g ? 'gzopen' : 'fopen'; $_fread = $g ? 'gzread' : 'fread'; $buf_len = 1024; // la version doit etre dans le premier ko if (!(@file_exists($archive) AND $f = $_fopen($archive, "rb"))) return _T('avis_probleme_archive', array('archive' => $archive)); $buf = $_fread($f, $buf_len); if (preg_match('/]*version_base="([0-9.]+)"[^>]*version_archive="([^"]+)"/', $buf, $regs) AND version_compare($regs[1], "1.813", ">=") AND import_charge_version($regs[2]) ) return ''; // c'est bon $r = $regs[1] . ' ' . $regs[2]; return _T('avis_erreur_version_archive', array('archive' => str_replace('/', ' / ', $archive) . " ($r)", 'spipnet' => $GLOBALS['home_server'] . '/' . $GLOBALS['spip_lang'] . '_article1489.html' )); } /** * Verifier qu'on a bien le script qui sait lire la version d'archive * * @param string $version_archive * @return string */ function import_charge_version($version_archive) { // si c'est une archive xml par phpmyadmin, on sait la lire avec le script import_1_3 if (preg_match("{^phpmyadmin::}is",$version_archive)){ $fimport = 'import_1_3'; } else $fimport = 'import_' . str_replace('.','_',$version_archive); return charger_fonction($fimport, 'inc', true); } ?>