source: spip-zone/_core_/plugins/svp/action/teleporter.php @ 93627

Last change on this file since 93627 was 93627, checked in by cedric@…, 4 years ago

Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage

File size: 3.2 KB
Line 
1<?php
2/**
3 * Gestion de l'action teleporter
4 *
5 * @plugin SVP pour SPIP
6 * @license GPL
7 * @package SPIP\SVP\Actions
8 */
9
10
11/**
12 * Téléporter et déballer un composant
13 *
14 * @param string $methode
15 *   http|git|svn|...
16 * @param string $source
17 *   URL source du composant
18 * @param string $dest
19 *   Chemin du répertoire où déballer le composant. Inclus le dernier segment
20 * @param array $options
21 *   revision => ''
22 *   --ignore-externals
23 * @return bool|string
24 *   String : texte d'une erreur
25 *   true si l'opération est correctement réalisée
26 */
27function action_teleporter_composant_dist($methode, $source, $dest, $options = array()) {
28
29        # Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes
30        # facons jamais pu venir ici avec toutes les securisations faites :^)
31        # sauf si on doit télécharger une lib dans _DIR_LIB
32        if (!preg_match(',' . substr(_DIR_LIB, 0, -1) . ',', $dest) && !_DIR_PLUGINS_AUTO) {
33                die('Vous ne pouvez pas télécharger, absence de _DIR_PLUGINS_AUTO');
34        }
35
36        // verifier que la methode est connue
37        if (!$teleporter = charger_fonction($methode, "teleporter", true)) {
38                spip_log("Methode $methode inconnue pour teleporter $source vers $dest", "teleport" . _LOG_ERREUR);
39
40                return _T('svp:erreur_teleporter_methode_inconue', array('methode' => $methode));
41        }
42
43        if (!$dest = teleporter_verifier_destination($d = $dest)) {
44                spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d", "teleport" . _LOG_ERREUR);
45
46                return _T('svp:erreur_teleporter_destination_erreur', array('dir' => $d));
47                #$texte = "<p>"._T('plugin_erreur_droit1',array('dest'=>$dest))."</p>"
48                #  . "<p>"._T('plugin_erreur_droit2').aide('install0')."</p>";
49        }
50
51        # destination temporaire des fichiers si besoin
52        $options['dir_tmp'] = sous_repertoire(_DIR_CACHE, 'chargeur');
53
54        return $teleporter($methode, $source, $dest, $options);
55}
56
57
58/**
59 * Vérifier et préparer l'arborescence jusqu'au répertoire parent
60 *
61 * @param string $dest
62 * @return bool|string
63 *     false en cas d'échec
64 *     Chemin du répertoire sinon
65 */
66function teleporter_verifier_destination($dest) {
67        $dest = rtrim($dest, "/");
68        $final = basename($dest);
69        $base = dirname($dest);
70        $create = array();
71        // on cree tout le chemin jusqu'a dest non inclus
72        while (!is_dir($base)) {
73                $create[] = basename($base);
74                $base = dirname($base);
75        }
76        while (count($create)) {
77                if (!is_writable($base)) {
78                        return false;
79                }
80                $base = sous_repertoire($base, array_pop($create));
81                if (!$base) {
82                        return false;
83                }
84        }
85
86        if (!is_writable($base)) {
87                return false;
88        }
89
90        return $base . "/$final";
91}
92
93/**
94 * Déplace un répertoire pour libérer l'emplacement.
95 *
96 * Si le répertoire donné existe, le déplace dans un répertoire de backup.
97 * Si ce backup existe déjà, il est supprimé auparavant.
98 * Retourne le nouveau chemin du répertoire.
99 *
100 * @param string $dest
101 *     Chemin du répertoire à déplacer
102 * @return string
103 *     Nouveau chemin du répertoire s'il existait,
104 *     Chaîne vide sinon
105 **/
106function teleporter_nettoyer_vieille_version($dest) {
107        $old = "";
108        if (is_dir($dest)) {
109                $dir = dirname($dest);
110                $base = basename($dest);
111                $old = "$dir/.$base.bck";
112                if (is_dir($old)) {
113                        supprimer_repertoire($old);
114                }
115                rename($dest, $old);
116        }
117
118        return $old;
119}
Note: See TracBrowser for help on using the repository browser.