aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/install/installer.php
blob: cb3dacfbe000fcd31ed9253a557caa723d0d1d64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
/**
 *
 * This file is part of the phpBB Forum Software package.
 *
 * @copyright (c) phpBB Limited <https://www.phpbb.com>
 * @license GNU General Public License, version 2 (GPL-2.0)
 *
 * For full copyright and license information, please see
 * the docs/CREDITS.txt file.
 *
 */

namespace phpbb\install;

class installer
{
	/**
	 * @var \Symfony\Component\DependencyInjection\ContainerInterface
	 */
	protected $container;

	/**
	 * @var \phpbb\install\helper\config
	 */
	protected $install_config;

	/**
	 * @var array
	 */
	protected $installer_modules;

	/**
	 * @var \phpbb\install\helper\iohandler\iohandler_interface
	 */
	protected $iohandler;

	/**
	 * Constructor
	 *
	 * @param \phpbb\install\helper\config	$config		Installer config handler
	 * @param \Symfony\Component\DependencyInjection\ContainerInterface	$container	Dependency injection container
	 */
	public function __construct(\phpbb\install\helper\config $config, \Symfony\Component\DependencyInjection\ContainerInterface $container)
	{
		$this->install_config		= $config;
		$this->container			= $container;
		$this->installer_modules	= array();
	}

	/**
	 * Sets modules to execute
	 *
	 * Note: The installer will run modules in the order they are set in
	 * the array.
	 *
	 * @param array	$modules	Array of module service names
	 */
	public function set_modules($modules)
	{
		$modules = (array) $modules;

		$this->installer_modules = $modules;
	}

	/**
	 * Sets input-output handler objects
	 *
	 * @param helper\iohandler\iohandler_interface	$iohandler
	 */
	public function set_iohandler(\phpbb\install\helper\iohandler\iohandler_interface $iohandler)
	{
		$this->iohandler = $iohandler;
	}

	/**
	 * Run phpBB installer
	 */
	public function run()
	{
		// Load install progress
		$this->install_config->load_config();

		// Recover install progress
		$module_index = $this->recover_progress();

		// Count all tasks in the current installer modules
		$task_count = 0;
		foreach ($this->installer_modules as $name)
		{
			/** @var \phpbb\install\module_interface $module */
			$module = $this->container->get($name);

			$task_count += $module->get_step_count();
		}

		// Set task count
		$this->install_config->set_task_progress_count($task_count);
		$this->iohandler->set_task_count($task_count);

		$install_finished = false;

		try
		{
			// Run until there are available resources
			while ($this->install_config->get_time_remaining() > 0 && $this->install_config->get_memory_remaining() > 0)
			{
				// Check if module exists, if not the install is completed
				if (!isset($this->installer_modules[$module_index]))
				{
					$install_finished = true;
					break;
				}

				// Log progress
				$module_service_name = $this->installer_modules[$module_index];
				$this->install_config->set_active_module($module_service_name, $module_index);

				// Get module from container
				/** @var \phpbb\install\module_interface $module */
				$module = $this->container->get($module_service_name);

				$module_index++;

				// Check if module should be executed
				if (!$module->is_essential() && !$module->check_requirements())
				{
					continue;
				}

				$module->run();

				// Clear task progress
				$this->install_config->set_finished_task('', 0);
			}

			if ($install_finished)
			{
				// Send install finished message
				$this->iohandler->set_progress('INSTALLER_FINISHED', $this->install_config->get_task_progress_count());
			}
			else
			{
				// @todo: Send refresh request
			}
		}
		catch (\phpbb\install\exception\user_interaction_required_exception $e)
		{
			// @todo handle exception
		}

		// Save install progress
		$this->install_config->save_config();
	}

	/**
	 * Recover install progress
	 *
	 * @return int	Index of the next installer module to execute
	 */
	protected function recover_progress()
	{
		$progress_array = $this->install_config->get_progress_data();
		$module_service = $progress_array['last_task_module_name'];
		$module_index = $progress_array['last_task_module_index'];

		if ($this->installer_modules[$module_index] === $module_service)
		{
			return $module_index;
		}

		return 0;
	}
}