3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2011 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
15 include_spip('inc/headers');
18 * On arrive ici le premier coup depuis admin_tech
19 * -> dans ce cas on verifie si le dump est lisible et dans une version connu
20 * -> on affiche un message qui va bien
21 * -> on passe la main a inc/admin qui va verifier les droits a executer
22 * base/import_all (fichier ftp ou webmestres) et lancer ce dernier
24 * Lorsqu'un timeout se produit, on rerentre par ici :
25 * -> on lit la meta import_all pour voir si on est bien en cours de restauration
26 * -> dans ce cas on passe la main a inc/admin qui verifie les droits et relance
32 // Restauration d'une base. Comme ca peut etre interrompu pour cause
33 // de Timeout, un javascript relance automatiquement (cf inc/import.php)
34 // Comme il peut relancer une action qui vient de se terminer,
35 // il faut ignorer son appel si la meta indiquant l'action en cours
38 // http://doc.spip.org/@exec_import_all_dist
39 function exec_import_all_dist()
41 $archive=_request('archive');
42 if (!strlen($archive)) {
43 $_POST['archive'] = $archive = _request('archive_perso');
46 // si on arrive ici en debut d'operation
48 $dir = import_queldir();
50 // voir si un message d'avertissement est necessaire
51 $commentaire = verifier_sauvegarde($dir . $archive);
53 // est-ce une fusion de base au lieu d'un ecrasement ?
54 $insert = _request('insertion');
56 // sinon, si on a bien la meta qui donne l'etat d'avancement
57 // on est en cours d'operation
58 elseif (isset($GLOBALS['meta']['import_all'])) {
59 $request = @unserialize
($GLOBALS['meta']['import_all']);
60 // Tester si l'archive est toujous la:
61 // ca sert pour forcer a sortir d'une restauration inachevee
62 if (is_readable($request['dir'] . $request['archive'])) {
63 $archive = $request['archive'];
64 $insert = $request['insertion'];
70 // il faut changer cette chaine depuis qu'on fait aussi de la fusion
71 // _T('info_restauration_sauvegarde',
73 ?
'info_restauration_sauvegarde_insert'
74 : 'info_restauration_sauvegarde',
75 array('archive' => $archive));
76 $admin = charger_fonction('admin', 'inc');
77 echo $admin('import_all', $action, $commentaire, !$insert);
79 // on ne sait pas quoi importer, il faut sortir de la
80 // sauf s'il s'agit du validateur (a ameliorer)
81 elseif (_request('exec') <> 'valider_xml') {
82 include_spip('base/import_all');
83 import_all_fin(array());
84 include_spip('inc/import');
85 detruit_restaurateur();
86 effacer_meta('admin');
87 // et verifier la session
88 include_spip('inc/auth');
89 if (!$auteur = auth_retrouver_login($GLOBALS['visiteur_session']['login'])
90 OR $auteur['id_auteur']!=$GLOBALS['visiteur_session']['id_auteur'])
93 redirige_url_ecrire();
97 // http://doc.spip.org/@import_queldir
98 function import_queldir()
100 global $connect_toutes_rubriques, $connect_login;
102 if ($connect_toutes_rubriques) {
103 $repertoire = _DIR_DUMP
;
104 if(!@file_exists
($repertoire)) {
105 $repertoire = preg_replace(','._DIR_TMP
.',', '', $repertoire);
106 $repertoire = sous_repertoire(_DIR_TMP
, $repertoire);
110 $repertoire = _DIR_TRANSFERT
;
111 if(!@file_exists
($repertoire)) {
112 $repertoire = preg_replace(','._DIR_TMP
.',', '', $repertoire);
113 $repertoire = sous_repertoire(_DIR_TMP
, $repertoire);
115 return sous_repertoire($repertoire, $connect_login);
121 * Verifier que le dump qu'on essaye d'importer est bien compatible avec la
122 * version en cours, ou alerter des risques et perils
124 * @global string $spip_version_base
125 * @param string $archive
127 * message d'avertissement ou d'erreur si necessaire
129 function verifier_sauvegarde ($archive) {
130 global $spip_version_base;
132 $g = preg_match(",\.gz$,", $archive);
133 $_fopen = $g ?
'gzopen' : 'fopen';
134 $_fread = $g ?
'gzread' : 'fread';
135 $buf_len = 1024; // la version doit etre dans le premier ko
137 if (!(@file_exists
($archive) AND $f = $_fopen($archive, "rb")))
138 return _T('avis_probleme_archive', array('archive' => $archive));
140 $buf = $_fread($f, $buf_len);
142 if (preg_match('/<SPIP\s+[^>]*version_base="([0-9.]+)"[^>]*version_archive="([^"]+)"/', $buf, $regs)
143 AND version_compare($regs[1], "1.813", ">=")
144 AND import_charge_version($regs[2]) )
145 return ''; // c'est bon
147 $r = $regs[1] . ' ' . $regs[2];
148 return _T('avis_erreur_version_archive',
149 array('archive' => str_replace('/', ' / ', $archive) . " ($r)",
150 'spipnet' => $GLOBALS['home_server']
151 . '/' . $GLOBALS['spip_lang'] . '_article1489.html'
156 * Verifier qu'on a bien le script qui sait lire la version d'archive
158 * @param string $version_archive
161 function import_charge_version($version_archive)
163 // si c'est une archive xml par phpmyadmin, on sait la lire avec le script import_1_3
164 if (preg_match("{^phpmyadmin::}is",$version_archive)){
165 $fimport = 'import_1_3';
168 $fimport = 'import_' . str_replace('.','_',$version_archive);
170 return charger_fonction($fimport, 'inc', true);