X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Fexec%2Fimport_all.php;fp=www%2Fecrire%2Fexec%2Fimport_all.php;h=b41c264145529277a0c8523275f74c8011b02330;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/ecrire/exec/import_all.php b/www/ecrire/exec/import_all.php new file mode 100644 index 0000000..b41c264 --- /dev/null +++ b/www/ecrire/exec/import_all.php @@ -0,0 +1,172 @@ + 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() +{ + $archive=_request('archive'); + if (!strlen($archive)) { + $_POST['archive'] = $archive = _request('archive_perso'); + } + + // si on arrive ici en debut d'operation + if ($archive) { + $dir = import_queldir(); + $_POST['dir'] = $dir; + // voir si un message d'avertissement est necessaire + $commentaire = verifier_sauvegarde($dir . $archive); + + // est-ce une fusion de base au lieu d'un ecrasement ? + $insert = _request('insertion'); + } + // sinon, si on a bien la meta qui donne l'etat d'avancement + // on est en cours d'operation + elseif (isset($GLOBALS['meta']['import_all'])) { + $request = @unserialize($GLOBALS['meta']['import_all']); + // Tester si l'archive est toujous la: + // ca sert pour forcer a sortir d'une restauration inachevee + if (is_readable($request['dir'] . $request['archive'])) { + $archive = $request['archive']; + $insert = $request['insertion']; + $commentaire = ''; + } + } + + if ($archive) { + // il faut changer cette chaine depuis qu'on fait aussi de la fusion + // _T('info_restauration_sauvegarde', + $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); + } + // on ne sait pas quoi importer, il faut sortir de la + // sauf s'il s'agit du validateur (a ameliorer) + elseif (_request('exec') <> 'valider_xml') { + 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'); + if (!$auteur = auth_retrouver_login($GLOBALS['visiteur_session']['login']) + OR $auteur['id_auteur']!=$GLOBALS['visiteur_session']['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); +} +?>