Verzeichnisstruktur phpBB-3.3.15
- Veröffentlicht
- 28.08.2024
So funktioniert es
|
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
check.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\console\command\update;
015
016 use phpbb\config\config;
017 use phpbb\exception\exception_interface;
018 use phpbb\language\language;
019 use phpbb\user;
020 use Symfony\Component\Console\Input\InputInterface;
021 use Symfony\Component\Console\Input\InputArgument;
022 use Symfony\Component\Console\Input\InputOption;
023 use Symfony\Component\Console\Output\OutputInterface;
024 use Symfony\Component\Console\Style\SymfonyStyle;
025 use Symfony\Component\DependencyInjection\ContainerInterface;
026
027 class check extends \phpbb\console\command\command
028 {
029 /** @var config */
030 protected $config;
031
032 /** @var \Symfony\Component\DependencyInjection\ContainerBuilder */
033 protected $phpbb_container;
034
035 /**
036 * @var language
037 */
038 private $language;
039
040 /**
041 * Construct method
042 */
043 public function __construct(user $user, config $config, ContainerInterface $phpbb_container, language $language)
044 {
045 $this->config = $config;
046 $this->phpbb_container = $phpbb_container;
047 $this->language = $language;
048
049 $this->language->add_lang(array('acp/common', 'acp/extensions'));
050
051 parent::__construct($user);
052 }
053
054 /**
055 * Configures the service.
056 *
057 * Sets the name and description of the command.
058 *
059 * @return null
060 */
061 protected function configure()
062 {
063 $this
064 ->setName('update:check')
065 ->setDescription($this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK'))
066 ->addArgument('ext-name', InputArgument::OPTIONAL, $this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK_ARGUMENT_1'))
067 ->addOption('stability', null, InputOption::VALUE_REQUIRED, $this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK_OPTION_STABILITY'))
068 ->addOption('cache', 'c', InputOption::VALUE_NONE, $this->language->lang('CLI_DESCRIPTION_UPDATE_CHECK_OPTION_CACHE'))
069 ;
070 }
071
072 /**
073 * Executes the command.
074 *
075 * Checks if an update is available.
076 * If at least one is available, a message is printed and if verbose mode is set the list of possible updates is printed.
077 * If their is none, nothing is printed unless verbose mode is set.
078 *
079 * @param InputInterface $input Input stream, used to get the options.
080 * @param OutputInterface $output Output stream, used to print messages.
081 * @return int 0 if the board is up to date, 1 if it is not and 2 if an error occurred.
082 * @throws \RuntimeException
083 */
084 protected function execute(InputInterface $input, OutputInterface $output)
085 {
086 $io = new SymfonyStyle($input, $output);
087
088 $recheck = true;
089 if ($input->getOption('cache'))
090 {
091 $recheck = false;
092 }
093
094 $stability = null;
095 if ($input->getOption('stability'))
096 {
097 $stability = $input->getOption('stability');
098 if (!($stability == 'stable') && !($stability == 'unstable'))
099 {
100 $io->error($this->language->lang('CLI_ERROR_INVALID_STABILITY', $stability));
101 return 3;
102 }
103 }
104
105 $ext_name = $input->getArgument('ext-name');
106 if ($ext_name != null)
107 {
108 if ($ext_name == 'all')
109 {
110 return $this->check_all_ext($io, $stability, $recheck);
111 }
112 else
113 {
114 return $this->check_ext($input, $io, $stability, $recheck, $ext_name);
115 }
116 }
117 else
118 {
119 return $this->check_core($input, $io, $stability, $recheck);
120 }
121 }
122
123 /**
124 * Check if a given extension is up to date
125 *
126 * @param InputInterface $input Input stream, used to get the options.
127 * @param SymfonyStyle $io IO handler, for formatted and unified IO
128 * @param string $stability Force a given stability
129 * @param bool $recheck Disallow the use of the cache
130 * @param string $ext_name The extension name
131 * @return int
132 */
133 protected function check_ext(InputInterface $input, SymfonyStyle $io, $stability, $recheck, $ext_name)
134 {
135 try
136 {
137 $ext_manager = $this->phpbb_container->get('ext.manager');
138 $md_manager = $ext_manager->create_extension_metadata_manager($ext_name);
139 $updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability);
140
141 $metadata = $md_manager->get_metadata('all');
142 if ($input->getOption('verbose'))
143 {
144 $io->title($md_manager->get_metadata('display-name'));
145
146 $io->note($this->language->lang('CURRENT_VERSION') . $this->language->lang('COLON') . ' ' . $metadata['version']);
147 }
148
149 if (!empty($updates_available))
150 {
151 if ($input->getOption('verbose'))
152 {
153 $io->caution($this->language->lang('NOT_UP_TO_DATE', $metadata['name']));
154
155 $this->display_versions($io, $updates_available);
156 }
157
158 return 1;
159 }
160 else
161 {
162 if ($input->getOption('verbose'))
163 {
164 $io->success($this->language->lang('UPDATE_NOT_NEEDED'));
165 }
166
167 return 0;
168 }
169 }
170 catch (\RuntimeException $e)
171 {
172 $io->error($this->language->lang('EXTENSION_NOT_INSTALLED', $ext_name));
173
174 return 1;
175 }
176 }
177
178 /**
179 * Check if the core is up to date
180 *
181 * @param InputInterface $input Input stream, used to get the options.
182 * @param SymfonyStyle $io IO handler, for formatted and unified IO
183 * @param string $stability Force a given stability
184 * @param bool $recheck Disallow the use of the cache
185 * @return int
186 */
187 protected function check_core(InputInterface $input, SymfonyStyle $io, $stability, $recheck)
188 {
189 $version_helper = $this->phpbb_container->get('version_helper');
190 $version_helper->force_stability($stability);
191
192 $updates_available = $version_helper->get_suggested_updates($recheck);
193
194 if ($input->getOption('verbose'))
195 {
196 $io->title('phpBB core');
197
198 $io->note( $this->language->lang('CURRENT_VERSION') . $this->language->lang('COLON') . ' ' . $this->config['version']);
199 }
200
201 if (!empty($updates_available))
202 {
203 $io->caution($this->language->lang('UPDATE_NEEDED'));
204
205 if ($input->getOption('verbose'))
206 {
207 $this->display_versions($io, $updates_available);
208 }
209
210 return 1;
211 }
212 else
213 {
214 if ($input->getOption('verbose'))
215 {
216 $io->success($this->language->lang('UPDATE_NOT_NEEDED'));
217 }
218
219 return 0;
220 }
221 }
222
223 /**
224 * Check if all the available extensions are up to date
225 *
226 * @param SymfonyStyle $io IO handler, for formatted and unified IO
227 * @param string $stability Stability specifier string
228 * @param bool $recheck Disallow the use of the cache
229 * @return int
230 */
231 protected function check_all_ext(SymfonyStyle $io, $stability, $recheck)
232 {
233 /** @var \phpbb\extension\manager $ext_manager */
234 $ext_manager = $this->phpbb_container->get('ext.manager');
235
236 $rows = [];
237
238 foreach ($ext_manager->all_available() as $ext_name => $ext_path)
239 {
240 $row = [];
241 $row[] = sprintf("<info>%s</info>", $ext_name);
242 $md_manager = $ext_manager->create_extension_metadata_manager($ext_name);
243 try
244 {
245 $metadata = $md_manager->get_metadata('all');
246 if (isset($metadata['extra']['version-check']))
247 {
248 try {
249 $updates_available = $ext_manager->version_check($md_manager, $recheck, false, $stability);
250 if (!empty($updates_available))
251 {
252 $versions = array_map(function($entry)
253 {
254 return $entry['current'];
255 }, $updates_available);
256
257 $row[] = sprintf("<comment>%s</comment>", $metadata['version']);
258 $row[] = implode(', ', $versions);
259 }
260 else
261 {
262 $row[] = sprintf("<info>%s</info>", $metadata['version']);
263 $row[] = '';
264 }
265 } catch (\RuntimeException $e) {
266 $row[] = $metadata['version'];
267 $row[] = '';
268 }
269 }
270 else
271 {
272 $row[] = $metadata['version'];
273 $row[] = '';
274 }
275 }
276 catch (exception_interface $e)
277 {
278 $exception_message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
279 $row[] = '<error>' . $exception_message . '</error>';
280 }
281 catch (\RuntimeException $e)
282 {
283 $row[] = '<error>' . $e->getMessage() . '</error>';
284 }
285
286 $rows[] = $row;
287 }
288
289 $io->table([
290 $this->language->lang('EXTENSION_NAME'),
291 $this->language->lang('CURRENT_VERSION'),
292 $this->language->lang('LATEST_VERSION'),
293 ], $rows);
294
295 return 0;
296 }
297
298 /**
299 * Display the details of the available updates
300 *
301 * @param SymfonyStyle $io IO handler, for formatted and unified IO
302 * @param array $updates_available The list of the available updates
303 */
304 protected function display_versions(SymfonyStyle $io, $updates_available)
305 {
306 $io->section($this->language->lang('UPDATES_AVAILABLE'));
307
308 $rows = [];
309 foreach ($updates_available as $version_data)
310 {
311 $row = ['', '', ''];
312 $row[0] = $version_data['current'];
313
314 if (isset($version_data['announcement']))
315 {
316 $row[1] = $version_data['announcement'];
317 }
318
319 if (isset($version_data['download']))
320 {
321 $row[2] = $version_data['download'];
322 }
323
324 $rows[] = $row;
325 }
326
327 $io->table([
328 $this->language->lang('VERSION'),
329 $this->language->lang('ANNOUNCEMENT_TOPIC'),
330 $this->language->lang('DOWNLOAD_LATEST'),
331 ], $rows);
332 }
333 }
334