[ Index ] |
PHP Cross Reference of phpBB-3.3.14-deutsch |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * 4 * This file is part of the phpBB Forum Software package. 5 * 6 * @copyright (c) phpBB Limited <https://www.phpbb.com> 7 * @license GNU General Public License, version 2 (GPL-2.0) 8 * 9 * For full copyright and license information, please see 10 * the docs/CREDITS.txt file. 11 * 12 */ 13 14 namespace phpbb\install\module\update_filesystem\task; 15 16 use phpbb\exception\runtime_exception; 17 use phpbb\install\exception\resource_limit_reached_exception; 18 use phpbb\install\helper\config; 19 use phpbb\install\helper\container_factory; 20 use phpbb\install\helper\file_updater\factory; 21 use phpbb\install\helper\file_updater\file_updater_interface; 22 use phpbb\install\helper\iohandler\iohandler_interface; 23 use phpbb\install\helper\update_helper; 24 use phpbb\install\task_base; 25 26 /** 27 * File updater task 28 */ 29 class update_files extends task_base 30 { 31 /** 32 * @var \phpbb\cache\driver\driver_interface 33 */ 34 protected $cache; 35 36 /** 37 * @var config 38 */ 39 protected $installer_config; 40 41 /** 42 * @var iohandler_interface 43 */ 44 protected $iohandler; 45 46 /** 47 * @var factory 48 */ 49 protected $factory; 50 51 /** 52 * @var file_updater_interface 53 */ 54 protected $file_updater; 55 56 /** 57 * @var update_helper 58 */ 59 protected $update_helper; 60 61 /** 62 * @var string 63 */ 64 protected $phpbb_root_path; 65 66 /** 67 * Constructor 68 * 69 * @param container_factory $container 70 * @param config $config 71 * @param iohandler_interface $iohandler 72 * @param factory $file_updater_factory 73 * @param update_helper $update_helper 74 * @param string $phpbb_root_path 75 */ 76 public function __construct(container_factory $container, config $config, iohandler_interface $iohandler, factory $file_updater_factory, update_helper $update_helper, $phpbb_root_path) 77 { 78 $this->factory = $file_updater_factory; 79 $this->installer_config = $config; 80 $this->iohandler = $iohandler; 81 $this->update_helper = $update_helper; 82 $this->phpbb_root_path = $phpbb_root_path; 83 84 $this->cache = $container->get('cache.driver'); 85 $this->file_updater = null; 86 87 parent::__construct(false); 88 } 89 90 /** 91 * {@inheritdoc} 92 */ 93 public function check_requirements() 94 { 95 return $this->installer_config->get('do_update_files', false); 96 } 97 98 /** 99 * {@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 $cache_diff_filename = '_file_' . md5($path); 176 if ($this->cache->_exists($cache_diff_filename)) 177 { 178 $this->file_updater->update_file( 179 $path, 180 base64_decode($this->cache->get($cache_diff_filename)), 181 true 182 ); 183 } 184 break; 185 } 186 187 // Save progress 188 $this->installer_config->set('file_updater_type_progress', $type); 189 $this->installer_config->set('file_updater_elem_progress', $path); 190 $progress_count++; 191 $this->iohandler->set_progress('UPDATE_UPDATING_FILES', $progress_count); 192 193 if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) 194 { 195 // Request refresh 196 throw new resource_limit_reached_exception(); 197 } 198 } 199 } 200 201 $this->iohandler->finish_progress('UPDATE_UPDATING_FILES'); 202 } 203 catch (runtime_exception $e) 204 { 205 if ($e instanceof resource_limit_reached_exception) 206 { 207 throw new resource_limit_reached_exception(); 208 } 209 210 $current_method = $this->installer_config->get('file_update_method', ''); 211 212 // File updater failed, try to fallback to download file update mode 213 if ($current_method !== 'compression') 214 { 215 $this->iohandler->add_warning_message(array( 216 'UPDATE_FILE_UPDATER_HAS_FAILED', 217 $current_method, 218 'compression' 219 )); 220 $this->installer_config->set('file_update_method', 'compression'); 221 222 // We only want a simple refresh here 223 throw new resource_limit_reached_exception(); 224 } 225 else 226 { 227 // Nowhere to fallback to :( 228 // Due to the way the installer handles fatal errors, we need to throw a low level exception 229 throw new runtime_exception('UPDATE_FILE_UPDATERS_HAVE_FAILED'); 230 } 231 } 232 233 $file_updater_method = $this->installer_config->get('file_update_method', ''); 234 if ($file_updater_method === 'compression' || $file_updater_method === 'ftp') 235 { 236 $this->file_updater->close(); 237 } 238 } 239 240 /** 241 * Get file updater 242 * 243 * @param null|string $file_updater_method Name of the file updater to use 244 * 245 * @return file_updater_interface File updater 246 */ 247 protected function get_file_updater($file_updater_method = null) 248 { 249 $file_updater_method = ($file_updater_method === null) ? $this->installer_config->get('file_update_method', '') : $file_updater_method; 250 251 if ($file_updater_method === 'compression') 252 { 253 $compression_method = $this->installer_config->get('file_update_compression', ''); 254 255 /** @var \phpbb\install\helper\file_updater\compression_file_updater $file_updater */ 256 $file_updater = $this->factory->get('compression'); 257 $archive_path = $file_updater->init($compression_method); 258 $this->installer_config->set('update_file_archive', $archive_path); 259 } 260 else if ($file_updater_method === 'ftp') 261 { 262 /** @var \phpbb\install\helper\file_updater\ftp_file_updater $file_updater */ 263 $file_updater = $this->factory->get('ftp'); 264 $file_updater->init( 265 $this->installer_config->get('ftp_method', ''), 266 $this->installer_config->get('ftp_host', ''), 267 $this->installer_config->get('ftp_user', ''), 268 $this->installer_config->get('ftp_pass', ''), 269 $this->installer_config->get('ftp_path', ''), 270 $this->installer_config->get('ftp_port', 0), 271 $this->installer_config->get('ftp_timeout', 10) 272 ); 273 } 274 else 275 { 276 /** @var file_updater_interface $file_updater */ 277 $file_updater = $this->factory->get('direct_file'); 278 } 279 280 return $file_updater; 281 } 282 283 /** 284 * {@inheritdoc} 285 */ 286 static public function get_step_count() 287 { 288 return 0; 289 } 290 291 /** 292 * {@inheritdoc} 293 */ 294 public function get_task_lang_name() 295 { 296 return ''; 297 } 298 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Mon Nov 25 19:05:08 2024 | Cross-referenced by PHPXref 0.7.1 |