Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402]
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
title
Description
Body
title
Description
Body
title
Description
Body
title
Body