[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / svp / teleporter / http_deballe_tgz.php
1 <?php
2 /**
3 * Gestion du téléporteur HTTP \ Tar.
4 *
5 * @plugin SVP pour SPIP
6 * @license GPL
7 * @package SPIP\SVP\Teleporteur
8 */
9
10
11 /**
12 * Déballer le fichier au format tgz dans le répertoire $dest
13 * en utilisant le dossier temporaire $tmp si besoin
14 *
15 * @uses teleporter_http_charger_tgz()
16 * @param string $archive
17 * Chemin du fichier tgz
18 * @param string $dest
19 * Répertoire où on veut décompresser
20 * @param string $tmp
21 * Répertoire de stockage temporaire
22 * @return bool|string
23 * Répertoire où a été décompressé le tgz, false sinon.
24 */
25 function teleporter_http_deballe_tgz_dist($archive, $dest, $tmp) {
26
27 $status = teleporter_http_charger_tgz(
28 array(
29 'archive' => $archive, // normalement l'url source mais on l'a pas ici
30 'fichier' => $archive,
31 'dest' => $dest,
32 'tmp' => $tmp,
33 'extract' => true,
34 'root_extract' => true, # extraire a la racine de dest
35 )
36 );
37 // le fichier .zip est la et bien forme
38 if (is_array($status)
39 and is_dir($status['target'])
40 ) {
41 return $status['target'];
42 } // fichier absent
43 else {
44 if ($status == -1) {
45 spip_log("dezip de $archive impossible : fichier absent", "teleport" . _LOG_ERREUR);
46
47 return false;
48 } // fichier la mais pas bien dezippe
49 else {
50 spip_log("probleme lors du dezip de $archive", "teleport" . _LOG_ERREUR);
51
52 return false;
53 }
54 }
55 }
56
57
58 /**
59 * Charger un tgz à partir d'un tableau d'options descriptives
60 *
61 * @uses http_deballe_recherche_racine()
62 * @link http://www.phpconcept.net/pcltar Utilise la librairie PclTar
63 *
64 * @param array $quoi
65 * Tableau d'options
66 * @return array|bool|int|string
67 * En cas de réussite, Tableau décrivant le zip, avec les index suivant :
68 * - files : la liste des fichiers présents dans le zip,
69 * - size : la taille décompressée
70 * - compressed_size : la taille compressée
71 * - dirname : répertoire où les fichiers devront être décompréssés
72 * - tmpname : répertoire temporaire où les fichiers sont décompressés
73 * - target : cible sur laquelle décompresser les fichiers...
74 */
75 function teleporter_http_charger_tgz($quoi = array()) {
76 if (!$quoi) {
77 return false;
78 }
79
80 foreach (array(
81 'remove' => '',
82 'rename' => array(),
83 'edit' => array(),
84 'root_extract' => false, # extraire a la racine de dest ?
85 'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur')
86 )
87 as $opt => $def) {
88 isset($quoi[$opt]) || ($quoi[$opt] = $def);
89 }
90
91 if (!@file_exists($fichier = $quoi['fichier'])) {
92 return 0;
93 }
94
95 include_spip('inc/pcltar');
96
97 $racine = '';
98 if ($list = PclTarList($fichier)) {
99 $racine = http_deballe_recherche_racine($list);
100 $quoi['remove'] = $racine;
101 } else {
102 spip_log('charger_decompresser erreur lecture liste tar ' . PclErrorString() . ' pour paquet: ' . $quoi['archive'],
103 "teleport" . _LOG_ERREUR);
104
105 return PclErrorString();
106 }
107
108 // si pas de racine commune, reprendre le nom du fichier zip
109 // en lui enlevant la racine h+md5 qui le prefixe eventuellement
110 // cf action/charger_plugin L74
111 if (!strlen($nom = basename($racine))) {
112 $nom = preg_replace(",^h[0-9a-f]{8}-,i", "", basename($fichier, '.zip'));
113 }
114
115 $dir_export = $quoi['root_extract']
116 ? $quoi['dest']
117 : $quoi['dest'] . $nom;
118 $dir_export = rtrim($dir_export, '/') . '/';
119
120 $tmpname = $quoi['tmp'] . $nom . '/';
121
122 // choisir la cible selon si on veut vraiment extraire ou pas
123 $target = $quoi['extract'] ? $dir_export : $tmpname;
124
125 // ici, il faut vider le rep cible si il existe deja, non ?
126 if (is_dir($target)) {
127 supprimer_repertoire($target);
128 }
129
130 $ok = PclTarExtract($fichier, $target, $quoi['remove']);
131 if ($ok == 0) {
132 spip_log('charger_decompresser erreur tar ' . PclErrorString() . ' pour paquet: ' . $quoi['archive'],
133 "teleport" . _LOG_ERREUR);
134
135 return PclErrorString();
136 }
137
138 spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'], "teleport");
139
140 $size = $compressed_size = 0;
141 $removex = ',^' . preg_quote($quoi['remove'], ',') . ',';
142 foreach ($list as $a => $f) {
143 $size += $f['size'];
144 # $compressed_size += $f['compressed_size'];
145 $list[$a] = preg_replace($removex, '', $f['filename']);
146 }
147
148 // Indiquer par un fichier install.log
149 // a la racine que c'est chargeur qui a installe ce plugin
150 ecrire_fichier($target . 'install.log',
151 "installation: charger_plugin\n"
152 . "date: " . gmdate('Y-m-d\TH:i:s\Z', time()) . "\n"
153 . "source: " . $quoi['archive'] . "\n"
154 );
155
156
157 return array(
158 'files' => $list,
159 'size' => $size,
160 'compressed_size' => $compressed_size,
161 'dirname' => $dir_export,
162 'tmpname' => $tmpname,
163 'target' => $target,
164 );
165 }