Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
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 |
update_files.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\install\module\update_filesystem\task;
015
016 use phpbb\exception\runtime_exception;
017 use phpbb\install\exception\resource_limit_reached_exception;
018 use phpbb\install\helper\config;
019 use phpbb\install\helper\container_factory;
020 use phpbb\install\helper\file_updater\factory;
021 use phpbb\install\helper\file_updater\file_updater_interface;
022 use phpbb\install\helper\iohandler\iohandler_interface;
023 use phpbb\install\helper\update_helper;
024 use phpbb\install\task_base;
025
026 /**
027 * File updater task
028 */
029 class update_files extends task_base
030 {
031 /**
032 * @var \phpbb\cache\driver\driver_interface
033 */
034 protected $cache;
035
036 /**
037 * @var config
038 */
039 protected $installer_config;
040
041 /**
042 * @var iohandler_interface
043 */
044 protected $iohandler;
045
046 /**
047 * @var factory
048 */
049 protected $factory;
050
051 /**
052 * @var file_updater_interface
053 */
054 protected $file_updater;
055
056 /**
057 * @var update_helper
058 */
059 protected $update_helper;
060
061 /**
062 * @var string
063 */
064 protected $phpbb_root_path;
065
066 /**
067 * Constructor
068 *
069 * @param container_factory $container
070 * @param config $config
071 * @param iohandler_interface $iohandler
072 * @param factory $file_updater_factory
073 * @param update_helper $update_helper
074 * @param string $phpbb_root_path
075 */
076 public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, factory $file_updater_factory, update_helper $update_helper, $phpbb_root_path)
077 {
078 $this->factory = $file_updater_factory;
079 $this->installer_config = $config;
080 $this->iohandler = $iohandler;
081 $this->update_helper = $update_helper;
082 $this->phpbb_root_path = $phpbb_root_path;
083
084 $this->cache = $container->get('cache.driver');
085 $this->file_updater = null;
086
087 parent::__construct(false);
088 }
089
090 /**
091 * {@inheritdoc}
092 */
093 public function check_requirements()
094 {
095 return $this->installer_config->get('do_update_files', false);
096 }
097
098 /**
099 * {@inheritdoc}
100 */
101 public function run()
102 {
103 $new_path = $this->update_helper->get_path_to_new_update_files();
104
105 $file_update_info = $this->installer_config->get('update_files', array());
106
107 $update_type_progress = $this->installer_config->get('file_updater_type_progress', '');
108 $update_elem_progress = $this->installer_config->get('file_updater_elem_progress', '');
109 $type_progress_found = false;
110 $elem_progress_found = false;
111
112 // Progress bar
113 $task_count = 0;
114 foreach ($file_update_info as $sub_array)
115 {
116 $task_count += count($sub_array);
117 }
118
119 // Everything is up to date, so just continue
120 if ($task_count === 0)
121 {
122 return;
123 }
124
125 $progress_count = $this->installer_config->get('file_update_progress_count', 0);
126 $this->iohandler->set_task_count($task_count, true);
127 $this->iohandler->set_progress('UPDATE_UPDATING_FILES', 0);
128
129 $this->file_updater = $this->get_file_updater();
130
131 // File updater fallback logic
132 try
133 {
134 // Update files
135 foreach ($file_update_info as $type => $file_update_vector)
136 {
137 if (!$type_progress_found)
138 {
139 if ($type === $update_type_progress || empty($update_elem_progress))
140 {
141 $type_progress_found = true;
142 }
143 else
144 {
145 continue;
146 }
147 }
148
149 foreach ($file_update_vector as $path)
150 {
151 if (!$elem_progress_found)
152 {
153 if ($path === $update_elem_progress || empty($update_elem_progress))
154 {
155 $elem_progress_found = true;
156 }
157 else
158 {
159 continue;
160 }
161 }
162
163 switch ($type)
164 {
165 case 'delete':
166 $this->file_updater->delete_file($path);
167 break;
168 case 'new':
169 $this->file_updater->create_new_file($path, $new_path . $path);
170 break;
171 case 'update_without_diff':
172 $this->file_updater->update_file($path, $new_path . $path);
173 break;
174 case 'update_with_diff':
175 $this->file_updater->update_file(
176 $path,
177 base64_decode($this->cache->get('_file_' . md5($path))),
178 true
179 );
180 break;
181 }
182
183 // Save progress
184 $this->installer_config->set('file_updater_type_progress', $type);
185 $this->installer_config->set('file_updater_elem_progress', $path);
186 $progress_count++;
187 $this->iohandler->set_progress('UPDATE_UPDATING_FILES', $progress_count);
188
189 if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0)
190 {
191 // Request refresh
192 throw new resource_limit_reached_exception();
193 }
194 }
195 }
196
197 $this->iohandler->finish_progress('UPDATE_UPDATING_FILES');
198 }
199 catch (runtime_exception $e)
200 {
201 if ($e instanceof resource_limit_reached_exception)
202 {
203 throw new resource_limit_reached_exception();
204 }
205
206 $current_method = $this->installer_config->get('file_update_method', '');
207
208 // File updater failed, try to fallback to download file update mode
209 if ($current_method !== 'compression')
210 {
211 $this->iohandler->add_warning_message(array(
212 'UPDATE_FILE_UPDATER_HAS_FAILED',
213 $current_method,
214 'compression'
215 ));
216 $this->installer_config->set('file_update_method', 'compression');
217
218 // We only want a simple refresh here
219 throw new resource_limit_reached_exception();
220 }
221 else
222 {
223 // Nowhere to fallback to :(
224 // Due to the way the installer handles fatal errors, we need to throw a low level exception
225 throw new runtime_exception('UPDATE_FILE_UPDATERS_HAVE_FAILED');
226 }
227 }
228
229 $file_updater_method = $this->installer_config->get('file_update_method', '');
230 if ($file_updater_method === 'compression' || $file_updater_method === 'ftp')
231 {
232 $this->file_updater->close();
233 }
234 }
235
236 /**
237 * Get file updater
238 *
239 * @param null|string $file_updater_method Name of the file updater to use
240 *
241 * @return file_updater_interface File updater
242 */
243 protected function get_file_updater($file_updater_method = null)
244 {
245 $file_updater_method = ($file_updater_method === null) ? $this->installer_config->get('file_update_method', '') : $file_updater_method;
246
247 if ($file_updater_method === 'compression')
248 {
249 $compression_method = $this->installer_config->get('file_update_compression', '');
250
251 /** @var \phpbb\install\helper\file_updater\compression_file_updater $file_updater */
252 $file_updater = $this->factory->get('compression');
253 $archive_path = $file_updater->init($compression_method);
254 $this->installer_config->set('update_file_archive', $archive_path);
255 }
256 else if ($file_updater_method === 'ftp')
257 {
258 /** @var \phpbb\install\helper\file_updater\ftp_file_updater $file_updater */
259 $file_updater = $this->factory->get('ftp');
260 $file_updater->init(
261 $this->installer_config->get('ftp_method', ''),
262 $this->installer_config->get('ftp_host', ''),
263 $this->installer_config->get('ftp_user', ''),
264 $this->installer_config->get('ftp_pass', ''),
265 $this->installer_config->get('ftp_path', ''),
266 $this->installer_config->get('ftp_port', 0),
267 $this->installer_config->get('ftp_timeout', 10)
268 );
269 }
270 else
271 {
272 /** @var file_updater_interface $file_updater */
273 $file_updater = $this->factory->get('direct_file');
274 }
275
276 return $file_updater;
277 }
278
279 /**
280 * {@inheritdoc}
281 */
282 static public function get_step_count()
283 {
284 return 0;
285 }
286
287 /**
288 * {@inheritdoc}
289 */
290 public function get_task_lang_name()
291 {
292 return '';
293 }
294 }
295