source: spip-zone/_outils_/spip-cli/trunk/src/Command/PluginsActiver.php @ 113911

Last change on this file since 113911 was 113911, checked in by cedric@…, 8 months ago

option --short sur l'affichage des plugins actif apres activation

File size: 7.3 KB
Line 
1<?php
2
3namespace Spip\Cli\Command;
4
5use Symfony\Component\Console\Input\InputArgument;
6use Symfony\Component\Console\Input\InputInterface;
7use Symfony\Component\Console\Input\InputOption;
8use Symfony\Component\Console\Output\OutputInterface;
9use Symfony\Component\Console\Question\Question;
10
11class PluginsActiver extends PluginsLister
12{
13
14        protected $todo = [];
15
16        protected function configure() {
17                $this
18                        ->setName('plugins:activer')
19                        ->setDescription('Active un ou plusieurs plugins.')
20                        ->addArgument('from', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Active les plugins listés. Détermine automatiquement l’option from-xxx.')
21                        ->addOption('from-file', null, InputOption::VALUE_OPTIONAL, 'Chemin d’un fichier d’export')
22                        ->addOption('from-url', null, InputOption::VALUE_OPTIONAL, 'Url d’un site SPIP')
23                        ->addOption('from-list', null, InputOption::VALUE_OPTIONAL, 'Liste de préfixes à activer, séparés par virgule')
24                        ->addOption('import', 'e', InputOption::VALUE_NONE, 'Importer la liste des plugins actifs depuis un fichier')
25                        ->addOption('name', null, InputOption::VALUE_OPTIONAL, 'Nom du fichier d’import', 'plugins')
26                        ->addOption('all', 'a', InputOption::VALUE_NONE, "Activer tous les plugins disponibles.")
27                        ->addOption('short', null, InputOption::VALUE_NONE, 'Affiche simplement le préfixe sur la liste des plugins actifs')
28                        ->addOption('yes', 'y', InputOption::VALUE_NONE, 'Activer les plugins sans poser de question');
29        }
30
31        protected function execute(InputInterface $input, OutputInterface $output) {
32                $this->demarrerSpip();
33                $this->io->title("Activer des plugins");
34
35                if ($input->getOption('from-file')) {
36                        $this->addTodo($this->getPrefixesFromFile($input->getOption('from-file')));
37                } elseif ($input->getOption('from-url')) {
38                        $this->addTodo($this->getPrefixesFromUrl($input->getOption('from-url')));
39                } elseif ($input->getOption('from-list')) {
40                        $this->addTodo(explode(',', $input->getOption('from-list')));
41                } elseif ($input->getArgument('from')) {
42                        $from = $input->getArgument('from');
43                        foreach ($from as $quoi) {
44                                if (preg_match(',^https?://,', $quoi)) {
45                                        $this->addTodo($this->getPrefixesFromUrl($quoi));
46                                } elseif (strpbrk($quoi, '.\\/')) {
47                                        $this->addTodo($this->getPrefixesFromFile($quoi));
48                                } else {
49                                        $this->addTodo([$quoi]);
50                                }
51                        }
52                } elseif ($input->getOption('import')) {
53                        $this->addTodo($this->getPrefixesFromFile($this->getExportFile($input)));
54                } elseif ($input->getOption('all')) {
55                        $this->addTodo(array_column($this->getPluginsInactifs(), 'nom'));
56                }
57                /* si on appelle sans plugin dans la ligne de commande c'est une simple actualisation
58                else {
59                        $plugins = $this->getPrefixesFromQuestion();
60                        if (!$plugins) {
61                                $this->getApplication()->showHelp('plugins:activer', $output);
62                                return;
63                        }
64                        $this->addTodo($plugins);
65                }
66                */
67
68
69                $liste_todo = $liste_complete = $this->getTodo();
70
71                // regardons ce qui est deja actif pour presenter une liste humaine et utile en affichant que ce qui sera active en plus
72                $actifs = array_column($this->getPluginsActifs(), 'prefixe');
73                if ($deja = array_intersect($actifs, $liste_complete)) {
74                        $liste_todo = array_diff($liste_complete, $actifs);
75                        if ($liste_todo) {
76                                $this->io->text("Certains préfixes demandés sont déjà actifs :");
77                                $this->presenterListe($deja);
78                                $this->io->text("Liste des plugins à activer :");
79                                $this->presenterListe($liste_todo);
80                        } else {
81                                $this->io->check("Tous les préfixes demandés sont déjà actifs");
82                                $this->presenterListe($liste_complete);
83                        }
84                }
85                elseif ($liste_complete) {
86                        $this->io->text("Liste des plugins à activer :");
87                        $this->presenterListe($liste_complete);
88                }
89
90                if ($liste_todo
91                        and !$input->getOption('yes')
92                        and !$this->io->confirm("Les plugins listés au-dessus seront activés. Confirmez-vous ?", false)
93                ) {
94                        $this->io->care("Action annulée");
95                        return;
96                }
97
98                // dans tous les cas on fait au moins un actualiserPlugins()
99                $this->actualiserPlugins();
100                if ($liste_complete) {
101                        // et on active ce qui doit etre active
102                        $this->activePlugins($liste_complete, $input->getOption('short'));
103                }
104                else {
105                        $this->io->check('Plugins actualisés');
106                }
107        }
108
109        /* Si pas de plugin(s) spécifiés, on demande */
110        public function getPrefixesFromQuestion() {
111                $inactifs = array_column($this->getPluginsInactifs(), 'prefixe');
112                $question = new Question("Quel plugin faut-il activer ?\n", 'help');
113                $question->setAutoCompleterValues($inactifs);
114                $reponse = trim($this->io->askQuestion($question));
115                if ($reponse === 'help') {
116                        return false;
117                }
118                return explode(' ', $reponse);
119        }
120
121        /**
122         * Chercher un fichier qui contient la liste des préfixes à activer
123         *
124         * En mutualisation, chercher de préférence un fichier relatif au site
125         *
126         * @param string $file
127         * @return string[]
128         * @throws \Exception
129         */
130        public function getPrefixesFromFile($file) {
131                if (
132                        $file
133                        and defined('_DIR_SITE')
134                        and is_file(_DIR_SITE . $file)
135                ) {
136                        $file = _DIR_SITE . $file;
137                } elseif (!is_file($file)) {
138                        throw new \Exception("File doesn't exists : " . $file);
139                }
140                $list = file_get_contents($file);
141                // soyons tolerant sur le format : on a une liste de prefixe, qui peuvent etre separes par des virgules, espaces ou retour ligne
142                // on accepte tous ces separateurs
143                $list = str_replace(array("\r", "\n", ",", "\t"), " ", $list);
144                $list = explode(' ', $list);
145                // et on enleve les valeurs vides (deux espaces, une ligne sautee...)
146                $list = array_filter($list);
147                return $list;
148        }
149
150        public function getPrefixesFromUrl($url) {
151                // si on a un fichier local/config.txt on le prend en priorite
152                exec("curl -L --silent $url/local/config.txt", $head);
153                $head = implode("\n", $head) . "\n";
154                if (!preg_match(",^Composed-By:(.*)\n,Uims", $head, $m)) {
155                        exec("curl -I -L --silent $url", $head);
156                        $head = implode("\n", $head);
157                }
158                if (preg_match(",^Composed-By:(.*)\n,Uims", $head, $m)) {
159                        // virer les numeros de version
160                        $liste = preg_replace(",\([^)]+\),", "", $m[1]);
161                        $liste = explode(",", $liste);
162                        $liste = array_map('trim', $liste);
163                        array_shift($liste);
164                }
165                return $liste;
166        }
167
168        public function addTodo(array $prefixes) {
169                $prefixes = array_map('trim', $prefixes);
170                $prefixes = array_map('strtolower', $prefixes);
171                $this->todo = array_unique(array_merge($this->todo, $prefixes));
172        }
173
174        public function getTodo() {
175                return $this->todo;
176        }
177
178        public function activePlugins($prefixes, $short = false) {
179                if (!is_array($prefixes)) {
180                        $prefixes = array();
181                }
182                $actifs = array_column($this->getPluginsActifs(), 'prefixe');
183
184                if ($deja = array_intersect($actifs, $prefixes)) {
185                        $prefixes = array_diff($prefixes, $actifs);
186                }
187                if (!$prefixes) {
188                        $this->io->care("Aucun prefixe à activer");
189                        return true;
190                }
191
192                $inactifs = $this->getPluginsInactifs();
193                $activer = [];
194                foreach ($inactifs as $plugin) {
195                        $prefixe = $plugin['prefixe'];
196                        if (in_array($prefixe, $prefixes)) {
197                                $activer[] = $plugin['dir'];
198                                $prefixes = array_diff($prefixes, [$prefixe]);
199                        }
200                }
201
202                if (count($prefixes)) {
203                        $this->io->fail("Certains préfixes demandés sont introuvables :");
204                        $this->presenterListe($prefixes);
205                }
206
207                if (count($activer)) {
208                        ecrire_plugin_actifs($activer, false, 'ajoute');
209                        $actifs = $this->getPluginsActifs(['procure' => false, 'php' => false]);
210                        $this->io->text("Plugins actifs après action :");
211                        $this->showPlugins($actifs, $short);
212                        $this->showPluginsErrors();
213                        $this->actualiserSVP();
214                }
215        }
216
217}
Note: See TracBrowser for help on using the repository browser.