aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/install/module_base.php
blob: 93c10bd656b9301805d334e1ee2fb348424863b1 (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
-rwxr-xr-xcron-sh/security.sh1
1 files changed, 1 insertions, 0 deletions
diff --git a/cron-sh/security.sh b/cron-sh/security.sh
index a846b41..2828f71 100755
--- a/cron-sh/security.sh
+++ b/cron-sh/security.sh
@@ -221,6 +221,7 @@ Maillog() {
/bin/mail -s "${subject}" "${MAIL_USER}" <<EOF
Nothing has changed since the last run.
EOF
+ fi
else
cat ${text} | /bin/mail -s "${subject}" "${MAIL_USER}"
fi
139' href='#n139'>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 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
<?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;

use phpbb\di\ordered_service_collection;
use phpbb\install\exception\resource_limit_reached_exception;
use phpbb\install\helper\config;
use phpbb\install\helper\iohandler\iohandler_interface;

/**
 * Base class for installer module
 */
abstract class module_base implements module_interface
{
	/**
	 * @var config
	 */
	protected $install_config;

	/**
	 * @var iohandler_interface
	 */
	protected $iohandler;

	/**
	 * @var bool
	 */
	protected $is_essential;

	/**
	 * Array of tasks for installer module
	 *
	 * @var ordered_service_collection
	 */
	protected $task_collection;

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

	/**
	 * @var bool
	 */
	protected $allow_progress_bar;

	/**
	 * Installer module constructor
	 *
	 * @param ordered_service_collection	$tasks				array of installer tasks for installer module
	 * @param bool							$essential			flag indicating whether the module is essential or not
	 * @param bool							$allow_progress_bar	flag indicating whether or not to send progress information from within the module
	 */
	public function __construct(ordered_service_collection $tasks, $essential = true, $allow_progress_bar = true)
	{
		$this->task_collection		= $tasks;
		$this->is_essential			= $essential;
		$this->allow_progress_bar	= $allow_progress_bar;
	}

	/**
	 * Dependency getter
	 *
	 * @param config				$config
	 * @param iohandler_interface	$iohandler
	 */
	public function setup(config $config, iohandler_interface $iohandler)
	{
		$this->install_config	= $config;
		$this->iohandler		= $iohandler;
	}

	/**
	 * {@inheritdoc}
	 */
	public function is_essential()
	{
		return $this->is_essential;
	}

	/**
	 * {@inheritdoc}
	 *
	 * Overwrite this method if your task is non-essential!
	 */
	public function check_requirements()
	{
		return true;
	}

	/**
	 * {@inheritdoc}
	 */
	public function run()
	{
		// Recover install progress
		$task_index	= $this->recover_progress();
		$iterator	= $this->task_collection->getIterator();

		if ($task_index < $iterator->count())
		{
			$iterator->seek($task_index);
		}
		else
		{
			$this->install_config->set_finished_task(0);
			return;
		}

		while ($iterator->valid())
		{
			$task = $iterator->current();
			$name = $iterator->key();

			// Check if we can run the task
			if (!$task->is_essential() && !$task->check_requirements())
			{
				$this->iohandler->add_log_message(array(
					'SKIP_TASK',
					$name,
				));

				$this->install_config->increment_current_task_progress($this->task_step_count[$name]);
			}
			else
			{
				// Send progress information
				if ($this->allow_progress_bar)
				{
					$this->iohandler->set_progress(
						$task->get_task_lang_name(),
						$this->install_config->get_current_task_progress()
					);

					$this->iohandler->send_response();
				}

				$task->run();

				if ($this->allow_progress_bar)
				{
					// Only increment progress by one, as if a task has more than one steps
					// then that should be incremented in the task itself
					$this->install_config->increment_current_task_progress();
				}
			}

			$task_index++;
			$this->install_config->set_finished_task($task_index);
			$iterator->next();

			// Send progress information
			if ($this->allow_progress_bar)
			{
				$this->iohandler->set_progress(
					$task->get_task_lang_name(),
					$this->install_config->get_current_task_progress()
				);
			}

			$this->iohandler->send_response();

			// Stop execution if resource limit is reached
			if ($iterator->valid() && ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0))
			{
				throw new resource_limit_reached_exception();
			}
		}

		// Module finished, so clear task progress
		$this->install_config->set_finished_task(0);
	}

	/**
	 * Returns the next task's name
	 *
	 * @return string	Index of the array element of the next task
	 */
	protected function recover_progress()
	{
		$progress_array = $this->install_config->get_progress_data();
		return $progress_array['last_task_index'];
	}

	/**
	 * {@inheritdoc}
	 */
	public function get_step_count()
	{
		$task_step_count = 0;
		$task_class_names = $this->task_collection->get_service_classes();

		foreach ($task_class_names as $name => $task_class)
		{
			$step_count = $task_class::get_step_count();
			$task_step_count += $step_count;
			$this->task_step_count[$name] = $step_count;
		}

		return $task_step_count;
	}
}