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