source: spip-zone/_plugins_/mutualisation/exec/mutualisation.php @ 48944

Last change on this file since 48944 was 48944, checked in by yffic@…, 10 years ago

Ajout des colonnes dans la page exec=mutualisation permettant de visualiser la taille des répertoires local, IMG et tmp/cache. Les calculs de sont lancés qu'après appui sur un bouton car ils sont assez long à effectuer. Ces calculs sont lancés en ajax, si le résultat en cours d'élaboration dépasse 500Mo (sans doute à régler à l'usage), la phase ajax est relancée pour chacun des sous répertoires (Ceci doit permettre d'éviter d'atteindre le max_execution_time de php).

Voilà, c'est à tester et si ça pose des problèmes que je n'ai pas vus, je dé-commite.

File size: 9.5 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5function exec_mutualisation_dist() {
6        global $auteur_session;
7
8        include_spip('inc/minipres');
9        include_spip('inc/filtres');
10
11        // pas admin ? passe ton chemin
12        if ( ($auteur_session['statut'] != '0minirezo') and ( $_SERVER["REMOTE_ADDR"]!='127.0.0.1'))
13                die('pas admin !');
14
15        $lister_sites = charger_fonction('lister_sites','mutualisation');
16        $sites = $lister_sites();
17
18
19        if (!file_exists(_DIR_IMG.'mutualiser.png'))
20                @copy(find_in_path('mutualiser.png'), _DIR_IMG.'mutualiser.png');
21
22        $titre .= _L(count($sites).' '.'sites mutualis&#233;s <em>('._T('version')
23                . ' ' . $GLOBALS['spip_version_base'].')</em>');
24
25        $page .= '<script type="text/javascript">
26        //<![CDATA[
27        var tableau_sites = new Array();
28        //]]>
29        </script>';
30
31        //$page .= "<div id='trace'></div>" ;
32        $page .= "<table style='clear:both;'>
33        <thead>
34                <tr>
35                        <td>Site</td>
36                        <td>Nom</td>
37                        <td>Admin</td>
38                        <td id='IMG'>IMG<span class='unite'>&nbsp;(Mo)</span><br />
39                                <input type='button' name='IMGcalculer' id='IMGcalculer' value='Calculer' onclick='rechercher_tailles(\"IMG\");'></td>
40                        <td id='local'>local<span class='unite'>&nbsp;(Mo)</span><br />
41                                <input type='button' name='localcalculer' id='localcalculer' value='Calculer' onclick='rechercher_tailles(\"local\");'></td>
42                        <td id='cache'>cache<span class='unite'>&nbsp;(Mo)</span><br />
43                                <input type='button' name='cachecalculer' id='cachecalculer' value='Calculer' onclick='rechercher_tailles(\"cache\");'></td>
44                        <td title='Popularit&eacute; totale du site'>Stats</td>
45                        <td>Plugins</td>
46                        <td>Date</td>
47                </tr>
48        </thead>
49        <tbody>";
50
51        $nsite = 1;
52
53        # aliases pour l'affichage court
54        $alias = array();
55        foreach ($sites as $v) {
56                $redux = preg_replace(',^www\.|\..*$,', '', $v);
57                if (!in_array($redux, $alias))
58                        $alias[$v] = $redux;
59                else
60                        $alias[$v] = $v;
61        }
62       
63        // Recuperer la liste des plugins connus de l'instance SPIP en cours (celle qui est appelee par ecrire/?exec=mutualisation)
64        include_spip('inc/plugin');
65        $liste_plug = liste_plugin_files();
66        $liste_plug_compat = liste_plugin_valides($liste_plug);
67        $liste_plug_compat_base = $liste_plug_compat[2];
68        $liste_plug_compat = $liste_plug_compat[0];
69       
70        foreach ($sites as $v) {
71                $nom_site=$stats=$plugins=$erreur=$version_installee="";
72
73                if (lire_fichier_securise(_DIR_RACINE.$GLOBALS['mutualisation_dir'].'/'.$v.'/tmp/meta_cache.php', $meta)
74                AND is_array($meta = @unserialize($meta))
75                AND $url = $meta['adresse_site']) {
76                        $url .= '/';
77                        $nom_site = sinon(importer_charset($meta['nom_site'], $meta['charset']), $v);
78                        $stats = intval($meta['popularite_total']);
79                        if ($cfg = @unserialize($meta['plugin'])) {
80                                $plugins = array_keys($cfg);
81                                ksort($plugins);
82                                foreach ($plugins as $plugin) {
83                                        $lsplugs[strtolower($plugin)][] = $alias[$v];
84                                        $versionplug[strtolower($plugin)] = $cfg[$plugin]['version'];
85                                }
86                                $cntplugins = count($plugins);
87                                $plugins = strtolower(join(', ', $plugins));
88                        } else
89                                $plugins = '-';
90
91                        // S'il faut upgrader, creer un bouton qui permettra
92                        // de faire la mise a jour directement depuis le site maitre
93                        // Pour cela, on cree un bouton avec un secret, que mutualiser.php
94                        // va intercepter (pas terrible ?)
95                        $erreur = test_upgrade_site($meta);
96                        $adminplugin = adminplugin_site($meta, $liste_plug_compat, $liste_plug_compat_base);
97                        $version_installee = ' <em><small>'.$meta['version_installee'].'</small></em>';
98                }
99                else {
100                        $url = 'http://'.$v.'/';
101                        $erreur = ' <em><small><span class="erreur">Erreur&nbsp;!</span></small></em>';
102                        $plugins = '-';
103                }
104                $page .= '<script type="text/javascript">
105                //<![CDATA[
106                tableau_sites.push(["../../sites/'.$v.'"]);
107                //]]>
108                </script>';
109
110                $page .= "<tr class='tr". $nsite % 2 ."'"
111                        . " style='background-image: url(${url}ecrire/index.php?exec=mutualisation&amp;renouvelle_alea=yo)'>
112                        <td style='text-align:right;'>$v$erreur$version_installee</td>
113                        <td><a href='${url}'>".typo($nom_site)."</a></td>
114                        <td><a href='${url}ecrire/'>ecrire</a></td>
115                        <td><div id='IMG$nsite' class='taille loading'></div></td>
116                        <td><div id='local$nsite' class='taille loading'></div></td>
117                        <td><div id='cache$nsite' class='taille loading'></div></td>
118                        <td style='text-align:right;'><a href='${url}ecrire/index.php?exec=statistiques_visites'>${stats}</a></td>
119                        <td>$adminplugin<a href='${url}ecrire/index.php?exec=admin_plugin'>${cntplugins}</a> <small>${plugins}</small></td>
120                        <td style='text-align:right;'>".date_creation_repertoire_site($v)."</td>
121                        </tr>\n";
122                $nsite++;
123        }
124        $page .= "</tbody></table>";
125
126        if ($lsplugs) {
127                $page .= "<br /><br /><table style='clear:both;'>
128        <thead>
129                <tr>
130                        <td>#</td>
131                        <td>Plugins utilis&#233;s</td>
132                        <td>Version</td>
133                        <td>Sites</td>
134                </tr>
135        </thead>
136        <tbody>";
137                foreach ($lsplugs as $plugin => $c)
138                        $plnum[count($c)] .= "<tr><td>".count($c)."</td><td>$plugin</td>"
139                                ."<td>".$versionplug[$plugin]."</td><td>".join(', ', $c).'</td></tr>';
140                krsort($plnum);
141                $page .= join('', $plnum);
142                $page .= "</tbody></table>\n";
143
144
145                $inutile = array();
146                foreach ( glob(_DIR_PLUGINS.'*/plugin.xml') as $pl) {
147                        if (preg_match(',<prefix>([^<]+),ims', file_get_contents($pl), $r)
148                        AND !$lsplugs[strtolower(trim($r[1]))])
149                                $inutile[] = trim($r[1]);
150                }
151                if ($inutile) {
152                        $page .= "<p>"._L('Plugins inutilis&#233;s :')." ".join(', ', $inutile)."</p>";
153                }
154        }
155
156        $page .= '<div style="text-align:center;"><img src="'
157                . find_in_path('mutualisation/mutualiser.png')
158                . '" alt="" /></div>';
159
160        $page = minipres($titre, $page);
161       
162        $page = str_replace('</head>', '
163                <style type="text/css">
164                a {color:#5a3463;}
165                table {border-collapse: collapse; border: 1px solid #999;}
166                tr {vertical-align:top;border: 1px solid #999;}
167                .tr0 {background-color:#ddded5}
168                thead tr {font-weight:bold;background-color:#333;color:#fff;}
169                thead tr input {font-weight:normal;font-size:0.9em;}
170                thead tr .unite {font-weight:normal;font-size:0.9em;}
171                td {text-align:left;border-left: 1px solid #ccc;}
172                td em {color:#aaa;}
173                #minipres{width:auto;}
174                .upgrade {text-align: center; padding:0 .5em; display:inline;}
175                .upgrade div {display:inline;}
176                .upgrade input { border: 2px solid red;color:red; background-color:#fff; font-weight:bold;}
177                .erreur {color:red;font-weight:bold;}
178                .taille {text-align: right;}
179                .loading {background: url(../mutualisation/images/loading.gif) left center no-repeat}
180                </style>
181                <script src="../prive/javascript/jquery.js" type="text/javascript"></script>
182                <script src="../mutualisation/mutualisation_tailles.js" type="text/javascript"></script>
183                </head>
184                ', $page);
185
186        echo $page;
187}
188
189
190function test_upgrade_site($meta) {
191        if ($GLOBALS['spip_version_base']
192        != str_replace(',','.',$meta['version_installee'])) {
193                $secret = $meta['version_installee'].'-'.$meta['popularite_total'];
194                $secret = md5($secret);
195                return <<<EOF
196<form action='$meta[adresse_site]/ecrire/index.php?exec=mutualisation' method='post' class='upgrade' target='_blank'>
197<div>
198<input type='hidden' name='secret' value='$secret' />
199<input type='hidden' name='exec' value='mutualisation' />
200<input type='hidden' name='upgrade' value='oui' />
201<input type='submit' value='Upgrade site' />
202</div>
203</form>
204EOF;
205        }
206}
207
208function adminplugin_site($meta, $liste_plug_compat, $liste_plug_compat_base) {
209        if ($cfg = @unserialize($meta['plugin'])) {
210                $plugins = array_keys($cfg);
211                ksort($plugins);
212                foreach ($plugins as $plugin) {
213                        $vplugin_base = $meta[strtolower($plugin).'_base_version'];
214                        $nouvelle_version_plugin_base = $liste_plug_compat_base[$liste_plug_compat[$plugin]['dir_type']][$liste_plug_compat[$plugin]['dir']]['version_base'];
215                        if ($cfg[$plugin]['version'] != $liste_plug_compat[$plugin]['version']
216                        AND !is_null($liste_plug_compat[$plugin]['version'])
217                        AND ($vplugin_base != $nouvelle_version_plugin_base) ) {
218                                $secret = $meta['version_installee'].'-'.$meta['popularite_total'];
219                                $secret = md5($secret);
220                                $vplugin = $vplugin_base . '&rarr;' . $nouvelle_version_plugin_base;
221                                return <<<EOF
222<form action='$meta[adresse_site]/ecrire/index.php?exec=mutualisation' method='post' class='upgrade' target='_blank'>
223<div>
224<input type='hidden' name='secret' value='$secret' />
225<input type='hidden' name='exec' value='mutualisation' />
226<input type='hidden' name='upgradeplugins' value='oui' />
227<input type='submit' value='Upgrade plugins ($plugin $vplugin)' />
228</div>
229</form>
230EOF;
231                        }
232                }
233        } 
234        return '';
235}
236
237
238function date_creation_repertoire_site ($v) {
239        return (date("d/M/y", @filectime('../'.$GLOBALS['mutualisation_dir'].'/'.$v."/config/connect.php"))) ; 
240}
241
242// lister les sites qui ont des sites/xx/config/connect.php
243// avec 'connect.php' ne changeant pas de nom
244function mutualisation_lister_sites_dist() {
245        $sites = array();
246        foreach(glob('../'.$GLOBALS['mutualisation_dir'].'/*/config/connect.php') as $s) {
247                $sites[] = preg_replace(',^\.\./'.$GLOBALS['mutualisation_dir'].'/(.*)/config/connect.php,', '\1', $s);
248        }
249        sort($sites);
250        return $sites;
251}
252
253/* autre exemple pour ceux qui mettent tous leurs fichiers de connexion
254 * dans /config/connect/xx.php
255 * fonction a mettre dans mes_options.php ou dans mutualisations/lister_sites.php
256 */
257/*
258function mutualisation_lister_sites() {
259        $sites = array();
260        if (is_dir(_DIR_CONNECT)) {
261                if ($dh = @opendir(_DIR_CONNECT)) {
262                        while (($file = readdir($dh)) !== false) {
263                                if (substr($file,-4)=='.php') {
264                                        $sites[] = substr($file,0,-4);
265                                }
266                        }
267                }
268        }
269        sort($sites);
270        return $sites;
271}
272*/
273?>
Note: See TracBrowser for help on using the repository browser.