[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / exec / admin_tech.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/presentation');
16 include_spip('base/dump');
17
18 // http://doc.spip.org/@exec_admin_tech_dist
19 function exec_admin_tech_dist()
20 {
21 if (!autoriser('sauvegarder')){
22 include_spip('inc/minipres');
23 echo minipres();
24 } else exec_admin_tech_args(options_avancees_dump());
25 }
26
27 function exec_admin_tech_args($tables)
28 {
29 $commencer_page = charger_fonction('commencer_page', 'inc');
30 echo $commencer_page(_T('titre_admin_tech'), "configuration", "base");
31
32 echo "<br /><br />";
33 echo "<div style='text-align: center'>",
34 gros_titre(_T('titre_admin_tech'),'',false),
35 '</div>';
36
37 if ($GLOBALS['connect_toutes_rubriques']) {
38
39 echo barre_onglets("administration", "sauver") . "<br />";
40 echo debut_gauche('',true);
41 echo debut_boite_info(true);
42 echo _T('info_gauche_admin_tech');
43 echo fin_boite_info(true);
44 $repertoire = _DIR_DUMP;
45 if (!@file_exists($repertoire)
46 AND !$repertoire = sous_repertoire(_DIR_DUMP,'',false,true)
47 ) {
48 $repertoire = preg_replace(','._DIR_TMP.',', '', _DIR_DUMP);
49 $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
50 }
51 $dir_dump = $repertoire;
52
53 } else {
54 echo debut_gauche('', true);
55 $dir_dump = determine_upload();
56 }
57
58 echo debut_droite('',true);
59
60 //
61 // Sauvegarde de la base
62 //
63
64 // a passer en fonction
65 if (substr(_DIR_IMG, 0, strlen(_DIR_RACINE)) === _DIR_RACINE)
66 $dir_img = substr(_DIR_IMG,strlen(_DIR_RACINE));
67 else
68 $dir_img = _DIR_IMG;
69
70 $dir_dump = joli_repertoire($dir_dump);
71
72 $res =
73 "\n<p>" .
74 http_img_pack('warning.gif', _T('info_avertissement'),
75 "style='width: 48px; height: 48px; float: right;margin: 10px;'") .
76 _T('texte_admin_tech_01',
77 array('dossier' => '<i>'.$dir_dump.'</i>', 'img'=>'<i>'.$dir_img.'</i>')) .
78 '&nbsp;' .
79 _T('texte_admin_tech_02',
80 array('spipnet' => $GLOBALS['home_server']
81 . '/' . $GLOBALS['spip_lang'] . '_article1489.html'
82 )) .
83 "</p>";
84
85 $file = nom_fichier_dump();
86
87 $chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
88
89 $form = $chercher_rubrique(0, $GLOBALS['connect_id_rubrique'] ? 'breve' : 'rubrique', $GLOBALS['connect_id_rubrique'], 0, 'admin_tech');
90
91 if ($form) {
92 if (preg_match('@^<select([^>]*)>(\s*<option[^>]*)>([^[<]+)(.*)$@s', $form, $r)) {
93 if (!strpos($r[2], 'selected='))
94 $r[2] .= " selected='selected'";
95 $form = "<select onchange='x=this.options[this.options.selectedIndex].firstChild.data.match(/\w+/); findObj_forcer(\"znom_sauvegarde\").value=x[0]; findObj_forcer(\"nom_sauvegarde\").value=x[0];'" . $r[1] . '>' . $r[2] . '>' . $r[3] . $r[4];
96 if ($GLOBALS['connect_id_rubrique'])
97 $file = trim($r[3]);
98 } elseif (preg_match('@^<input[^>]*>([^[<]+)@', $form, $r))
99 if ($GLOBALS['connect_id_rubrique'])
100 $file = trim($r[1]);
101
102 $res .= "\n<label for='id_parent'>" .
103 _T('texte_admin_tech_04') .
104 "</label><br /><br />\n" .
105 $form . '<br /><br />';
106 }
107
108 $nom = "\n<input name='nom_sauvegarde' id='nom_sauvegarde' size='40' value='$file' />";
109 $znom = "\n<input name='znom_sauvegarde' id='znom_sauvegarde' size='40' value='$file' />";
110
111 $res .=
112 _T('texte_admin_tech_03') .
113 "\n<ul>" .
114 "\n<li style='list-style:none;'><input type='radio' name='gz' value='1' id='gz_on' checked='checked' /><label for='gz_on'> " .
115 _T('bouton_radio_sauvegarde_compressee', array('fichier'=>'')) .
116 " </label><br />\n" .
117 '<b>' . $dir_dump . "</b>" .
118 $znom .
119 "<b>.xml.gz</b></li>" .
120 "\n<li style='list-style:none;'><input type='radio' name='gz' value='0' id='gz_off' /><label for='gz_off'>" .
121 _T('bouton_radio_sauvegarde_non_compressee', array('fichier'=>'')) .
122 '</label><br /><b>' .
123 $dir_dump .
124 "</b>$nom<b>.xml</b></li></ul>\n" .
125 "\n<input type='hidden' name='reinstall' value='non' />";
126
127 if (!$GLOBALS['connect_toutes_rubriques'])
128 foreach($tables as $k => $v)
129 if (!strpos($v, 'checked')) unset($tables[$k]);
130
131 $bloc = "<h3>"._T('install_tables_base')."</h3>" .
132 "\n<ol style='spip'><li>\n" .
133 join("</li>\n<li>", $tables) .
134 "</li></ol>\n";
135
136 $bloc = block_parfois_visible('export_tables', _T('info_options_avancees'), $bloc, '', false);
137
138 echo
139 debut_cadre_trait_couleur('',true,'',_T('texte_sauvegarde'),'sauvegarder'),
140 generer_form_ecrire('export_all', $res . $bloc, '', _T('texte_sauvegarde_base')),
141 fin_cadre_trait_couleur(true);
142
143 //
144 // Restauration de la base
145 //
146
147 // restaurer est equivalent a detruire, ou pas (cas des restaurations partielles, a affiner ?)
148 if (autoriser('detruire')) {
149
150 echo debut_cadre_trait_couleur('',true,'', _T('texte_restaurer_base'),'restaurer');
151 echo admin_sauvegardes($dir_dump, _request('tri'));
152 echo fin_cadre_trait_couleur(true);
153
154 //
155 // Lien vers la reparation
156 //
157
158 if (!_request('reinstall') AND version_compare(sql_version(),'3.23.14','>=')) {
159 $res = "\n<p style='text-align: justify;'>".
160 _T('texte_crash_base') .
161 "\n</p>";
162
163 echo
164 debut_cadre_trait_couleur('',true,'',_T('texte_recuperer_base'),'reparer'),
165 generer_form_ecrire('admin_repair', $res, '', _T('bouton_tenter_recuperation')),
166 fin_cadre_trait_couleur(true);
167 }
168 }
169 echo "<br />";
170
171 echo fin_gauche(), fin_page();
172 }
173
174 function admin_sauvegardes($dir_dump, $tri)
175 {
176 $liste_dump = preg_files(_DIR_DUMP,'\.xml(\.gz)?$',50,false);
177 $selected = end($liste_dump);
178 $n = strlen(_DIR_DUMP);
179 $tl = $tt = $td = array();
180 $f = "";
181 $i = 0;
182 foreach($liste_dump as $fichier){
183 $i++;
184 $d = filemtime($fichier);
185 $t = filesize($fichier);
186 $s = ($fichier==$selected);
187 $class = 'row_'.alterner($i, 'even', 'odd');
188 $fichier = substr($fichier, $n);
189 $tl[]= liste_sauvegardes($i, $fichier, $class, $s, $d, $t);
190 $td[] = $d;
191 $tt[] = $t;
192 }
193 if ($tri == 'taille')
194 array_multisort($tt, SORT_ASC, $tl);
195 elseif ($tri == 'date')
196 array_multisort($td, SORT_ASC, $tl);
197 $fichier_defaut = $f ? basename($f) : str_replace(array("@stamp@","@nom_site@"),array("",""),_SPIP_DUMP);
198
199 $self = self();
200 $class = 'row_'.alterner($i+1, 'even', 'odd');
201 $head = !$tl ? '' : (
202 "\n<tr>"
203 . '<th></th><th><a href="'
204 . parametre_url($self, 'tri', 'nom')
205 . '#sauvegardes">'
206 . _T('info_nom')
207 . "</a></th>\n" . '<th><a href="'
208 . parametre_url($self, 'tri', 'taille')
209 . '#sauvegardes">'
210 . _T('taille_octets', array('taille' => ''))
211 . "</a></th>\n" . '<th><a href="'
212 . parametre_url($self, 'tri', 'date')
213 . '#sauvegardes">'
214 . _T('public:date')
215 . '</a></th></tr>');
216
217 $texte = _T('texte_compresse_ou_non')."&nbsp;";
218
219 $h = _T('texte_restaurer_sauvegarde', array('dossier' => '<i>'.$dir_dump.'</i>'));
220
221 $res = "\n<p style='text-align: justify;'> "
222 . $h
223 . '</p>'
224 . _T('entree_nom_fichier', array('texte_compresse' => $texte))
225
226 . "\n<br /><br /><table class='spip' id='sauvegardes'>"
227 . $head
228 . join('',$tl)
229 . "\n<tr class='$class'><td><input type='radio' name='archive' id='archive' value='' /></td><td colspan='3'>"
230 . "\n<span class='spip_x-small'><input type='text' name='archive_perso' id='archive_perso' value='$fichier_defaut' size='55' /></span></td></tr>"
231 . '</table>';
232
233
234 $plie = _T('info_options_avancees');
235 // restauration partielle / fusion
236 $opt = debut_cadre_enfonce('',true) .
237 "\n<div>" .
238 "<input name='insertion' id='insertion' type='checkbox' />&nbsp; <label for='insertion'>".
239 _T('sauvegarde_fusionner') .
240 "</label><br />\n" .
241 "<input name='statut' id='statut' type='checkbox' />&nbsp; <label for='statut'>\n".
242 _T('sauvegarde_fusionner_depublier') .
243 "</label><br />\n" .
244 "<label for='url_site'>" .
245 _T('sauvegarde_url_origine') .
246 "</label>" .
247 " &nbsp;\n<input name='url_site' id='url_site' type='text' size='25' />" .
248 '</div>' .
249 fin_cadre_enfonce(true);
250
251 $res .= block_parfois_visible('import_tables', $plie, $opt, '', false);
252
253 return generer_form_ecrire('import_all', $res, '', _T('bouton_restaurer_base'));
254 }
255
256
257 // http://doc.spip.org/@liste_sauvegardes
258 function liste_sauvegardes($key, $fichier, $class, $selected, $date, $taille)
259 {
260 return "\n<tr class='$class'><td><input type='radio' name='archive' value='"
261 . $fichier
262 . "' id='dump_$key' "
263 . ($selected?"checked='checked' ":"")
264 . "/></td><td>\n<label for='dump_$key'>"
265 . str_replace('/', ' / ', $fichier)
266 . "</label></td><td style='text-align: right'>"
267 . taille_en_octets($taille)
268 . '</td><td>'
269 . affdate_heure(date('Y-m-d H:i:s',$date))
270 . '</td></tr>';
271 }
272
273 // http://doc.spip.org/@nom_fichier_dump
274 function nom_fichier_dump()
275 {
276 global $connect_toutes_rubriques;
277
278 if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
279 $dir = _DIR_DUMP;
280 else $dir = determine_upload();
281 $site = isset($GLOBALS['meta']['nom_site'])
282 ? preg_replace(array(",\W,is",",_(?=_),",",_$,"),array("_","",""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])),30,""))
283 : 'spip';
284
285 $site .= '_' . date('Ymd');
286
287 $nom = $site;
288 $cpt=0;
289 while (file_exists($dir. $nom . ".xml") OR
290 file_exists($dir. $nom . ".xml.gz")) {
291 $nom = $site . sprintf('_%03d', ++$cpt);
292 }
293 return $nom;
294 }
295
296
297 function options_avancees_dump(){
298 list($tables,) = base_liste_table_for_dump(lister_tables_noexport());
299 return controle_tables_en_base('export', $tables);
300 }
301
302
303 // Fabrique la liste a cocher des tables presentes
304 function controle_tables_en_base($name, $check)
305 {
306 $p = '/^' . $GLOBALS['table_prefix'] . '/';
307 $res = $check;
308 foreach(sql_alltable() as $t) {
309 $t = preg_replace($p, 'spip', $t);
310 if (!in_array($t, $check)) $res[]= $t;
311 }
312 sort($res);
313
314 foreach ($res as $k => $t) {
315
316 $res[$k] = "<input type='checkbox' value='$t' name='$name"
317 . "[]'"
318 . (in_array($t, $check) ? " checked='checked'" : '')
319 . "/>\n"
320 . $t
321 . " ("
322 . sql_countsel($t)
323 . ")";
324 }
325 return $res;
326 }
327
328 ?>