source: moodle/trunk/fuentes/admin/cli/install.php @ 136

Last change on this file since 136 was 136, checked in by mabarracus, 3 years ago

Ported code to xenial

File size: 27.0 KB
Line 
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
32define('CLI_SCRIPT', true);
33
34// extra execution prevention - we can not just require config.php here
35if (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.
41if (function_exists('opcache_reset')) {
42    opcache_reset();
43}
44
45$help =
46"Command line Moodle installer, creates config.php and initializes database.
47Please note you must execute this script with the same uid as apache
48or use chmod/chown after installation.
49
50Site defaults may be changed via local/defaults.php.
51
52Options:
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--adminuser=USERNAME  Username for the moodle admin account. Default is admin
73--adminpass=PASSWORD  Password for the moodle admin account,
74                      required in non-interactive mode.
75--non-interactive     No interactive questions, installation fails if any
76                      problem encountered.
77--agree-license       Indicates agreement with software license,
78                      required in non-interactive mode.
79--allow-unstable      Install even if the version is not marked as stable yet,
80                      required in non-interactive mode.
81-h, --help            Print out this help
82
83Example:
84\$sudo -u www-data /usr/bin/php admin/cli/install.php --lang=cs
85"; //TODO: localize, mark as needed in install - to be translated later when everything is finished
86
87
88// distro specific customisation
89$distrolibfile = dirname(dirname(dirname(__FILE__))).'/install/distrolib.php';
90$distro = null;
91if (file_exists($distrolibfile)) {
92    require_once($distrolibfile);
93    if (function_exists('distro_get_config')) {
94        $distro = distro_get_config();
95    }
96}
97
98// Nothing to do if config.php exists
99$configfile = dirname(dirname(dirname(__FILE__))).'/config.php';
100if (file_exists($configfile)) {
101    require($configfile);
102    require_once($CFG->libdir.'/clilib.php');
103    list($options, $unrecognized) = cli_get_params(array('help'=>false), array('h'=>'help'));
104
105    if ($options['help']) {
106        echo $help;
107        echo "\n\n";
108    }
109
110    if ($DB->get_manager()->table_exists('config')) {
111        cli_error(get_string('clialreadyinstalled', 'install'));
112    } else {
113        cli_error(get_string('clialreadyconfigured', 'install'));
114    }
115}
116
117$olddir = getcwd();
118
119// change directory so that includes below work properly
120chdir(dirname($_SERVER['argv'][0]));
121
122// Servers should define a default timezone in php.ini, but if they don't then make sure something is defined.
123// This is a quick hack.  Ideally we should ask the admin for a value.  See MDL-22625 for more on this.
124if (function_exists('date_default_timezone_set') and function_exists('date_default_timezone_get')) {
125    @date_default_timezone_set(@date_default_timezone_get());
126}
127
128// make sure PHP errors are displayed - helps with diagnosing of problems
129@error_reporting(E_ALL);
130@ini_set('display_errors', '1');
131// we need a lot of memory
132@ini_set('memory_limit', '128M');
133
134/** Used by library scripts to check they are being called by Moodle */
135define('MOODLE_INTERNAL', true);
136
137// Disables all caching.
138define('CACHE_DISABLE_ALL', true);
139
140define('PHPUNIT_TEST', false);
141
142define('IGNORE_COMPONENT_CACHE', true);
143
144// Check that PHP is of a sufficient version
145if (version_compare(phpversion(), "5.4.4") < 0) {
146    $phpversion = phpversion();
147    // do NOT localise - lang strings would not work here and we CAN NOT move it after installib
148    fwrite(STDERR, "Moodle 2.7 or later requires at least PHP 5.4.4 (currently using version $phpversion).\n");
149    fwrite(STDERR, "Please upgrade your server software or install older Moodle version.\n");
150    exit(1);
151}
152
153// set up configuration
154global $CFG;
155$CFG = new stdClass();
156$CFG->lang                 = 'en';
157$CFG->dirroot              = dirname(dirname(dirname(__FILE__)));
158$CFG->libdir               = "$CFG->dirroot/lib";
159$CFG->wwwroot              = "http://localhost";
160$CFG->httpswwwroot         = $CFG->wwwroot;
161$CFG->docroot              = 'http://docs.moodle.org';
162$CFG->running_installer    = true;
163$CFG->early_install_lang   = true;
164$CFG->ostype               = (stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'darwin')) ? 'WINDOWS' : 'UNIX';
165$CFG->dboptions            = array();
166$CFG->debug                = (E_ALL | E_STRICT);
167$CFG->debugdisplay         = true;
168$CFG->debugdeveloper       = true;
169
170$parts = explode('/', str_replace('\\', '/', dirname(dirname(__FILE__))));
171$CFG->admin                = array_pop($parts);
172
173//point pear include path to moodles lib/pear so that includes and requires will search there for files before anywhere else
174//the problem is that we need specific version of quickforms and hacked excel files :-(
175ini_set('include_path', $CFG->libdir.'/pear' . PATH_SEPARATOR . ini_get('include_path'));
176
177require_once($CFG->libdir.'/classes/component.php');
178require_once($CFG->libdir.'/classes/text.php');
179require_once($CFG->libdir.'/classes/string_manager.php');
180require_once($CFG->libdir.'/classes/string_manager_install.php');
181require_once($CFG->libdir.'/classes/string_manager_standard.php');
182require_once($CFG->libdir.'/installlib.php');
183require_once($CFG->libdir.'/clilib.php');
184require_once($CFG->libdir.'/setuplib.php');
185require_once($CFG->libdir.'/weblib.php');
186require_once($CFG->libdir.'/dmllib.php');
187require_once($CFG->libdir.'/moodlelib.php');
188require_once($CFG->libdir.'/deprecatedlib.php');
189require_once($CFG->libdir.'/adminlib.php');
190require_once($CFG->libdir.'/componentlib.class.php');
191require_once($CFG->dirroot.'/cache/lib.php');
192
193// Register our classloader, in theory somebody might want to replace it to load other hacked core classes.
194// Required because the database checks below lead to session interaction which is going to lead us to requiring autoloaded classes.
195if (defined('COMPONENT_CLASSLOADER')) {
196    spl_autoload_register(COMPONENT_CLASSLOADER);
197} else {
198    spl_autoload_register('core_component::classloader');
199}
200
201require($CFG->dirroot.'/version.php');
202$CFG->target_release = $release;
203
204\core\session\manager::init_empty_session();
205global $SESSION;
206global $USER;
207
208global $COURSE;
209$COURSE = new stdClass();
210$COURSE->id = 1;
211
212global $SITE;
213$SITE = $COURSE;
214define('SITEID', 1);
215
216//Database types
217$databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'native'),
218                   'mariadb'=> moodle_database::get_driver_instance('mariadb', 'native'),
219                   'pgsql'  => moodle_database::get_driver_instance('pgsql',  'native'),
220                   'oci'    => moodle_database::get_driver_instance('oci',    'native'),
221                   'sqlsrv' => moodle_database::get_driver_instance('sqlsrv', 'native'), // MS SQL*Server PHP driver
222                   'mssql'  => moodle_database::get_driver_instance('mssql',  'native'), // FreeTDS driver
223                  );
224foreach ($databases as $type=>$database) {
225    if ($database->driver_installed() !== true) {
226        unset($databases[$type]);
227    }
228}
229if (empty($databases)) {
230    $defaultdb = '';
231} else {
232    reset($databases);
233    $defaultdb = key($databases);
234}
235
236// now get cli options
237list($options, $unrecognized) = cli_get_params(
238    array(
239        'chmod'             => isset($distro->directorypermissions) ? sprintf('%04o',$distro->directorypermissions) : '2777', // let distros set dir permissions
240        'lang'              => $CFG->lang,
241        'wwwroot'           => '',
242        'dataroot'          => empty($distro->dataroot) ? str_replace('\\', '/', dirname(dirname(dirname(dirname(__FILE__)))).'/moodledata'): $distro->dataroot, // initialised later after including libs or by distro
243        'dbtype'            => empty($distro->dbtype) ? $defaultdb : $distro->dbtype, // let distro skip dbtype selection
244        'dbhost'            => empty($distro->dbhost) ? 'localhost' : $distro->dbhost, // let distros set dbhost
245        'dbname'            => 'moodle',
246        'dbuser'            => empty($distro->dbuser) ? 'root' : $distro->dbuser, // let distros set dbuser
247        'dbpass'            => '',
248        'dbport'            => '',
249        'dbsocket'          => '',
250        'prefix'            => 'mdl_',
251        'fullname'          => '',
252        'shortname'         => '',
253        'adminuser'         => 'admin',
254        'adminpass'         => '',
255        'non-interactive'   => false,
256        'agree-license'     => false,
257        'allow-unstable'    => false,
258        'help'              => false
259    ),
260    array(
261        'h' => 'help'
262    )
263);
264
265$interactive = empty($options['non-interactive']);
266
267// set up language
268$lang = clean_param($options['lang'], PARAM_SAFEDIR);
269if (file_exists($CFG->dirroot.'/install/lang/'.$lang)) {
270    $CFG->lang = $lang;
271}
272
273if ($unrecognized) {
274    $unrecognized = implode("\n  ", $unrecognized);
275    cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
276}
277
278if ($options['help']) {
279    echo $help;
280    die;
281}
282
283//Print header
284echo get_string('cliinstallheader', 'install', $CFG->target_release)."\n";
285
286//Fist select language
287if ($interactive) {
288    cli_separator();
289    $languages = get_string_manager()->get_list_of_translations();
290    // Do not put the langs into columns because it is not compatible with RTL.
291    $langlist = implode("\n", $languages);
292    $default = $CFG->lang;
293    cli_heading(get_string('availablelangs', 'install'));
294    echo $langlist."\n";
295    $prompt = get_string('clitypevaluedefault', 'admin', $CFG->lang);
296    $error = '';
297    do {
298        echo $error;
299        $input = cli_input($prompt, $default);
300        $input = clean_param($input, PARAM_SAFEDIR);
301
302        if (!file_exists($CFG->dirroot.'/install/lang/'.$input)) {
303            $error = get_string('cliincorrectvalueretry', 'admin')."\n";
304        } else {
305            $error = '';
306        }
307    } while ($error !== '');
308    $CFG->lang = $input;
309} else {
310    // already selected and verified
311}
312
313// Set directorypermissions first
314$chmod = octdec(clean_param($options['chmod'], PARAM_INT));
315if ($interactive) {
316    cli_separator();
317    cli_heading(get_string('datarootpermission', 'install'));
318    $prompt = get_string('clitypevaluedefault', 'admin', decoct($chmod));
319    $error = '';
320    do {
321        echo $error;
322        $input = cli_input($prompt, decoct($chmod));
323        $input = octdec(clean_param($input, PARAM_INT));
324        if (empty($input)) {
325            $error = get_string('cliincorrectvalueretry', 'admin')."\n";
326        } else {
327            $error = '';
328        }
329    } while ($error !== '');
330    $chmod = $input;
331
332} else {
333    if (empty($chmod)) {
334        $a = (object)array('option' => 'chmod', 'value' => decoct($chmod));
335        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
336    }
337}
338$CFG->directorypermissions = $chmod;
339$CFG->filepermissions      = ($CFG->directorypermissions & 0666);
340$CFG->umaskpermissions     = (($CFG->directorypermissions & 0777) ^ 0777);
341
342//We need wwwroot before we test dataroot
343$wwwroot = clean_param($options['wwwroot'], PARAM_URL);
344$wwwroot = trim($wwwroot, '/');
345if ($interactive) {
346    cli_separator();
347    cli_heading(get_string('wwwroot', 'install'));
348    if (strpos($wwwroot, 'http') === 0) {
349        $prompt = get_string('clitypevaluedefault', 'admin', $wwwroot);
350    } else {
351        $wwwroot = null;
352        $prompt = get_string('clitypevalue', 'admin');
353    }
354    $error = '';
355    do {
356        echo $error;
357        $input = cli_input($prompt, $wwwroot);
358        $input = clean_param($input, PARAM_URL);
359        $input = trim($input, '/');
360        if (strpos($input, 'http') !== 0) {
361            $error = get_string('cliincorrectvalueretry', 'admin')."\n";
362        } else {
363            $error = '';
364        }
365    } while ($error !== '');
366    $wwwroot = $input;
367
368} else {
369    if (strpos($wwwroot, 'http') !== 0) {
370        $a = (object)array('option'=>'wwwroot', 'value'=>$wwwroot);
371        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
372    }
373}
374$CFG->wwwroot       = $wwwroot;
375$CFG->httpswwwroot  = $CFG->wwwroot;
376
377
378//We need dataroot before lang download
379$CFG->dataroot = $options['dataroot'];
380if ($interactive) {
381    cli_separator();
382    $i=0;
383    while(is_dataroot_insecure()) {
384        $parrent = dirname($CFG->dataroot);
385        $i++;
386        if ($parrent == '/' or $parrent == '.' or preg_match('/^[a-z]:\\\?$/i', $parrent) or ($i > 100)) {
387            $CFG->dataroot = ''; //can not find secure location for dataroot
388            break;
389        }
390        $CFG->dataroot = dirname($parrent).'/moodledata';
391    }
392    cli_heading(get_string('dataroot', 'install'));
393    $error = '';
394    do {
395        if ($CFG->dataroot !== '') {
396            $prompt = get_string('clitypevaluedefault', 'admin', $CFG->dataroot);
397        } else {
398            $prompt = get_string('clitypevalue', 'admin');
399        }
400        echo $error;
401        $CFG->dataroot = cli_input($prompt, $CFG->dataroot);
402        if ($CFG->dataroot === '') {
403            $error = get_string('cliincorrectvalueretry', 'admin')."\n";
404        } else if (is_dataroot_insecure()) {
405            $CFG->dataroot = '';
406            $error = get_string('pathsunsecuredataroot', 'install')."\n";
407        } else {
408            if (install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) {
409                $error = '';
410            } else {
411                $a = (object)array('dataroot' => $CFG->dataroot);
412                $error = get_string('pathserrcreatedataroot', 'install', $a)."\n";
413            }
414        }
415
416    } while ($error !== '');
417
418} else {
419    if (is_dataroot_insecure()) {
420        cli_error(get_string('pathsunsecuredataroot', 'install'));
421    }
422    if (!install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) {
423        $a = (object)array('dataroot' => $CFG->dataroot);
424        cli_error(get_string('pathserrcreatedataroot', 'install', $a));
425    }
426}
427$CFG->tempdir       = $CFG->dataroot.'/temp';
428$CFG->cachedir      = $CFG->dataroot.'/cache';
429$CFG->localcachedir = $CFG->dataroot.'/localcache';
430
431// download required lang packs
432if ($CFG->lang !== 'en') {
433    $installer = new lang_installer($CFG->lang);
434    $results = $installer->run();
435    foreach ($results as $langcode => $langstatus) {
436        if ($langstatus === lang_installer::RESULT_DOWNLOADERROR) {
437            $a       = new stdClass();
438            $a->url  = $installer->lang_pack_url($langcode);
439            $a->dest = $CFG->dataroot.'/lang';
440            cli_problem(get_string('remotedownloaderror', 'error', $a));
441        }
442    }
443}
444
445// switch the string_manager instance to stop using install/lang/
446$CFG->early_install_lang = false;
447$CFG->langotherroot      = $CFG->dataroot.'/lang';
448$CFG->langlocalroot      = $CFG->dataroot.'/lang';
449get_string_manager(true);
450
451// make sure we are installing stable release or require a confirmation
452if (isset($maturity)) {
453    if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) {
454        $maturitylevel = get_string('maturity'.$maturity, 'admin');
455
456        if ($interactive) {
457            cli_separator();
458            cli_heading(get_string('notice'));
459            echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL;
460            echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL;
461            echo get_string('continue') . PHP_EOL;
462            $prompt = get_string('cliyesnoprompt', 'admin');
463            $input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
464            if ($input == get_string('clianswerno', 'admin')) {
465                exit(1);
466            }
467        } else {
468            cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel));
469            cli_error(get_string('maturityallowunstable', 'admin'));
470        }
471    }
472}
473
474// ask for db type - show only drivers available
475if ($interactive) {
476    $options['dbtype'] = strtolower($options['dbtype']);
477    cli_separator();
478    cli_heading(get_string('databasetypehead', 'install'));
479    foreach ($databases as $type=>$database) {
480        echo " $type \n";
481    }
482    if (!empty($databases[$options['dbtype']])) {
483        $prompt = get_string('clitypevaluedefault', 'admin', $options['dbtype']);
484    } else {
485        $prompt = get_string('clitypevalue', 'admin');
486    }
487    $CFG->dbtype = cli_input($prompt, $options['dbtype'], array_keys($databases));
488
489} else {
490    if (empty($databases[$options['dbtype']])) {
491        $a = (object)array('option'=>'dbtype', 'value'=>$options['dbtype']);
492        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
493    }
494    $CFG->dbtype = $options['dbtype'];
495}
496$database = $databases[$CFG->dbtype];
497
498
499// ask for db host
500if ($interactive) {
501    cli_separator();
502    cli_heading(get_string('databasehost', 'install'));
503    if ($options['dbhost'] !== '') {
504        $prompt = get_string('clitypevaluedefault', 'admin', $options['dbhost']);
505    } else {
506        $prompt = get_string('clitypevalue', 'admin');
507    }
508    $CFG->dbhost = cli_input($prompt, $options['dbhost']);
509
510} else {
511    $CFG->dbhost = $options['dbhost'];
512}
513
514// ask for db name
515if ($interactive) {
516    cli_separator();
517    cli_heading(get_string('databasename', 'install'));
518    if ($options['dbname'] !== '') {
519        $prompt = get_string('clitypevaluedefault', 'admin', $options['dbname']);
520    } else {
521        $prompt = get_string('clitypevalue', 'admin');
522    }
523    $CFG->dbname = cli_input($prompt, $options['dbname']);
524
525} else {
526    $CFG->dbname = $options['dbname'];
527}
528
529// ask for db prefix
530if ($interactive) {
531    cli_separator();
532    cli_heading(get_string('dbprefix', 'install'));
533    //TODO: solve somehow the prefix trouble for oci
534    if ($options['prefix'] !== '') {
535        $prompt = get_string('clitypevaluedefault', 'admin', $options['prefix']);
536    } else {
537        $prompt = get_string('clitypevalue', 'admin');
538    }
539    $CFG->prefix = cli_input($prompt, $options['prefix']);
540
541} else {
542    $CFG->prefix = $options['prefix'];
543}
544
545// ask for db port
546if ($interactive) {
547    cli_separator();
548    cli_heading(get_string('databaseport', 'install'));
549    $prompt = get_string('clitypevaluedefault', 'admin', $options['dbport']);
550    $CFG->dboptions['dbport'] = (int)cli_input($prompt, $options['dbport']);
551
552} else {
553    $CFG->dboptions['dbport'] = (int)$options['dbport'];
554}
555if ($CFG->dboptions['dbport'] <= 0) {
556    $CFG->dboptions['dbport'] = '';
557}
558
559// ask for db socket
560if ($CFG->ostype === 'WINDOWS') {
561    $CFG->dboptions['dbsocket'] = '';
562
563} else if ($interactive and empty($CFG->dboptions['dbport'])) {
564    cli_separator();
565    cli_heading(get_string('databasesocket', 'install'));
566    $prompt = get_string('clitypevaluedefault', 'admin', $options['dbsocket']);
567    $CFG->dboptions['dbsocket'] = cli_input($prompt, $options['dbsocket']);
568
569} else {
570    $CFG->dboptions['dbsocket'] = $options['dbsocket'];
571}
572
573// ask for db user
574if ($interactive) {
575    cli_separator();
576    cli_heading(get_string('databaseuser', 'install'));
577    if ($options['dbuser'] !== '') {
578        $prompt = get_string('clitypevaluedefault', 'admin', $options['dbuser']);
579    } else {
580        $prompt = get_string('clitypevalue', 'admin');
581    }
582    $CFG->dbuser = cli_input($prompt, $options['dbuser']);
583
584} else {
585    $CFG->dbuser = $options['dbuser'];
586}
587
588// ask for db password
589if ($interactive) {
590    cli_separator();
591    cli_heading(get_string('databasepass', 'install'));
592    do {
593        if ($options['dbpass'] !== '') {
594            $prompt = get_string('clitypevaluedefault', 'admin', $options['dbpass']);
595        } else {
596            $prompt = get_string('clitypevalue', 'admin');
597        }
598
599        $CFG->dbpass = cli_input($prompt, $options['dbpass']);
600        if (function_exists('distro_pre_create_db')) { // Hook for distros needing to do something before DB creation
601            $distro = distro_pre_create_db($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']), $distro);
602        }
603        $hint_database = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']));
604    } while ($hint_database !== '');
605
606} else {
607    $CFG->dbpass = $options['dbpass'];
608    $hint_database = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist'=>0, 'dbport'=>$CFG->dboptions['dbport'], 'dbsocket'=>$CFG->dboptions['dbsocket']));
609    if ($hint_database !== '') {
610        cli_error(get_string('dbconnectionerror', 'install'));
611    }
612}
613
614// ask for fullname
615if ($interactive) {
616    cli_separator();
617    cli_heading(get_string('fullsitename', 'moodle'));
618
619    if ($options['fullname'] !== '') {
620        $prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']);
621    } else {
622        $prompt = get_string('clitypevalue', 'admin');
623    }
624
625    do {
626        $options['fullname'] = cli_input($prompt, $options['fullname']);
627    } while (empty($options['fullname']));
628} else {
629    if (empty($options['fullname'])) {
630        $a = (object)array('option'=>'fullname', 'value'=>$options['fullname']);
631        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
632    }
633}
634
635// ask for shortname
636if ($interactive) {
637    cli_separator();
638    cli_heading(get_string('shortsitename', 'moodle'));
639
640    if ($options['shortname'] !== '') {
641        $prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']);
642    } else {
643        $prompt = get_string('clitypevalue', 'admin');
644    }
645
646    do {
647        $options['shortname'] = cli_input($prompt, $options['shortname']);
648    } while (empty($options['shortname']));
649} else {
650    if (empty($options['shortname'])) {
651        $a = (object)array('option'=>'shortname', 'value'=>$options['shortname']);
652        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
653    }
654}
655
656// ask for admin user name
657if ($interactive) {
658    cli_separator();
659    cli_heading(get_string('cliadminusername', 'install'));
660    if (!empty($options['adminuser'])) {
661        $prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']);
662    } else {
663        $prompt = get_string('clitypevalue', 'admin');
664    }
665    do {
666        $options['adminuser'] = cli_input($prompt, $options['adminuser']);
667    } while (empty($options['adminuser']) or $options['adminuser'] === 'guest');
668} else {
669    if (empty($options['adminuser']) or $options['adminuser'] === 'guest') {
670        $a = (object)array('option'=>'adminuser', 'value'=>$options['adminuser']);
671        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
672    }
673}
674
675// ask for admin user password
676if ($interactive) {
677    cli_separator();
678    cli_heading(get_string('cliadminpassword', 'install'));
679    $prompt = get_string('clitypevalue', 'admin');
680    do {
681        $options['adminpass'] = cli_input($prompt);
682    } while (empty($options['adminpass']) or $options['adminpass'] === 'admin');
683} else {
684    if (empty($options['adminpass']) or $options['adminpass'] === 'admin') {
685        $a = (object)array('option'=>'adminpass', 'value'=>$options['adminpass']);
686        cli_error(get_string('cliincorrectvalueerror', 'admin', $a));
687    }
688}
689
690if ($interactive) {
691    if (!$options['agree-license']) {
692        cli_separator();
693        cli_heading(get_string('copyrightnotice'));
694        echo "Moodle  - Modular Object-Oriented Dynamic Learning Environment\n";
695        echo get_string('gpl3')."\n\n";
696        echo get_string('doyouagree')."\n";
697        $prompt = get_string('cliyesnoprompt', 'admin');
698        $input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
699        if ($input == get_string('clianswerno', 'admin')) {
700            exit(1);
701        }
702    }
703} else {
704    if (!$options['agree-license']) {
705        cli_error(get_string('climustagreelicense', 'install'));
706    }
707}
708
709// Finally we have all info needed for config.php
710$configphp = install_generate_configphp($database, $CFG);
711umask(0137);
712if (($fh = fopen($configfile, 'w')) !== false) {
713    fwrite($fh, $configphp);
714    fclose($fh);
715}
716
717if (!file_exists($configfile)) {
718    cli_error('Can not create config file.');
719}
720
721// remember selected language
722$installlang = $CFG->lang;
723// return back to original dir before executing setup.php which changes the dir again
724chdir($olddir);
725// We have config.php, it is a real php script from now on :-)
726require($configfile);
727
728// use selected language
729$CFG->lang = $installlang;
730$SESSION->lang = $CFG->lang;
731
732require("$CFG->dirroot/version.php");
733
734// Test environment first.
735require_once($CFG->libdir . '/environmentlib.php');
736list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
737if (!$envstatus) {
738    $errors = environment_get_errors($environment_results);
739    cli_heading(get_string('environment', 'admin'));
740    foreach ($errors as $error) {
741        list($info, $report) = $error;
742        echo "!! $info !!\n$report\n\n";
743    }
744    exit(1);
745}
746
747// Test plugin dependencies.
748$failed = array();
749if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
750    cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed)))));
751    cli_error(get_string('pluginschecktodo', 'admin'));
752}
753
754install_cli_database($options, $interactive);
755
756echo get_string('cliinstallfinished', 'install')."\n";
757exit(0); // 0 means success
Note: See TracBrowser for help on using the repository browser.