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/presentation');
16 include_spip('base/dump');
18 // http://doc.spip.org/@exec_admin_tech_dist
19 function exec_admin_tech_dist()
21 if (!autoriser('sauvegarder')){
22 include_spip('inc/minipres');
25 $commencer_page = charger_fonction('commencer_page', 'inc');
26 echo $commencer_page(_T('titre_admin_tech'), "configuration", "base");
29 echo "<div style='text-align: center'>",
30 gros_titre(_T('titre_admin_tech'),'',false),
33 if ($GLOBALS['connect_toutes_rubriques']) {
35 echo barre_onglets("administration", "sauver") . "<br />";
36 echo debut_gauche('',true);
37 echo debut_boite_info(true);
38 echo _T('info_gauche_admin_tech');
39 echo fin_boite_info(true);
40 $repertoire = _DIR_DUMP
;
41 if (!@file_exists
($repertoire)
42 AND !$repertoire = sous_repertoire(_DIR_DUMP
,'',false,true)
44 $repertoire = preg_replace(','._DIR_TMP
.',', '', _DIR_DUMP
);
45 $repertoire = sous_repertoire(_DIR_TMP
, $repertoire);
47 $dir_dump = $repertoire;
50 echo debut_gauche('', true);
51 $dir_dump = determine_upload();
54 echo debut_droite('',true);
57 // Sauvegarde de la base
60 echo debut_cadre_trait_couleur('',true,'',_T('texte_sauvegarde'),'sauvegarder');
62 // a passer en fonction
63 if (substr(_DIR_IMG
, 0, strlen(_DIR_RACINE
)) === _DIR_RACINE
)
64 $dir_img = substr(_DIR_IMG
,strlen(_DIR_RACINE
));
68 $dir_dump = joli_repertoire($dir_dump);
72 http_img_pack('warning.gif', _T('info_avertissement'),
73 "style='width: 48px; height: 48px; float: right;margin: 10px;'") .
74 _T('texte_admin_tech_01',
75 array('dossier' => '<i>'.$dir_dump.'</i>', 'img'=>'<i>'.$dir_img.'</i>')) .
77 _T('texte_admin_tech_02',
78 array('spipnet' => $GLOBALS['home_server']
79 . '/' . $GLOBALS['spip_lang'] . '_article1489.html'
83 $chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
85 $form = $chercher_rubrique(0, 'rubrique', !$GLOBALS['connect_toutes_rubriques'], 0, 'admin_tech');
88 $res .= "\n<label for='id_parent'>" .
89 _T('texte_admin_tech_04') .
90 "</label><br /><br />" .
93 $file = nom_fichier_dump();
94 $nom = "\n<input name='nom_sauvegarde' id='nom_sauvegarde' size='40' value='$file' />";
95 $znom = "\n<input name='znom_sauvegarde' id='znom_sauvegarde' size='40' value='$file' />";
98 _T('texte_admin_tech_03') .
100 "\n<li style='list-style:none;'><input type='radio' name='gz' value='1' id='gz_on' checked='checked' /><label for='gz_on'> " .
101 _T('bouton_radio_sauvegarde_compressee', array('fichier'=>'')) .
102 " </label><br />\n" .
103 '<b>' . $dir_dump . "</b>" .
105 "<b>.xml.gz</b></li>" .
106 "\n<li style='list-style:none;'><input type='radio' name='gz' value='0' id='gz_off' /><label for='gz_off'>" .
107 _T('bouton_radio_sauvegarde_non_compressee', array('fichier'=>'')) .
108 '</label><br /><b>' .
110 "</b>$nom<b>.xml</b></li></ul>\n"
111 . "\n<input type='hidden' name='reinstall' value='non' />";
113 $res .= options_avancees_dump();
115 generer_form_ecrire('export_all', $res, '', _T('texte_sauvegarde_base')),
116 fin_cadre_trait_couleur(true);
119 // Restauration de la base
122 // restaurer est equivalent a detruire, ou pas (cas des restaurations partielles, a affiner ?)
123 if (autoriser('detruire')) {
125 echo debut_cadre_trait_couleur('',true,'', _T('texte_restaurer_base'),'restaurer');
126 echo admin_sauvegardes($dir_dump, _request('tri'));
127 echo fin_cadre_trait_couleur(true);
130 // Lien vers la reparation
133 if (!_request('reinstall') AND version_compare(sql_version(),'3.23.14','>=')) {
134 $res = "\n<p style='text-align: justify;'>".
135 _T('texte_crash_base') .
139 debut_cadre_trait_couleur('',true,'',_T('texte_recuperer_base'),'reparer'),
140 generer_form_ecrire('admin_repair', $res, '', _T('bouton_tenter_recuperation')),
141 fin_cadre_trait_couleur(true);
146 echo fin_gauche(), fin_page();
150 function admin_sauvegardes($dir_dump, $tri)
152 $liste_dump = preg_files(_DIR_DUMP
,'\.xml(\.gz)?$',50,false);
153 $selected = end($liste_dump);
154 $n = strlen(_DIR_DUMP
);
155 $tl = $tt = $td = array();
158 foreach($liste_dump as $fichier){
160 $d = filemtime($fichier);
161 $t = filesize($fichier);
162 $s = ($fichier==$selected);
163 $class = 'row_'.alterner($i, 'even', 'odd');
164 $fichier = substr($fichier, $n);
165 $tl[]= liste_sauvegardes($i, $fichier, $class, $s, $d, $t);
169 if ($tri == 'taille')
170 array_multisort($tt, SORT_ASC
, $tl);
171 elseif ($tri == 'date')
172 array_multisort($td, SORT_ASC
, $tl);
173 $fichier_defaut = $f ?
basename($f) : str_replace(array("@stamp@","@nom_site@"),array("",""),_SPIP_DUMP
);
176 $class = 'row_'.alterner($i+
1, 'even', 'odd');
177 $head = !$tl ?
'' : (
179 . '<th></th><th><a href="'
180 . parametre_url($self, 'tri', 'nom')
183 . "</a></th>\n" . '<th><a href="'
184 . parametre_url($self, 'tri', 'taille')
186 . _T('taille_octets', array('taille' => ''))
187 . "</a></th>\n" . '<th><a href="'
188 . parametre_url($self, 'tri', 'date')
193 $texte = _T('texte_compresse_ou_non')." ";
195 $h = _T('texte_restaurer_sauvegarde', array('dossier' => '<i>'.$dir_dump.'</i>'));
197 $res = "\n<p style='text-align: justify;'> "
200 . _T('entree_nom_fichier', array('texte_compresse' => $texte))
202 . "\n<br /><br /><table class='spip' id='sauvegardes'>"
205 . "\n<tr class='$class'><td><input type='radio' name='archive' id='archive' value='' /></td><td colspan='3'>"
206 . "\n<span class='spip_x-small'><input type='text' name='archive_perso' id='archive_perso' value='$fichier_defaut' size='55' /></span></td></tr>"
210 $plie = _T('info_options_avancees');
211 // restauration partielle / fusion
212 $opt = debut_cadre_enfonce('',true) .
214 "<input name='insertion' id='insertion' type='checkbox' /> <label for='insertion'>".
215 _T('sauvegarde_fusionner') .
217 "<input name='statut' id='statut' type='checkbox' /> <label for='statut'>\n".
218 _T('sauvegarde_fusionner_depublier') .
220 "<label for='url_site'>" .
221 _T('sauvegarde_url_origine') .
223 " \n<input name='url_site' id='url_site' type='text' size='25' />" .
225 fin_cadre_enfonce(true);
227 $res .= block_parfois_visible('import_tables', $plie, $opt, '', false);
229 return generer_form_ecrire('import_all', $res, '', _T('bouton_restaurer_base'));
233 // http://doc.spip.org/@liste_sauvegardes
234 function liste_sauvegardes($key, $fichier, $class, $selected, $date, $taille)
236 return "\n<tr class='$class'><td><input type='radio' name='archive' value='"
238 . "' id='dump_$key' "
239 . ($selected?
"checked='checked' ":"")
240 . "/></td><td>\n<label for='dump_$key'>"
241 . str_replace('/', ' / ', $fichier)
242 . "</label></td><td style='text-align: right'>"
243 . taille_en_octets($taille)
245 . affdate_heure(date('Y-m-d H:i:s',$date))
249 // http://doc.spip.org/@nom_fichier_dump
250 function nom_fichier_dump()
252 global $connect_toutes_rubriques;
254 if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP
))
256 else $dir = determine_upload();
257 $site = isset($GLOBALS['meta']['nom_site'])
258 ?
preg_replace(array(",\W,is",",_(?=_),",",_$,"),array("_","",""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])),30,""))
261 $site .= '_' . date('Ymd');
265 while (file_exists($dir. $nom . ".xml") OR
266 file_exists($dir. $nom . ".xml.gz")) {
267 $nom = $site . sprintf('_%03d', ++
$cpt);
273 function options_avancees_dump(){
274 list($tables,) = base_liste_table_for_dump(lister_tables_noexport());
275 $plie = _T('info_options_avancees');
276 $res = controle_tables_en_base('export', $tables);
277 $res = "<h3>"._T('install_tables_base')."</h3>"
278 . "\n<ol style='spip'><li>\n" .
279 join("</li>\n<li>", $res) .
282 $res = block_parfois_visible('export_tables', $plie, $res, '', false);
287 // Fabrique la liste a cocher des tables presentes
288 function controle_tables_en_base($name, $check)
290 $p = '/^' . $GLOBALS['table_prefix'] . '/';
292 foreach(sql_alltable() as $t) {
293 $t = preg_replace($p, 'spip', $t);
294 if (!in_array($t, $check)) $res[]= $t;
298 foreach ($res as $k => $t) {
300 $res[$k] = "<input type='checkbox' value='$t' name='$name"
302 . (in_array($t, $check) ?
" checked='checked'" : '')