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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

installer.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 8.99 KiB


 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;
 015   
 016  use phpbb\cache\driver\driver_interface;
 017  use phpbb\di\ordered_service_collection;
 018  use phpbb\install\exception\cannot_build_container_exception;
 019  use phpbb\install\exception\installer_config_not_writable_exception;
 020  use phpbb\install\exception\jump_to_restart_point_exception;
 021  use phpbb\install\exception\resource_limit_reached_exception;
 022  use phpbb\install\exception\user_interaction_required_exception;
 023  use phpbb\install\helper\config;
 024  use phpbb\install\helper\container_factory;
 025  use phpbb\install\helper\iohandler\ajax_iohandler;
 026  use phpbb\install\helper\iohandler\cli_iohandler;
 027  use phpbb\install\helper\iohandler\iohandler_interface;
 028  use phpbb\path_helper;
 029   
 030  class installer
 031  {
 032      /**
 033       * @var driver_interface
 034       */
 035      protected $cache;
 036   
 037      /**
 038       * @var container_factory
 039       */
 040      protected $container_factory;
 041   
 042      /**
 043       * @var config
 044       */
 045      protected $install_config;
 046   
 047      /**
 048       * @var ordered_service_collection
 049       */
 050      protected $installer_modules;
 051   
 052      /**
 053       * @var iohandler_interface
 054       */
 055      protected $iohandler;
 056   
 057      /**
 058       * @var string
 059       */
 060      protected $web_root;
 061   
 062      /**
 063       * Stores the number of steps that a given module has
 064       *
 065       * @var array
 066       */
 067      protected $module_step_count;
 068   
 069      /**
 070       * @var bool
 071       */
 072      protected $purge_cache_before;
 073   
 074      /**
 075       * Constructor
 076       *
 077       * @param driver_interface    $cache            Cache service
 078       * @param config            $config            Installer config handler
 079       * @param path_helper        $path_helper    Path helper
 080       * @param container_factory    $container        Container
 081       */
 082      public function __construct(driver_interface $cache, config $config, path_helper $path_helper, container_factory $container)
 083      {
 084          $this->cache                = $cache;
 085          $this->install_config        = $config;
 086          $this->container_factory    = $container;
 087          $this->installer_modules    = null;
 088          $this->web_root                = $path_helper->get_web_root_path();
 089          $this->purge_cache_before    = false;
 090      }
 091   
 092      /**
 093       * Sets modules to execute
 094       *
 095       * Note: The installer will run modules in the order they are set in
 096       * the array.
 097       *
 098       * @param ordered_service_collection    $modules    Service collection of module service names
 099       */
 100      public function set_modules(ordered_service_collection $modules)
 101      {
 102          $this->installer_modules = $modules;
 103      }
 104   
 105      /**
 106       * Sets input-output handler objects
 107       *
 108       * @param iohandler_interface    $iohandler
 109       */
 110      public function set_iohandler(iohandler_interface $iohandler)
 111      {
 112          $this->iohandler = $iohandler;
 113      }
 114   
 115      /**
 116       * Sets whether to purge cache before the installation process
 117       *
 118       * @param bool    $purge_cache_before
 119       */
 120      public function set_purge_cache_before($purge_cache_before)
 121      {
 122          $this->purge_cache_before = $purge_cache_before;
 123      }
 124   
 125      /**
 126       * Run phpBB installer
 127       */
 128      public function run()
 129      {
 130          if ($this->iohandler instanceof ajax_iohandler)
 131          {
 132              $this->iohandler->acquire_lock();
 133          }
 134   
 135          // Load install progress
 136          $this->install_config->load_config();
 137   
 138          if (!$this->install_config->get('cache_purged_before', false) && $this->purge_cache_before)
 139          {
 140              /** @var \phpbb\cache\driver\driver_interface $cache */
 141              $cache = $this->container_factory->get('cache.driver');
 142              $cache->purge();
 143              $this->install_config->set('cache_purged_before', true);
 144          }
 145   
 146          // Recover install progress
 147          $module_index = $this->recover_progress();
 148   
 149          // Variable used to check if the install process have been finished
 150          $install_finished    = false;
 151          $fail_cleanup        = false;
 152          $send_refresh        = false;
 153   
 154          // We are installing something, so the introduction stage can go now...
 155          $this->install_config->set_finished_navigation_stage(array('install', 0, 'introduction'));
 156          $this->iohandler->set_finished_stage_menu(array('install', 0, 'introduction'));
 157   
 158          if ($this->install_config->get_task_progress_count() === 0)
 159          {
 160              // Count all tasks in the current installer modules
 161              $step_count = 0;
 162   
 163              /** @var \phpbb\install\module_interface $module */
 164              foreach ($this->installer_modules as $name => $module)
 165              {
 166                  $module_step_count = $module->get_step_count();
 167                  $step_count += $module_step_count;
 168                  $this->module_step_count[$name] = $module_step_count;
 169              }
 170   
 171              // Set task count
 172              $this->install_config->set_task_progress_count($step_count);
 173          }
 174   
 175          // Set up progress information
 176          $this->iohandler->set_task_count(
 177              $this->install_config->get_task_progress_count()
 178          );
 179   
 180          try
 181          {
 182              $iterator = $this->installer_modules->getIterator();
 183   
 184              if ($module_index < $iterator->count())
 185              {
 186                  $iterator->seek($module_index);
 187              }
 188              else
 189              {
 190                  $iterator->seek($module_index - 1);
 191                  $iterator->next();
 192              }
 193   
 194              while ($iterator->valid())
 195              {
 196                  $module    = $iterator->current();
 197                  $name    = $iterator->key();
 198   
 199                  // Check if module should be executed
 200                  if (!$module->is_essential() && !$module->check_requirements())
 201                  {
 202                      $this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
 203                      $this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
 204   
 205                      $this->iohandler->add_log_message(array(
 206                          'SKIP_MODULE',
 207                          $name,
 208                      ));
 209                      $this->install_config->increment_current_task_progress($this->module_step_count[$name]);
 210                  }
 211                  else
 212                  {
 213                      // Set the correct stage in the navigation bar
 214                      $this->install_config->set_active_navigation_stage($module->get_navigation_stage_path());
 215                      $this->iohandler->set_active_stage_menu($module->get_navigation_stage_path());
 216   
 217                      $this->iohandler->send_response();
 218   
 219                      $module->run();
 220   
 221                      $this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
 222                      $this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
 223                  }
 224   
 225                  $module_index++;
 226                  $iterator->next();
 227   
 228                  // Save progress
 229                  $this->install_config->set_active_module($name, $module_index);
 230   
 231                  if ($iterator->valid() && ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0))
 232                  {
 233                      throw new resource_limit_reached_exception();
 234                  }
 235              }
 236   
 237              // Installation finished
 238              $install_finished = true;
 239   
 240              if ($this->iohandler instanceof cli_iohandler)
 241              {
 242                  $this->iohandler->add_success_message('INSTALLER_FINISHED');
 243              }
 244              else
 245              {
 246                  // Start session if not installing and get user object
 247                  // to allow redirecting to ACP
 248                  $user = $this->container_factory->get('user');
 249                  if (!isset($module) || !($module instanceof \phpbb\install\module\install_finish\module))
 250                  {
 251                      $auth = $this->container_factory->get('auth');
 252   
 253                      $user->session_begin();
 254                      $auth->acl($user->data);
 255                      $user->setup();
 256                  }
 257   
 258                  $phpbb_root_path = $this->container_factory->get_parameter('core.root_path');
 259   
 260                  $acp_url = append_sid($phpbb_root_path . 'adm/index.php', 'i=acp_help_phpbb&mode=help_phpbb', true, $user->session_id);
 261                  $this->iohandler->add_success_message('INSTALLER_FINISHED', array(
 262                      'ACP_LINK',
 263                      $acp_url,
 264                  ));
 265              }
 266          }
 267          catch (user_interaction_required_exception $e)
 268          {
 269              $this->iohandler->send_response(true);
 270          }
 271          catch (resource_limit_reached_exception $e)
 272          {
 273              $send_refresh = true;
 274          }
 275          catch (jump_to_restart_point_exception $e)
 276          {
 277              $this->install_config->jump_to_restart_point($e->get_restart_point_name());
 278              $send_refresh = true;
 279          }
 280          catch (\Exception $e)
 281          {
 282              $this->iohandler->add_error_message($e->getMessage());
 283              $this->iohandler->send_response(true);
 284              $fail_cleanup = true;
 285          }
 286   
 287          if ($this->iohandler instanceof ajax_iohandler)
 288          {
 289              $this->iohandler->release_lock();
 290          }
 291   
 292          if ($install_finished)
 293          {
 294              // Send install finished message
 295              $this->iohandler->set_progress('INSTALLER_FINISHED', $this->install_config->get_task_progress_count());
 296              $this->iohandler->send_response(true);
 297          }
 298          else if ($send_refresh)
 299          {
 300              $this->iohandler->request_refresh();
 301              $this->iohandler->send_response(true);
 302          }
 303   
 304          // Save install progress
 305          try
 306          {
 307              if ($install_finished || $fail_cleanup)
 308              {
 309                  $this->install_config->clean_up_config_file();
 310                  $this->cache->purge();
 311   
 312                  try
 313                  {
 314                      /** @var \phpbb\cache\driver\driver_interface $cache */
 315                      $cache = $this->container_factory->get('cache.driver');
 316                      $cache->purge();
 317                  }
 318                  catch (cannot_build_container_exception $e)
 319                  {
 320                      // Do not do anything, this just means there is no config.php yet
 321                  }
 322              }
 323              else
 324              {
 325                  $this->install_config->save_config();
 326              }
 327          }
 328          catch (installer_config_not_writable_exception $e)
 329          {
 330              // It is allowed to fail this test during requirements testing
 331              $progress_data = $this->install_config->get_progress_data();
 332   
 333              if ($progress_data['last_task_module_name'] !== 'installer.module.requirements_install')
 334              {
 335                  $this->iohandler->add_error_message('INSTALLER_CONFIG_NOT_WRITABLE');
 336              }
 337          }
 338      }
 339   
 340      /**
 341       * Recover install progress
 342       *
 343       * @return string    Index of the next installer module to execute
 344       */
 345      protected function recover_progress()
 346      {
 347          $progress_array = $this->install_config->get_progress_data();
 348          return $progress_array['last_task_module_index'];
 349      }
 350  }
 351