From f68f362757f8dc6e486cf18a35697c34acf1b6b4 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Sun, 26 Nov 2006 15:24:55 +0000 Subject: [PATCH] Permettre au script de fusion de site de reprendre sur interruption. --- ecrire/exec/import_all.php | 100 ++++++++------------------- ecrire/inc/admin.php | 1 - ecrire/inc/import.php | 136 +++++++++++++++++-------------------- ecrire/inc/import_1_3.php | 18 ++--- 4 files changed, 95 insertions(+), 160 deletions(-) diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php index 9ea881f50d..d3bfe0a869 100644 --- a/ecrire/exec/import_all.php +++ b/ecrire/exec/import_all.php @@ -38,34 +38,16 @@ if ($f = include_spip('mes_fonctions', false)) { } // http://doc.spip.org/@verifier_version_sauvegarde -function verifier_version_sauvegarde ($archive) { +function verifier_sauvegarde ($archive, $dir) { global $spip_version; - global $flag_gz, $connect_toutes_rubriques; - if ($connect_toutes_rubriques) { - $repertoire = _DIR_DUMP; - if(!@file_exists($repertoire)) { - $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); - $repertoire = sous_repertoire(_DIR_TMP, $repertoire); - } - $dir = $repertoire; - } else { - $repertoire = _DIR_TRANSFERT; - if(!@file_exists($repertoire)) { - $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); - $repertoire = sous_repertoire(_DIR_TMP, $repertoire); - } - if(!@file_exists($repertoire.$connect_login)) { - $sous_rep = sous_repertoire($repertoire, $connect_login); - } - $dir = $sous_rep . '/'; - } - $_fopen = ($flag_gz) ? gzopen : fopen; - $_fread = ($flag_gz) ? gzread : fread; + $g = ereg("\.gz$", $archive); + $_fopen = ($g) ? gzopen : fopen; + $_fread = ($g) ? gzread : fread; $buf_len = 1024; // la version doit etre dans le premier ko + $g = $dir . $archive; - if (@file_exists($f = $dir . $archive)) { - $f = $_fopen($f, "rb"); + if (@file_exists($g) AND $f = $_fopen($g, "rb")) { $buf = $_fread($f, $buf_len); if (ereg('<SPIP [^>]* version_base="([0-9.]+)".*version_archive="([^"]+)"', $buf, $regs) @@ -75,7 +57,7 @@ function verifier_version_sauvegarde ($archive) { else return _T('avis_erreur_version_archive', array('archive' => $archive)); } else - return _T('avis_probleme_archive', array('archive' => $archive)); + return _T('avis_probleme_archive', array('archive' => $g)); } @@ -93,16 +75,17 @@ function import_charge_version($version_archive) // http://doc.spip.org/@exec_import_all_dist function exec_import_all_dist() { + $dir = import_queldir(); + // si l'appel est explicite, // passer par l'authentification ftp et attendre d'etre rappele if (!$GLOBALS['meta']["debut_restauration"]) { - // cas de l'appel apres demande de confirmation $archive=_request('archive'); $insertion=_request('insertion'); if (!strlen($archive)) $archive=_request('archive_perso'); if ($archive) { $action = _T('info_restauration_sauvegarde', array('archive' => $archive)); - $commentaire = verifier_version_sauvegarde ($archive); + $commentaire = verifier_sauvegarde($archive, $dir); } // au tout premier appel, on ne revient pas de debut_admin @@ -112,16 +95,9 @@ function exec_import_all_dist() // si on est revenu c'est que l'authentification ftp est ok // sinon il reste le meta request_restau; a ameliorer. fin_admin($action); - // dire qu'on commence - ecrire_meta("request_restauration", serialize($_REQUEST)); - ecrire_meta("debut_restauration", "debut"); - ecrire_meta("status_restauration", "0"); - ecrire_metas(); - // se rappeler pour montrer illico ce qu'on fait - header('Location: ./'); - exit(); - } - + import_all_debut($_REQUEST); + $request = $_REQUEST; + } else $request = unserialize($GLOBALS['meta']['request_restauration']); // au rappel, on commence (voire on continue) @ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure // utiliser une version fraiche des metas (ie pas le cache) @@ -136,55 +112,35 @@ function exec_import_all_dist() debut_gauche(); debut_droite(); - $request = unserialize($GLOBALS['meta']['request_restauration']); - spip_log("import_all " . $GLOBALS['meta']['request_restauration']); - $dir = import_queldir(); - $r = import_tables($request, $dir); + + // precaution inutile I think (esj) + list($my_date) = spip_fetch_array(spip_query("SELECT UNIX_TIMESTAMP(maj) AS d FROM spip_meta WHERE nom='debut_restauration'"), SPIP_NUM); - if ($r) { - spip_log("Erreur: $r"); - } - else { - if ($request['insertion']== 'on') { - $request['insertion'] = 'passe2'; - ecrire_meta("request_restauration", serialize($request)); - ecrire_meta("debut_restauration", "debut"); - ecrire_meta("status_restauration", "0"); - ecrire_metas(); - spip_log("import_all passe 2"); - $trans = translate_init($request); - $r = import_tables($request, $dir, $trans); - if ($r) spip_log("Erreur: $r"); - spip_query("DROP TABLE spip_translate"); - } - ecrire_acces(); // Mise a jour du fichier htpasswd - detruit_restaurateur(); - if ($charset = $GLOBALS['meta']['charset_restauration']) { - ecrire_meta('charset', $charset); - ecrire_metas(); - } - import_fin(); - include_spip('inc/rubriques'); - calculer_rubriques(); - } - echo "</body></html>\n"; + if ($my_date) echo import_tables($request, $dir); + + import_all_fin(); +} + +function import_all_debut($request) { + ecrire_meta("request_restauration", serialize($request)); + ecrire_meta("debut_restauration", "debut"); + ecrire_meta("status_restauration", "0"); + ecrire_metas(); } -// http://doc.spip.org/@import_fin -function import_fin() { +function import_all_fin() { effacer_meta("charset_restauration"); effacer_meta("status_restauration"); effacer_meta("debut_restauration"); effacer_meta("date_optimisation"); effacer_meta('request_restauration'); - effacer_meta('fichier_restauration'); effacer_meta('version_archive_restauration'); effacer_meta('tag_archive_restauration'); ecrire_metas(); } -// http://doc.spip.org/@import_queldir +// http://doc.spip.org/@import_all_continue function import_queldir() { global $connect_toutes_rubriques; diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php index 67afdb4a40..9119ffe396 100644 --- a/ecrire/inc/admin.php +++ b/ecrire/inc/admin.php @@ -33,7 +33,6 @@ function debut_admin($script, $action, $commentaire='') { } $signal = fichier_admin($action); - spip_log("debut_admin $signal"); if (@file_exists($dir . $signal)) { spip_log ("Action admin: $action"); return true; diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php index e073ac5a00..9b8f1734a9 100644 --- a/ecrire/inc/import.php +++ b/ecrire/inc/import.php @@ -102,16 +102,11 @@ function import_debut($f, $gz=false) { } $b = ""; } - return false; + // improbable: fichier correct avant le debut_admin et plus apres + import_all_fin(); + die(_T('info_erreur_restauration')); } -// -// $f = handle fichier -// $gz = flag utilisation zlib -// -// importe un objet depuis le fichier, retourne true si ok, false si erreur ou fin de fichier -// - // on conserve ce tableau pour faire des translations // de table eventuelles $tables_trans = array( @@ -155,91 +150,66 @@ function detruit_restaurateur() // http://doc.spip.org/@import_tables function import_tables($request, $dir, $trans=array()) { - global $import_ok, $abs_pos, $my_pos; - global $affiche_progression_pourcent; + global $import_ok, $abs_pos, $affiche_progression_pourcent; static $time_javascript; - $my_pos = $GLOBALS['meta']["status_restauration"]; - $archive = $dir . ($request['archive'] ? $request['archive'] : $request['archive_perso']); - $size = @filesize($archive); - - // attention : si $request['archive']=="", alors archive='data/' - // le test is_readable n'est donc pas suffisant - if (!@is_readable($archive)||is_dir($archive) || !$size) { - $texte_boite = _T('info_erreur_restauration'); - echo debut_boite_alerte(); - echo "<font face='Verdana,Arial,Sans,sans-serif' size='4' color='black'><b>$texte_boite</b></font>"; - echo fin_boite_alerte(); -// renvoyer True pour effacer les meta sans refaire calculer_rubriques: -// la restauration n'a pas encore commence, on peut eviter de tout casser - return $texte_boite; - } - - if (ereg("\.gz$", $archive)) { - $size = false; - $taille = taille_en_octets($my_pos); - $_fopen = 'gzopen'; - $gz = true; - } else { - $taille = floor(100 * $my_pos / $size)." %"; - $_fopen = 'fopen'; - $gz = false; - } - - import_affiche_javascript($taille); - - if ($GLOBALS['flag_ob_flush']) ob_flush(); - flush(); - - list($my_date) = spip_fetch_array(spip_query("SELECT UNIX_TIMESTAMP(maj) AS d FROM spip_meta WHERE nom='debut_restauration'"), SPIP_NUM); + $my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 : + $GLOBALS['meta']["status_restauration"]; - if (!$my_date) return false; + // au premier appel destruction des tables a restaurer + // ou initialisation de la table des translations, + // mais pas lors d'une reprise. if ($request['insertion']=='on') { - $request['init'] = 'insere_1_init'; - $request['boucle'] = 'import_insere'; + $request['init'] = (!$my_pos) ? 'insere_1_init' : 'insere_2_init'; $request['boucle'] = 'import_insere'; } elseif ($request['insertion']=='passe2') { $request['init'] = 'insere_2_init'; $request['boucle'] = 'import_translate'; } else { - $request['init'] = 'import_init'; + $request['init'] = (!$my_pos) ? 'import_init_tables' : 'import_table_choix'; $request['boucle'] = 'import_replace'; } - $f = $_fopen($archive, "rb"); - $my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 : - $GLOBALS['meta']["status_restauration"]; + $archive = $dir . ($request['archive'] ? $request['archive'] : $request['archive_perso']); + + if (ereg("\.gz$", $archive)) { + $size = false; + $taille = taille_en_octets($my_pos); + $file = gzopen($archive, 'rb'); + $gz = true; + } else { + $size = @filesize($archive); + $taille = floor(100 * $my_pos / $size)." %"; + $file = fopen($archive, 'rb'); + $gz = false; + } if ($my_pos==0) { -// par defaut pour les anciens sites -// il est contenu dans le xml d'import et sera reecrit dans import_debut +// Pour les anciennes archives, indiquer le charset par defaut: ecrire_meta('charset_restauration', 'iso-8859-1'); - if ($r = import_debut($f, $gz)) { -// tag ouvrant : -// 'SPIP' pour un dump xml spip, nom de la base source pour un dump phpmyadmin - $tag_archive = $r[0]; - $version_archive = $r[1]['version_archive']; - } +// les + recentes l'ont en debut de fichier et import_debut fera ecrire_meta + list($tag, $r) = import_debut($file, $gz); +// tag ouvrant du Dump: +// 'SPIP' si fait par spip, nom de la base source si fait par phpmyadmin + $version_archive = $r['version_archive']; ecrire_meta('version_archive_restauration', $version_archive); - ecrire_meta('tag_archive_restauration', $tag_archive); + ecrire_meta('tag_archive_restauration', $tag); ecrire_metas(); } else { // Reprise de l'importation $_fseek = ($gz) ? gzseek : fseek; - $_fseek($f, $my_pos); + $_fseek($file, $my_pos); $version_archive = $GLOBALS['meta']['version_archive_restauration']; - $tag_archive = $GLOBALS['meta']['tag_archive_restauration']; - // a completer pour les insertions - $request['init'] = 'import_table_choix'; } $fimport = import_charge_version($version_archive); - // Normalement c'est controle par import_all auparavant - // c'est pour se proteger des reprises avortees - if (!$fimport) return _T('avis_archive_incorrect'); + import_affiche_javascript($taille); + + if ($GLOBALS['flag_ob_flush']) ob_flush(); + flush(); - while ($table = $fimport($f, $request, $gz, $trans)) { + while ($table = $fimport($file, $request, $gz, $trans)) { // Pas d'ecriture SQL car sinon le temps double. // Il faut juste faire attention a bien lire_metas() // au debut de la restauration @@ -249,18 +219,36 @@ function import_tables($request, $dir, $trans=array()) { affiche_progression_javascript($abs_pos,$size,$table); $time_javascript = time(); } - - $my_pos = true; } - if (!$import_ok) return _T('avis_archive_invalide'); + if (!$import_ok) + $res = _T('avis_archive_invalide'); + else { + + affiche_progression_javascript('100 %', $size); - affiche_progression_javascript('100 %', $size); + if ($request['insertion'] == 'on') { - return false; + $request['insertion'] = 'passe2'; + import_all_debut($request); + $trans = translate_init($request); + spip_log("import_all passe 2"); + import_tables($request, $dir, $trans); + spip_query("DROP TABLE spip_translate"); + } + detruit_restaurateur(); + ecrire_acces(); // Mise a jour du fichier htpasswd + if ($charset = $GLOBALS['meta']['charset_restauration']) { + ecrire_meta('charset', $charset); + ecrire_metas(); + } + include_spip('inc/rubriques'); + calculer_rubriques(); + $res = ''; + } + return $res . "</body></html>\n";; } -// http://doc.spip.org/@import_affiche_javascript function import_affiche_javascript($taille) { $max_time = ini_get('max_execution_time')*1000; @@ -373,6 +361,4 @@ function import_table_choix() } return $tables_for_dump; } - - ?> diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php index d9c5c3fb2c..aa71bd4afa 100644 --- a/ecrire/inc/import_1_3.php +++ b/ecrire/inc/import_1_3.php @@ -36,15 +36,9 @@ function description_table($nom){ return array($nom,array()); } -// http://doc.spip.org/@import_init -function import_init($request, $my_pos) { - - // au premier appel destruction des tables a restaurer - return (!$my_pos) ? import_init_tables() : import_table_choix(); -} // http://doc.spip.org/@insere_2_init -function insere_2_init($request, $my_pos) { +function insere_2_init($request) { // l'insertion ne porte que sur les tables principales $t = array_keys($GLOBALS['tables_principales']); @@ -57,7 +51,7 @@ function insere_2_init($request, $my_pos) { } // http://doc.spip.org/@insere_1_init -function insere_1_init($request, $my_pos) { +function insere_1_init($request) { // preparation de la table des translations $spip_translate = array( @@ -73,11 +67,11 @@ function insere_1_init($request, $my_pos) { spip_create_table('spip_translate', $spip_translate, $spip_translate_key, true); // au cas ou la derniere fois ce serait terminee anormalement spip_query("DELETE FROM spip_translate"); - return insere_2_init($request, $my_pos); + return insere_2_init($request); } // http://doc.spip.org/@translate_init -function translate_init($request, $my_pos=0) { +function translate_init($request) { /* construire le tableau PHP de la table spip_translate (on l'a mis en table pour pouvoir reprendre apres interruption @@ -93,7 +87,7 @@ function translate_init($request, $my_pos=0) { // http://doc.spip.org/@inc_import_1_3_dist function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { - global $import_ok, $abs_pos, $my_pos, $tables_trans; + global $import_ok, $abs_pos, $tables_trans; static $tables = ''; static $phpmyadmin, $fin; static $field_desc = array (); @@ -103,7 +97,7 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) { if (!$tables OR $trans) { $init = $request['init']; - $tables = $init($request, $my_pos); + $tables = $init($request); $phpmyadmin = preg_match("{^phpmyadmin::}is", $GLOBALS['meta']['version_archive_restauration']) ? array(array('"','>'),array('"','>')) -- GitLab