1 |
efrain |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
// This file is part of Moodle - http://moodle.org/
|
|
|
4 |
//
|
|
|
5 |
// Moodle is free software: you can redistribute it and/or modify
|
|
|
6 |
// it under the terms of the GNU General Public License as published by
|
|
|
7 |
// the Free Software Foundation, either version 3 of the License, or
|
|
|
8 |
// (at your option) any later version.
|
|
|
9 |
//
|
|
|
10 |
// Moodle is distributed in the hope that it will be useful,
|
|
|
11 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
12 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
13 |
// GNU General Public License for more details.
|
|
|
14 |
//
|
|
|
15 |
// You should have received a copy of the GNU General Public License
|
|
|
16 |
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
17 |
|
|
|
18 |
/**
|
|
|
19 |
* This script creates config.php file and prepares database.
|
|
|
20 |
*
|
|
|
21 |
* This script is not intended for beginners!
|
|
|
22 |
* Potential problems:
|
|
|
23 |
* - su to apache account or sudo before execution
|
|
|
24 |
* - not compatible with Windows platform
|
|
|
25 |
*
|
|
|
26 |
* @package core
|
|
|
27 |
* @subpackage cli
|
|
|
28 |
* @copyright 2009 Petr Skoda (http://skodak.org)
|
|
|
29 |
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
|
30 |
*/
|
|
|
31 |
|
|
|
32 |
define('CLI_SCRIPT', true);
|
|
|
33 |
|
|
|
34 |
// extra execution prevention - we can not just require config.php here
|
|
|
35 |
if (isset($_SERVER['REMOTE_ADDR'])) {
|
|
|
36 |
exit(1);
|
|
|
37 |
}
|
|
|
38 |
|
|
|
39 |
// Force OPcache reset if used, we do not want any stale caches
|
|
|
40 |
// when preparing test environment.
|
|
|
41 |
if (function_exists('opcache_reset')) {
|
|
|
42 |
opcache_reset();
|
|
|
43 |
}
|
|
|
44 |
|
|
|
45 |
$help =
|
|
|
46 |
"Command line Moodle installer, creates config.php and initializes database.
|
|
|
47 |
Please note you must execute this script with the same uid as apache
|
|
|
48 |
or use chmod/chown after installation.
|
|
|
49 |
|
|
|
50 |
Site defaults may be changed via local/defaults.php.
|
|
|
51 |
|
|
|
52 |
Options:
|
|
|
53 |
--chmod=OCTAL-MODE Permissions of new directories created within dataroot.
|
|
|
54 |
Default is 2777. You may want to change it to 2770
|
|
|
55 |
or 2750 or 750. See chmod man page for details.
|
|
|
56 |
--lang=CODE Installation and default site language.
|
|
|
57 |
--wwwroot=URL Web address for the Moodle site,
|
|
|
58 |
required in non-interactive mode.
|
|
|
59 |
--dataroot=DIR Location of the moodle data folder,
|
|
|
60 |
must not be web accessible. Default is moodledata
|
|
|
61 |
in the parent directory.
|
|
|
62 |
--dbtype=TYPE Database type. Default is mysqli
|
|
|
63 |
--dbhost=HOST Database host. Default is localhost
|
|
|
64 |
--dbname=NAME Database name. Default is moodle
|
|
|
65 |
--dbuser=USERNAME Database user. Default is root
|
|
|
66 |
--dbpass=PASSWORD Database password. Default is blank
|
|
|
67 |
--dbport=NUMBER Use database port.
|
|
|
68 |
--dbsocket=PATH Use database socket, 1 means default. Available for some databases only.
|
|
|
69 |
--prefix=STRING Table prefix for above database tables. Default is mdl_
|
|
|
70 |
--fullname=STRING The fullname of the site
|
|
|
71 |
--shortname=STRING The shortname of the site
|
|
|
72 |
--summary=STRING The summary to be displayed on the front page
|
|
|
73 |
--adminuser=USERNAME Username for the moodle admin account. Default is admin
|
|
|
74 |
--adminpass=PASSWORD Password for the moodle admin account,
|
|
|
75 |
required in non-interactive mode.
|
|
|
76 |
--adminemail=STRING Email address for the moodle admin account.
|
|
|
77 |
--sitepreset=STRING Admin site preset to be applied during the installation process.
|
|
|
78 |
--supportemail=STRING Email address for support and help.
|
|
|
79 |
--upgradekey=STRING The upgrade key to be set in the config.php, leave empty to not set it.
|
|
|
80 |
--non-interactive No interactive questions, installation fails if any
|
|
|
81 |
problem encountered.
|
|
|
82 |
--agree-license Indicates agreement with software license,
|
|
|
83 |
required in non-interactive mode.
|
|
|
84 |
--allow-unstable Install even if the version is not marked as stable yet,
|
|
|
85 |
required in non-interactive mode.
|
|
|
86 |
--skip-database Stop the installation before installing the database.
|
|
|
87 |
-h, --help Print out this help
|
|
|
88 |
|
|
|
89 |
Example:
|
|
|
90 |
\$sudo -u www-data /usr/bin/php admin/cli/install.php --lang=cs
|
|
|
91 |
"; //TODO: localize, mark as needed in install - to be translated later when everything is finished
|
|
|
92 |
|
|
|
93 |
|
|
|
94 |
// distro specific customisation
|
|
|
95 |
$distrolibfile = __DIR__.'/../../install/distrolib.php';
|
|
|
96 |
$distro = null;
|
|
|
97 |
if (file_exists($distrolibfile)) {
|
|
|
98 |
require_once($distrolibfile);
|
|
|
99 |
if (function_exists('distro_get_config')) {
|
|
|
100 |
$distro = distro_get_config();
|
|
|
101 |
}
|
|
|
102 |
}
|
|
|
103 |
|
|
|
104 |
// Nothing to do if config.php exists
|
|
|
105 |
$configfile = __DIR__.'/../../config.php';
|
|
|
106 |
if (file_exists($configfile)) {
|
|
|
107 |
require($configfile);
|
|
|
108 |
require_once($CFG->libdir.'/clilib.php');
|
|
|
109 |
list($options, $unrecognized) = cli_get_params(array('help'=>false), array('h'=>'help'));
|
|
|
110 |
|
|
|
111 |
if ($options['help']) {
|
|
|
112 |
echo $help;
|
|
|
113 |
echo "\n\n";
|
|
|
114 |
}
|
|
|
115 |
|
|
|
116 |
if ($DB->get_manager()->table_exists('config')) {
|
|
|
117 |
cli_error(get_string('clialreadyinstalled', 'install'));
|
|
|
118 |
} else {
|
|
|
119 |
cli_error(get_string('clialreadyconfigured', 'install'));
|
|
|
120 |
}
|
|
|
121 |
}
|
|
|
122 |
|
|
|
123 |
$olddir = getcwd();
|
|
|
124 |
|
|
|
125 |
// change directory so that includes below work properly
|
|
|
126 |
chdir(dirname($_SERVER['argv'][0]));
|
|
|
127 |
|
|
|
128 |
// Servers should define a default timezone in php.ini, but if they don't then make sure something is defined.
|
|
|
129 |
if (!function_exists('date_default_timezone_set') or !function_exists('date_default_timezone_get')) {
|
|
|
130 |
fwrite(STDERR, "Timezone functions are not available.\n");
|
|
|
131 |
exit(1);
|
|
|
132 |
}
|
|
|
133 |
date_default_timezone_set(@date_default_timezone_get());
|
|
|
134 |
|
|
|
135 |
// make sure PHP errors are displayed - helps with diagnosing of problems
|
|
|
136 |
@error_reporting(E_ALL);
|
|
|
137 |
@ini_set('display_errors', '1');
|
|
|
138 |
// we need a lot of memory
|
|
|
139 |
@ini_set('memory_limit', '128M');
|
|
|
140 |
|
|
|
141 |
/** Used by library scripts to check they are being called by Moodle */
|
|
|
142 |
define('MOODLE_INTERNAL', true);
|
|
|
143 |
|
|
|
144 |
// Disables all caching.
|
|
|
145 |
define('CACHE_DISABLE_ALL', true);
|
|
|
146 |
|
|
|
147 |
define('PHPUNIT_TEST', false);
|
|
|
148 |
|
|
|
149 |
define('IGNORE_COMPONENT_CACHE', true);
|
|
|
150 |
|
|
|
151 |
// Check that PHP is of a sufficient version as soon as possible.
|
|
|
152 |
require_once(__DIR__.'/../../lib/phpminimumversionlib.php');
|
|
|
153 |
moodle_require_minimum_php_version();
|
|
|
154 |
|
|
|
155 |
// set up configuration
|
|
|
156 |
global $CFG;
|
|
|
157 |
$CFG = new stdClass();
|
|
|
158 |
$CFG->lang = 'en';
|
|
|
159 |
$CFG->dirroot = dirname(dirname(__DIR__));
|
|
|
160 |
$CFG->libdir = "$CFG->dirroot/lib";
|
|
|
161 |
$CFG->wwwroot = "http://localhost";
|
|
|
162 |
$CFG->httpswwwroot = $CFG->wwwroot;
|
|
|
163 |
$CFG->docroot = 'http://docs.moodle.org';
|
|
|
164 |
$CFG->running_installer = true;
|
|
|
165 |
$CFG->early_install_lang = true;
|
|
|
166 |
$CFG->ostype = (stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'darwin')) ? 'WINDOWS' : 'UNIX';
|
|
|
167 |
$CFG->dboptions = array();
|
|
|
168 |
$CFG->debug = (E_ALL | E_STRICT);
|
|
|
169 |
$CFG->debugdisplay = true;
|
|
|
170 |
$CFG->debugdeveloper = true;
|
|
|
171 |
|
|
|
172 |
$parts = explode('/', str_replace('\\', '/', dirname(__DIR__)));
|
|
|
173 |
$CFG->admin = array_pop($parts);
|
|
|
174 |
|
|
|
175 |
//point pear include path to moodles lib/pear so that includes and requires will search there for files before anywhere else
|
|
|
176 |
//the problem is that we need specific version of quickforms and hacked excel files :-(
|
|
|
177 |
ini_set('include_path', $CFG->libdir.'/pear' . PATH_SEPARATOR . ini_get('include_path'));
|
|
|
178 |
|
|
|
179 |
require_once($CFG->libdir.'/classes/component.php');
|
|
|
180 |
require_once($CFG->libdir.'/classes/text.php');
|
|
|
181 |
require_once($CFG->libdir.'/classes/string_manager.php');
|
|
|
182 |
require_once($CFG->libdir.'/classes/string_manager_install.php');
|
|
|
183 |
require_once($CFG->libdir.'/classes/string_manager_standard.php');
|
|
|
184 |
require_once($CFG->libdir.'/installlib.php');
|
|
|
185 |
require_once($CFG->libdir.'/clilib.php');
|
|
|
186 |
require_once($CFG->libdir.'/setuplib.php');
|
|
|
187 |
require_once($CFG->libdir.'/weblib.php');
|
|
|
188 |
require_once($CFG->libdir.'/dmllib.php');
|
|
|
189 |
require_once($CFG->libdir.'/moodlelib.php');
|
|
|
190 |
require_once($CFG->libdir.'/deprecatedlib.php');
|
|
|
191 |
require_once($CFG->libdir.'/adminlib.php');
|
|
|
192 |
require_once($CFG->libdir.'/componentlib.class.php');
|
|
|
193 |
require_once($CFG->dirroot.'/cache/lib.php');
|
|
|
194 |
|
|
|
195 |
// Register our classloader, in theory somebody might want to replace it to load other hacked core classes.
|
|
|
196 |
// Required because the database checks below lead to session interaction which is going to lead us to requiring autoloaded classes.
|
|
|
197 |
if (defined('COMPONENT_CLASSLOADER')) {
|
|
|
198 |
spl_autoload_register(COMPONENT_CLASSLOADER);
|
|
|
199 |
} else {
|
|
|
200 |
spl_autoload_register('core_component::classloader');
|
|
|
201 |
}
|
|
|
202 |
|
|
|
203 |
require($CFG->dirroot.'/version.php');
|
|
|
204 |
$CFG->target_release = $release;
|
|
|
205 |
|
|
|
206 |
\core\session\manager::init_empty_session();
|
|
|
207 |
global $SESSION;
|
|
|
208 |
global $USER;
|
|
|
209 |
|
|
|
210 |
global $COURSE;
|
|
|
211 |
$COURSE = new stdClass();
|
|
|
212 |
$COURSE->id = 1;
|
|
|
213 |
|
|
|
214 |
global $SITE;
|
|
|
215 |
$SITE = $COURSE;
|
|
|
216 |
define('SITEID', 1);
|
|
|
217 |
|
|
|
218 |
//Database types
|
|
|
219 |
$databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'native'),
|
|
|
220 |
'auroramysql' => moodle_database::get_driver_instance('auroramysql', 'native'),
|
|
|
221 |
'mariadb'=> moodle_database::get_driver_instance('mariadb', 'native'),
|
|
|
222 |
'pgsql' => moodle_database::get_driver_instance('pgsql', 'native'),
|
|
|
223 |
'oci' => moodle_database::get_driver_instance('oci', 'native'),
|
|
|
224 |
'sqlsrv' => moodle_database::get_driver_instance('sqlsrv', 'native'), // MS SQL*Server PHP driver
|
|
|
225 |
);
|
|
|
226 |
foreach ($databases as $type=>$database) {
|
|
|
227 |
if ($database->driver_installed() !== true) {
|
|
|
228 |
unset($databases[$type]);
|
|
|
229 |
}
|
|
|
230 |
}
|
|
|
231 |
if (empty($databases)) {
|
|
|
232 |
$defaultdb = '';
|
|
|
233 |
} else {
|
|
|
234 |
reset($databases);
|
|
|
235 |
$defaultdb = key($databases);
|
|
|
236 |
}
|
|
|
237 |
|
|
|
238 |
// now get cli options
|
|
|
239 |
list($options, $unrecognized) = cli_get_params(
|
|
|
240 |
array(
|
|
|
241 |
'chmod' => isset($distro->directorypermissions) ? sprintf('%04o',$distro->directorypermissions) : '2777', // let distros set dir permissions
|
|
|
242 |
'lang' => $CFG->lang,
|
|
|
243 |
'wwwroot' => '',
|
|
|
244 |
'dataroot' => empty($distro->dataroot) ? str_replace('\\', '/', dirname(dirname(dirname(__DIR__))).'/moodledata'): $distro->dataroot, // initialised later after including libs or by distro
|
|
|
245 |
'dbtype' => empty($distro->dbtype) ? $defaultdb : $distro->dbtype, // let distro skip dbtype selection
|
|
|
246 |
'dbhost' => empty($distro->dbhost) ? 'localhost' : $distro->dbhost, // let distros set dbhost
|
|
|
247 |
'dbname' => 'moodle',
|
|
|
248 |
'dbuser' => empty($distro->dbuser) ? 'root' : $distro->dbuser, // let distros set dbuser
|
|
|
249 |
'dbpass' => '',
|
|
|
250 |
'dbport' => '',
|
|
|
251 |
'dbsocket' => '',
|
|
|
252 |
'prefix' => 'mdl_',
|
|
|
253 |
'fullname' => '',
|
|
|
254 |
'shortname' => '',
|
|
|
255 |
'summary' => '',
|
|
|
256 |
'adminuser' => 'admin',
|
|
|
257 |
'adminpass' => '',
|
|
|
258 |
'adminemail' => '',
|
|
|
259 |
'sitepreset' => '',
|
|
|
260 |
'supportemail' => '',
|
|
|
261 |
'upgradekey' => '',
|
|
|
262 |
'non-interactive' => false,
|
|
|
263 |
'agree-license' => false,
|
|
|
264 |
'allow-unstable' => false,
|
|
|
265 |
'skip-database' => false,
|
|
|
266 |
'help' => false
|
|
|
267 |
),
|
|
|
268 |
array(
|
|
|
269 |
'h' => 'help'
|
|
|
270 |
)
|
|
|
271 |
);
|
|
|
272 |
|
|
|
273 |
$interactive = empty($options['non-interactive']);
|
|
|
274 |
$skipdatabase = $options['skip-database'];
|
|
|
275 |
|
|
|
276 |
// set up language
|
|
|
277 |
$lang = clean_param($options['lang'], PARAM_SAFEDIR);
|
|
|
278 |
$languages = get_string_manager()->get_list_of_translations();
|
|
|
279 |
if (array_key_exists($lang, $languages)) {
|
|
|
280 |
$CFG->lang = $lang;
|
|
|
281 |
}
|
|
|
282 |
|
|
|
283 |
// Set up site admin preset.
|
|
|
284 |
$sitepreset = clean_param($options['sitepreset'], PARAM_RAW);
|
|
|
285 |
if (!empty($sitepreset)) {
|
|
|
286 |
$CFG->setsitepresetduringinstall = $sitepreset;
|
|
|
287 |
}
|
|
|
288 |
|
|
|
289 |
if ($unrecognized) {
|
|
|
290 |
$unrecognized = implode("\n ", $unrecognized);
|
|
|
291 |
cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
|
|
|
292 |
}
|
|
|
293 |
|
|
|
294 |
if ($options['help']) {
|
|
|
295 |
echo $help;
|
|
|
296 |
die;
|
|
|
297 |
}
|
|
|
298 |
|
|
|
299 |
//Print header
|
|
|
300 |
cli_logo();
|
|
|
301 |
echo PHP_EOL;
|
|
|
302 |
echo get_string('cliinstallheader', 'install', $CFG->target_release)."\n";
|
|
|
303 |
|
|
|
304 |
//Fist select language
|
|
|
305 |
if ($interactive) {
|
|
|
306 |
cli_separator();
|
|
|
307 |
// Do not put the langs into columns because it is not compatible with RTL.
|
|
|
308 |
$default = $CFG->lang;
|
|
|
309 |
cli_heading(get_string('chooselanguagehead', 'install'));
|
|
|
310 |
if (array_key_exists($default, $languages)) {
|
|
|
311 |
echo $default.' - '.$languages[$default]."\n";
|
|
|
312 |
}
|
|
|
313 |
if ($default !== 'en') {
|
|
|
314 |
echo 'en - English (en)'."\n";
|
|
|
315 |
}
|
|
|
316 |
echo '? - '.get_string('availablelangs', 'install')."\n";
|
|
|
317 |
$prompt = get_string('clitypevaluedefault', 'admin', $CFG->lang);
|
|
|
318 |
$error = '';
|
|
|
319 |
do {
|
|
|
320 |
echo $error;
|
|
|
321 |
$input = cli_input($prompt, $default);
|
|
|
322 |
|
|
|
323 |
if ($input === '?') {
|
|
|
324 |
echo implode("\n", $languages)."\n";
|
|
|
325 |
$error = "\n";
|
|
|
326 |
|
|
|
327 |
} else {
|
|
|
328 |
$input = clean_param($input, PARAM_SAFEDIR);
|
|
|
329 |
|
|
|
330 |
if (!array_key_exists($input, $languages)) {
|
|
|
331 |
$error = get_string('cliincorrectvalueretry', 'admin')."\n";
|
|
|
332 |
} else {
|
|
|
333 |
$error = '';
|
|
|
334 |
}
|
|
|
335 |
}
|
|
|
336 |
} while ($error !== '');
|
|
|
337 |
$CFG->lang = $input;
|
|
|
338 |
} else {
|
|
|
339 |
// already selected and verified
|
|
|
340 |
}
|
|
|
341 |
|
|
|
342 |
// Set directorypermissions first
|
|
|
343 |
$chmod = octdec(clean_param($options['chmod'], PARAM_INT));
|
|
|
344 |
if ($interactive) {
|
|
|
345 |
cli_separator();
|
|
|
346 |
cli_heading(get_string('datarootpermission', 'install'));
|
|
|
347 |
$prompt = get_string('clitypevaluedefault', 'admin', decoct($chmod));
|
|
|
348 |
$error = '';
|
|
|
349 |
do {
|
|
|
350 |
echo $error;
|
|
|
351 |
$input = cli_input($prompt, decoct($chmod));
|
|
|
352 |
$input = octdec(clean_param($input, PARAM_INT));
|
|
|
353 |
if (empty($input)) {
|
|
|
354 |
$error = get_string('cliincorrectvalueretry', 'admin')."\n";
|
|
|
355 |
} else {
|
|
|
356 |
$error = '';
|
|
|
357 |
}
|
|
|
358 |
} while ($error !== '');
|
|
|
359 |
$chmod = $input;
|
|
|
360 |
|
|
|
361 |
} else {
|
|
|
362 |
if (empty($chmod)) {
|
|
|
363 |
$a = (object)array('option' => 'chmod', 'value' => decoct($chmod));
|
|
|
364 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
365 |
}
|
|
|
366 |
}
|
|
|
367 |
$CFG->directorypermissions = $chmod;
|
|
|
368 |
$CFG->filepermissions = ($CFG->directorypermissions & 0666);
|
|
|
369 |
$CFG->umaskpermissions = (($CFG->directorypermissions & 0777) ^ 0777);
|
|
|
370 |
|
|
|
371 |
//We need wwwroot before we test dataroot
|
|
|
372 |
$wwwroot = clean_param($options['wwwroot'], PARAM_URL);
|
|
|
373 |
$wwwroot = trim($wwwroot, '/');
|
|
|
374 |
if ($interactive) {
|
|
|
375 |
cli_separator();
|
|
|
376 |
cli_heading(get_string('wwwroot', 'install'));
|
|
|
377 |
if (strpos($wwwroot, 'http') === 0) {
|
|
|
378 |
$prompt = get_string('clitypevaluedefault', 'admin', $wwwroot);
|
|
|
379 |
} else {
|
|
|
380 |
$wwwroot = null;
|
|
|
381 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
382 |
}
|
|
|
383 |
$error = '';
|
|
|
384 |
do {
|
|
|
385 |
echo $error;
|
|
|
386 |
$input = cli_input($prompt, $wwwroot);
|
|
|
387 |
$input = clean_param($input, PARAM_URL);
|
|
|
388 |
$input = trim($input, '/');
|
|
|
389 |
if (strpos($input, 'http') !== 0) {
|
|
|
390 |
$error = get_string('cliincorrectvalueretry', 'admin')."\n";
|
|
|
391 |
} else {
|
|
|
392 |
$error = '';
|
|
|
393 |
}
|
|
|
394 |
} while ($error !== '');
|
|
|
395 |
$wwwroot = $input;
|
|
|
396 |
|
|
|
397 |
} else {
|
|
|
398 |
if (strpos($wwwroot, 'http') !== 0) {
|
|
|
399 |
$a = (object)array('option'=>'wwwroot', 'value'=>$wwwroot);
|
|
|
400 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
401 |
}
|
|
|
402 |
}
|
|
|
403 |
$CFG->wwwroot = $wwwroot;
|
|
|
404 |
$CFG->httpswwwroot = $CFG->wwwroot;
|
|
|
405 |
|
|
|
406 |
//We need dataroot before lang download
|
|
|
407 |
$CFG->dataroot = $options['dataroot'];
|
|
|
408 |
if ($interactive) {
|
|
|
409 |
cli_separator();
|
|
|
410 |
$i=0;
|
|
|
411 |
while(is_dataroot_insecure()) {
|
|
|
412 |
$parrent = dirname($CFG->dataroot);
|
|
|
413 |
$i++;
|
|
|
414 |
if ($parrent == '/' or $parrent == '.' or preg_match('/^[a-z]:\\\?$/i', $parrent) or ($i > 100)) {
|
|
|
415 |
$CFG->dataroot = ''; //can not find secure location for dataroot
|
|
|
416 |
break;
|
|
|
417 |
}
|
|
|
418 |
$CFG->dataroot = dirname($parrent).'/moodledata';
|
|
|
419 |
}
|
|
|
420 |
cli_heading(get_string('dataroot', 'install'));
|
|
|
421 |
$error = '';
|
|
|
422 |
do {
|
|
|
423 |
if ($CFG->dataroot !== '') {
|
|
|
424 |
$prompt = get_string('clitypevaluedefault', 'admin', $CFG->dataroot);
|
|
|
425 |
} else {
|
|
|
426 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
427 |
}
|
|
|
428 |
echo $error;
|
|
|
429 |
$CFG->dataroot = cli_input($prompt, $CFG->dataroot);
|
|
|
430 |
if ($CFG->dataroot === '') {
|
|
|
431 |
$error = get_string('cliincorrectvalueretry', 'admin')."\n";
|
|
|
432 |
} else if (is_dataroot_insecure()) {
|
|
|
433 |
$CFG->dataroot = '';
|
|
|
434 |
$error = get_string('pathsunsecuredataroot', 'install')."\n";
|
|
|
435 |
} else {
|
|
|
436 |
if (install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) {
|
|
|
437 |
$error = '';
|
|
|
438 |
} else {
|
|
|
439 |
$a = (object)array('dataroot' => $CFG->dataroot);
|
|
|
440 |
$error = get_string('pathserrcreatedataroot', 'install', $a)."\n";
|
|
|
441 |
}
|
|
|
442 |
}
|
|
|
443 |
|
|
|
444 |
} while ($error !== '');
|
|
|
445 |
|
|
|
446 |
} else {
|
|
|
447 |
if (is_dataroot_insecure()) {
|
|
|
448 |
cli_error(get_string('pathsunsecuredataroot', 'install'));
|
|
|
449 |
}
|
|
|
450 |
if (!install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) {
|
|
|
451 |
$a = (object)array('dataroot' => $CFG->dataroot);
|
|
|
452 |
cli_error(get_string('pathserrcreatedataroot', 'install', $a));
|
|
|
453 |
}
|
|
|
454 |
}
|
|
|
455 |
$CFG->tempdir = $CFG->dataroot.'/temp';
|
|
|
456 |
$CFG->backuptempdir = $CFG->tempdir.'/backup';
|
|
|
457 |
$CFG->cachedir = $CFG->dataroot.'/cache';
|
|
|
458 |
$CFG->localcachedir = $CFG->dataroot.'/localcache';
|
|
|
459 |
|
|
|
460 |
// download required lang packs
|
|
|
461 |
if ($CFG->lang !== 'en') {
|
|
|
462 |
$installer = new lang_installer($CFG->lang);
|
|
|
463 |
$results = $installer->run();
|
|
|
464 |
foreach ($results as $langcode => $langstatus) {
|
|
|
465 |
if ($langstatus === lang_installer::RESULT_DOWNLOADERROR) {
|
|
|
466 |
$a = new stdClass();
|
|
|
467 |
$a->url = $installer->lang_pack_url($langcode);
|
|
|
468 |
$a->dest = $CFG->dataroot.'/lang';
|
|
|
469 |
cli_problem(get_string('remotedownloaderror', 'error', $a));
|
|
|
470 |
}
|
|
|
471 |
}
|
|
|
472 |
}
|
|
|
473 |
|
|
|
474 |
// switch the string_manager instance to stop using install/lang/
|
|
|
475 |
$CFG->early_install_lang = false;
|
|
|
476 |
$CFG->langotherroot = $CFG->dataroot.'/lang';
|
|
|
477 |
$CFG->langlocalroot = $CFG->dataroot.'/lang';
|
|
|
478 |
get_string_manager(true);
|
|
|
479 |
|
|
|
480 |
// make sure we are installing stable release or require a confirmation
|
|
|
481 |
if (isset($maturity)) {
|
|
|
482 |
if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) {
|
|
|
483 |
$maturitylevel = get_string('maturity'.$maturity, 'admin');
|
|
|
484 |
|
|
|
485 |
if ($interactive) {
|
|
|
486 |
cli_separator();
|
|
|
487 |
cli_heading(get_string('notice'));
|
|
|
488 |
echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL;
|
|
|
489 |
echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL;
|
|
|
490 |
echo get_string('continue') . PHP_EOL;
|
|
|
491 |
$prompt = get_string('cliyesnoprompt', 'admin');
|
|
|
492 |
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
|
|
|
493 |
if ($input == get_string('clianswerno', 'admin')) {
|
|
|
494 |
exit(1);
|
|
|
495 |
}
|
|
|
496 |
} else {
|
|
|
497 |
cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel));
|
|
|
498 |
cli_error(get_string('maturityallowunstable', 'admin'));
|
|
|
499 |
}
|
|
|
500 |
}
|
|
|
501 |
}
|
|
|
502 |
|
|
|
503 |
// ask for db type - show only drivers available
|
|
|
504 |
if ($interactive) {
|
|
|
505 |
$options['dbtype'] = strtolower($options['dbtype']);
|
|
|
506 |
cli_separator();
|
|
|
507 |
cli_heading(get_string('databasetypehead', 'install'));
|
|
|
508 |
foreach ($databases as $type=>$database) {
|
|
|
509 |
echo " $type \n";
|
|
|
510 |
}
|
|
|
511 |
if (!empty($databases[$options['dbtype']])) {
|
|
|
512 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbtype']);
|
|
|
513 |
} else {
|
|
|
514 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
515 |
}
|
|
|
516 |
$CFG->dbtype = cli_input($prompt, $options['dbtype'], array_keys($databases));
|
|
|
517 |
|
|
|
518 |
} else {
|
|
|
519 |
if (empty($databases[$options['dbtype']])) {
|
|
|
520 |
$a = (object)array('option'=>'dbtype', 'value'=>$options['dbtype']);
|
|
|
521 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
522 |
}
|
|
|
523 |
$CFG->dbtype = $options['dbtype'];
|
|
|
524 |
}
|
|
|
525 |
$database = $databases[$CFG->dbtype];
|
|
|
526 |
|
|
|
527 |
|
|
|
528 |
// We cannot do any validation until all DB connection data is provided.
|
|
|
529 |
$hintdatabase = '';
|
|
|
530 |
do {
|
|
|
531 |
echo $hintdatabase;
|
|
|
532 |
|
|
|
533 |
// Ask for db host.
|
|
|
534 |
if ($interactive) {
|
|
|
535 |
cli_separator();
|
|
|
536 |
cli_heading(get_string('databasehost', 'install'));
|
|
|
537 |
if ($options['dbhost'] !== '') {
|
|
|
538 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbhost']);
|
|
|
539 |
} else {
|
|
|
540 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
541 |
}
|
|
|
542 |
$CFG->dbhost = cli_input($prompt, $options['dbhost']);
|
|
|
543 |
|
|
|
544 |
} else {
|
|
|
545 |
$CFG->dbhost = $options['dbhost'];
|
|
|
546 |
}
|
|
|
547 |
|
|
|
548 |
// Ask for db name.
|
|
|
549 |
if ($interactive) {
|
|
|
550 |
cli_separator();
|
|
|
551 |
cli_heading(get_string('databasename', 'install'));
|
|
|
552 |
if ($options['dbname'] !== '') {
|
|
|
553 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbname']);
|
|
|
554 |
} else {
|
|
|
555 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
556 |
}
|
|
|
557 |
$CFG->dbname = cli_input($prompt, $options['dbname']);
|
|
|
558 |
|
|
|
559 |
} else {
|
|
|
560 |
$CFG->dbname = $options['dbname'];
|
|
|
561 |
}
|
|
|
562 |
|
|
|
563 |
// Ask for db prefix.
|
|
|
564 |
if ($interactive) {
|
|
|
565 |
cli_separator();
|
|
|
566 |
cli_heading(get_string('dbprefix', 'install'));
|
|
|
567 |
//TODO: solve somehow the prefix trouble for oci.
|
|
|
568 |
if ($options['prefix'] !== '') {
|
|
|
569 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['prefix']);
|
|
|
570 |
} else {
|
|
|
571 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
572 |
}
|
|
|
573 |
$CFG->prefix = cli_input($prompt, $options['prefix']);
|
|
|
574 |
|
|
|
575 |
} else {
|
|
|
576 |
$CFG->prefix = $options['prefix'];
|
|
|
577 |
}
|
|
|
578 |
|
|
|
579 |
// Ask for db port.
|
|
|
580 |
if ($interactive) {
|
|
|
581 |
cli_separator();
|
|
|
582 |
cli_heading(get_string('databaseport', 'install'));
|
|
|
583 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbport']);
|
|
|
584 |
$CFG->dboptions['dbport'] = (int) cli_input($prompt, $options['dbport']);
|
|
|
585 |
|
|
|
586 |
} else {
|
|
|
587 |
$CFG->dboptions['dbport'] = (int) $options['dbport'];
|
|
|
588 |
}
|
|
|
589 |
if ($CFG->dboptions['dbport'] <= 0) {
|
|
|
590 |
$CFG->dboptions['dbport'] = '';
|
|
|
591 |
}
|
|
|
592 |
|
|
|
593 |
// Ask for db socket.
|
|
|
594 |
if ($CFG->ostype === 'WINDOWS') {
|
|
|
595 |
$CFG->dboptions['dbsocket'] = '';
|
|
|
596 |
|
|
|
597 |
} else if ($interactive and empty($CFG->dboptions['dbport'])) {
|
|
|
598 |
cli_separator();
|
|
|
599 |
cli_heading(get_string('databasesocket', 'install'));
|
|
|
600 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbsocket']);
|
|
|
601 |
$CFG->dboptions['dbsocket'] = cli_input($prompt, $options['dbsocket']);
|
|
|
602 |
|
|
|
603 |
} else {
|
|
|
604 |
$CFG->dboptions['dbsocket'] = $options['dbsocket'];
|
|
|
605 |
}
|
|
|
606 |
|
|
|
607 |
// Ask for db user.
|
|
|
608 |
if ($interactive) {
|
|
|
609 |
cli_separator();
|
|
|
610 |
cli_heading(get_string('databaseuser', 'install'));
|
|
|
611 |
if ($options['dbuser'] !== '') {
|
|
|
612 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbuser']);
|
|
|
613 |
} else {
|
|
|
614 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
615 |
}
|
|
|
616 |
$CFG->dbuser = cli_input($prompt, $options['dbuser']);
|
|
|
617 |
|
|
|
618 |
} else {
|
|
|
619 |
$CFG->dbuser = $options['dbuser'];
|
|
|
620 |
}
|
|
|
621 |
|
|
|
622 |
// Ask for db password.
|
|
|
623 |
if ($interactive) {
|
|
|
624 |
cli_separator();
|
|
|
625 |
cli_heading(get_string('databasepass', 'install'));
|
|
|
626 |
|
|
|
627 |
if ($options['dbpass'] !== '') {
|
|
|
628 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['dbpass']);
|
|
|
629 |
} else {
|
|
|
630 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
631 |
}
|
|
|
632 |
|
|
|
633 |
$CFG->dbpass = cli_input($prompt, $options['dbpass']);
|
|
|
634 |
if (function_exists('distro_pre_create_db')) { // Hook for distros needing to do something before DB creation.
|
|
|
635 |
$distro = distro_pre_create_db($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix,
|
|
|
636 |
array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']),
|
|
|
637 |
$distro);
|
|
|
638 |
}
|
|
|
639 |
$hintdatabase = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix,
|
|
|
640 |
array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']));
|
|
|
641 |
|
|
|
642 |
} else {
|
|
|
643 |
$CFG->dbpass = $options['dbpass'];
|
|
|
644 |
$hintdatabase = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix,
|
|
|
645 |
array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']));
|
|
|
646 |
if ($hintdatabase !== '') {
|
|
|
647 |
cli_error(get_string('dbconnectionerror', 'install'));
|
|
|
648 |
}
|
|
|
649 |
}
|
|
|
650 |
} while ($hintdatabase !== '');
|
|
|
651 |
|
|
|
652 |
// If --skip-database option is provided, we do not need to ask for site fullname, shortname, adminuser, adminpass, adminemail.
|
|
|
653 |
// These fields will be requested during the database install part.
|
|
|
654 |
if (!$skipdatabase) {
|
|
|
655 |
// Ask for fullname.
|
|
|
656 |
if ($interactive) {
|
|
|
657 |
cli_separator();
|
|
|
658 |
cli_heading(get_string('fullsitename', 'moodle'));
|
|
|
659 |
|
|
|
660 |
if ($options['fullname'] !== '') {
|
|
|
661 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']);
|
|
|
662 |
} else {
|
|
|
663 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
664 |
}
|
|
|
665 |
|
|
|
666 |
do {
|
|
|
667 |
$options['fullname'] = cli_input($prompt, $options['fullname']);
|
|
|
668 |
} while (empty($options['fullname']));
|
|
|
669 |
} else {
|
|
|
670 |
if (empty($options['fullname'])) {
|
|
|
671 |
$a = (object)['option' => 'fullname', 'value' => $options['fullname']];
|
|
|
672 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
673 |
}
|
|
|
674 |
}
|
|
|
675 |
|
|
|
676 |
// Ask for shortname.
|
|
|
677 |
if ($interactive) {
|
|
|
678 |
cli_separator();
|
|
|
679 |
cli_heading(get_string('shortsitename', 'moodle'));
|
|
|
680 |
|
|
|
681 |
if ($options['shortname'] !== '') {
|
|
|
682 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']);
|
|
|
683 |
} else {
|
|
|
684 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
685 |
}
|
|
|
686 |
|
|
|
687 |
do {
|
|
|
688 |
$options['shortname'] = cli_input($prompt, $options['shortname']);
|
|
|
689 |
} while (empty($options['shortname']));
|
|
|
690 |
} else {
|
|
|
691 |
if (empty($options['shortname'])) {
|
|
|
692 |
$a = (object)['option' => 'shortname', 'value' => $options['shortname']];
|
|
|
693 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
694 |
}
|
|
|
695 |
}
|
|
|
696 |
|
|
|
697 |
// Ask for admin user name.
|
|
|
698 |
if ($interactive) {
|
|
|
699 |
cli_separator();
|
|
|
700 |
cli_heading(get_string('cliadminusername', 'install'));
|
|
|
701 |
if (!empty($options['adminuser'])) {
|
|
|
702 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']);
|
|
|
703 |
} else {
|
|
|
704 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
705 |
}
|
|
|
706 |
do {
|
|
|
707 |
$options['adminuser'] = cli_input($prompt, $options['adminuser']);
|
|
|
708 |
} while (empty($options['adminuser']) or $options['adminuser'] === 'guest');
|
|
|
709 |
} else {
|
|
|
710 |
if ((empty($options['adminuser']) || $options['adminuser'] === 'guest')) {
|
|
|
711 |
$a = (object)['option' => 'adminuser', 'value' => $options['adminuser']];
|
|
|
712 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
713 |
}
|
|
|
714 |
}
|
|
|
715 |
|
|
|
716 |
// Ask for admin user password.
|
|
|
717 |
if ($interactive) {
|
|
|
718 |
cli_separator();
|
|
|
719 |
cli_heading(get_string('cliadminpassword', 'install'));
|
|
|
720 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
721 |
do {
|
|
|
722 |
$options['adminpass'] = cli_input($prompt);
|
|
|
723 |
} while (empty($options['adminpass']) or $options['adminpass'] === 'admin');
|
|
|
724 |
} else {
|
|
|
725 |
if ((empty($options['adminpass']) or $options['adminpass'] === 'admin')) {
|
|
|
726 |
$a = (object)['option' => 'adminpass', 'value' => $options['adminpass']];
|
|
|
727 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
728 |
}
|
|
|
729 |
}
|
|
|
730 |
|
|
|
731 |
// Ask for the admin email address.
|
|
|
732 |
if ($interactive) {
|
|
|
733 |
cli_separator();
|
|
|
734 |
cli_heading(get_string('cliadminemail', 'install'));
|
|
|
735 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['adminemail']);
|
|
|
736 |
$options['adminemail'] = cli_input($prompt, $options['adminemail']);
|
|
|
737 |
}
|
|
|
738 |
|
|
|
739 |
// Validate that the address provided was an e-mail address.
|
|
|
740 |
if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) {
|
|
|
741 |
$a = (object)['option' => 'adminemail', 'value' => $options['adminemail']];
|
|
|
742 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
743 |
}
|
|
|
744 |
|
|
|
745 |
// Ask for the support email address.
|
|
|
746 |
if ($interactive) {
|
|
|
747 |
cli_separator();
|
|
|
748 |
cli_heading(get_string('clisupportemail', 'install'));
|
|
|
749 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['supportemail']);
|
|
|
750 |
$options['supportemail'] = cli_input($prompt, $options['supportemail']);
|
|
|
751 |
}
|
|
|
752 |
|
|
|
753 |
// Validate that the support email address provided is valid.
|
|
|
754 |
if (!empty($options['supportemail']) && !validate_email($options['supportemail'])) {
|
|
|
755 |
$a = (object)['option' => 'supportemail', 'value' => $options['supportemail']];
|
|
|
756 |
cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
|
|
|
757 |
}
|
|
|
758 |
}
|
|
|
759 |
|
|
|
760 |
// Ask for the upgrade key.
|
|
|
761 |
if ($interactive) {
|
|
|
762 |
cli_separator();
|
|
|
763 |
cli_heading(get_string('upgradekeyset', 'admin'));
|
|
|
764 |
if ($options['upgradekey'] !== '') {
|
|
|
765 |
$prompt = get_string('clitypevaluedefault', 'admin', $options['upgradekey']);
|
|
|
766 |
$options['upgradekey'] = cli_input($prompt, $options['upgradekey']);
|
|
|
767 |
} else {
|
|
|
768 |
$prompt = get_string('clitypevalue', 'admin');
|
|
|
769 |
$options['upgradekey'] = cli_input($prompt);
|
|
|
770 |
}
|
|
|
771 |
}
|
|
|
772 |
|
|
|
773 |
// Set the upgrade key if it was provided.
|
|
|
774 |
if ($options['upgradekey'] !== '') {
|
|
|
775 |
$CFG->upgradekey = $options['upgradekey'];
|
|
|
776 |
}
|
|
|
777 |
|
|
|
778 |
// The user does not also need to pass agree-license when --skip-database is provided as the user will need to accept
|
|
|
779 |
// the license again in the database install part.
|
|
|
780 |
if (!$skipdatabase) {
|
|
|
781 |
if ($interactive) {
|
|
|
782 |
if (!$options['agree-license']) {
|
|
|
783 |
cli_separator();
|
|
|
784 |
cli_heading(get_string('copyrightnotice'));
|
|
|
785 |
echo "Moodle - Modular Object-Oriented Dynamic Learning Environment\n";
|
|
|
786 |
echo get_string('gpl3')."\n\n";
|
|
|
787 |
echo get_string('doyouagree')."\n";
|
|
|
788 |
$prompt = get_string('cliyesnoprompt', 'admin');
|
|
|
789 |
$input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
|
|
|
790 |
if ($input == get_string('clianswerno', 'admin')) {
|
|
|
791 |
exit(1);
|
|
|
792 |
}
|
|
|
793 |
}
|
|
|
794 |
} else {
|
|
|
795 |
if (!$options['agree-license'] && !$skipdatabase) {
|
|
|
796 |
cli_error(get_string('climustagreelicense', 'install'));
|
|
|
797 |
}
|
|
|
798 |
}
|
|
|
799 |
}
|
|
|
800 |
|
|
|
801 |
// Finally we have all info needed for config.php
|
|
|
802 |
$configphp = install_generate_configphp($database, $CFG);
|
|
|
803 |
umask(0137);
|
|
|
804 |
if (($fh = fopen($configfile, 'w')) !== false) {
|
|
|
805 |
fwrite($fh, $configphp);
|
|
|
806 |
fclose($fh);
|
|
|
807 |
}
|
|
|
808 |
|
|
|
809 |
if (!file_exists($configfile)) {
|
|
|
810 |
cli_error('Can not create config file.');
|
|
|
811 |
}
|
|
|
812 |
|
|
|
813 |
// remember selected language
|
|
|
814 |
$installlang = $CFG->lang;
|
|
|
815 |
// return back to original dir before executing setup.php which changes the dir again
|
|
|
816 |
chdir($olddir);
|
|
|
817 |
// We have config.php, it is a real php script from now on :-)
|
|
|
818 |
require($configfile);
|
|
|
819 |
|
|
|
820 |
// use selected language
|
|
|
821 |
$CFG->lang = $installlang;
|
|
|
822 |
$SESSION->lang = $CFG->lang;
|
|
|
823 |
|
|
|
824 |
require("$CFG->dirroot/version.php");
|
|
|
825 |
|
|
|
826 |
// Test environment first.
|
|
|
827 |
require_once($CFG->libdir . '/environmentlib.php');
|
|
|
828 |
list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
|
|
|
829 |
if (!$envstatus) {
|
|
|
830 |
$errors = environment_get_errors($environment_results);
|
|
|
831 |
cli_heading(get_string('environment', 'admin'));
|
|
|
832 |
foreach ($errors as $error) {
|
|
|
833 |
list($info, $report) = $error;
|
|
|
834 |
echo "!! $info !!\n$report\n\n";
|
|
|
835 |
}
|
|
|
836 |
exit(1);
|
|
|
837 |
}
|
|
|
838 |
|
|
|
839 |
// Test plugin dependencies.
|
|
|
840 |
$failed = array();
|
|
|
841 |
if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
|
|
|
842 |
cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed)))));
|
|
|
843 |
cli_error(get_string('pluginschecktodo', 'admin'));
|
|
|
844 |
}
|
|
|
845 |
|
|
|
846 |
if (!$skipdatabase) {
|
|
|
847 |
install_cli_database($options, $interactive);
|
|
|
848 |
// This needs to happen at the end to ensure it occurs after all caches
|
|
|
849 |
// have been purged for the last time.
|
|
|
850 |
// This will build a cached version of the current theme for the user
|
|
|
851 |
// to immediately start browsing the site.
|
|
|
852 |
require_once($CFG->libdir.'/upgradelib.php');
|
|
|
853 |
upgrade_themes();
|
|
|
854 |
} else {
|
|
|
855 |
echo get_string('cliskipdatabase', 'install')."\n";
|
|
|
856 |
}
|
|
|
857 |
|
|
|
858 |
echo get_string('cliinstallfinished', 'install')."\n";
|
|
|
859 |
exit(0); // 0 means success
|