weekly release 3.5.8+
[moodle.git] / admin / cli / upgrade.php
blob5915e24ea0346e8a12cee791cb2c5f5144e4fda2
1 <?php
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.
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/>.
18 /**
19 * This script creates config.php file and prepares database.
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
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
32 // Force OPcache reset if used, we do not want any stale caches
33 // when detecting if upgrade necessary or when running upgrade.
34 if (function_exists('opcache_reset') and !isset($_SERVER['REMOTE_ADDR'])) {
35 opcache_reset();
38 define('CLI_SCRIPT', true);
39 define('CACHE_DISABLE_ALL', true);
41 require(__DIR__.'/../../config.php');
42 require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions
43 require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions
44 require_once($CFG->libdir.'/clilib.php'); // cli only functions
45 require_once($CFG->libdir.'/environmentlib.php');
47 // now get cli options
48 $lang = isset($SESSION->lang) ? $SESSION->lang : $CFG->lang;
49 list($options, $unrecognized) = cli_get_params(
50 array(
51 'non-interactive' => false,
52 'allow-unstable' => false,
53 'help' => false,
54 'lang' => $lang
56 array(
57 'h' => 'help'
61 if ($options['lang']) {
62 $SESSION->lang = $options['lang'];
65 $interactive = empty($options['non-interactive']);
67 if ($unrecognized) {
68 $unrecognized = implode("\n ", $unrecognized);
69 cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
72 if ($options['help']) {
73 $help =
74 "Command line Moodle upgrade.
75 Please note you must execute this script with the same uid as apache!
77 Site defaults may be changed via local/defaults.php.
79 Options:
80 --non-interactive No interactive questions or confirmations
81 --allow-unstable Upgrade even if the version is not marked as stable yet,
82 required in non-interactive mode.
83 --lang=CODE Set preferred language for CLI output. Defaults to the
84 site language if not set. Defaults to 'en' if the lang
85 parameter is invalid or if the language pack is not
86 installed.
87 -h, --help Print out this help
89 Example:
90 \$sudo -u www-data /usr/bin/php admin/cli/upgrade.php
91 "; //TODO: localize - to be translated later when everything is finished
93 echo $help;
94 die;
97 if (empty($CFG->version)) {
98 cli_error(get_string('missingconfigversion', 'debug'));
101 require("$CFG->dirroot/version.php"); // defines $version, $release, $branch and $maturity
102 $CFG->target_release = $release; // used during installation and upgrades
104 if ($version < $CFG->version) {
105 cli_error(get_string('downgradedcore', 'error'));
108 $oldversion = "$CFG->release ($CFG->version)";
109 $newversion = "$release ($version)";
111 if (!moodle_needs_upgrading()) {
112 cli_error(get_string('cliupgradenoneed', 'core_admin', $newversion), 0);
115 // Test environment first.
116 list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE);
117 if (!$envstatus) {
118 $errors = environment_get_errors($environment_results);
119 cli_heading(get_string('environment', 'admin'));
120 foreach ($errors as $error) {
121 list($info, $report) = $error;
122 echo "!! $info !!\n$report\n\n";
124 exit(1);
127 // Test plugin dependencies.
128 $failed = array();
129 if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) {
130 cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed)))));
131 cli_error(get_string('pluginschecktodo', 'admin'));
134 $a = new stdClass();
135 $a->oldversion = $oldversion;
136 $a->newversion = $newversion;
138 if ($interactive) {
139 echo cli_heading(get_string('databasechecking', '', $a)) . PHP_EOL;
142 // make sure we are upgrading to a stable release or display a warning
143 if (isset($maturity)) {
144 if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) {
145 $maturitylevel = get_string('maturity'.$maturity, 'admin');
147 if ($interactive) {
148 cli_separator();
149 cli_heading(get_string('notice'));
150 echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL;
151 echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL;
152 cli_separator();
153 } else {
154 cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel));
155 cli_error(get_string('maturityallowunstable', 'admin'));
160 if ($interactive) {
161 echo html_to_text(get_string('upgradesure', 'admin', $newversion))."\n";
162 $prompt = get_string('cliyesnoprompt', 'admin');
163 $input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin')));
164 if ($input == get_string('clianswerno', 'admin')) {
165 exit(1);
169 if ($version > $CFG->version) {
170 // We purge all of MUC's caches here.
171 // Caches are disabled for upgrade by CACHE_DISABLE_ALL so we must set the first arg to true.
172 // This ensures a real config object is loaded and the stores will be purged.
173 // This is the only way we can purge custom caches such as memcache or APC.
174 // Note: all other calls to caches will still used the disabled API.
175 cache_helper::purge_all(true);
176 upgrade_core($version, true);
178 set_config('release', $release);
179 set_config('branch', $branch);
181 // unconditionally upgrade
182 upgrade_noncore(true);
184 // log in as admin - we need doanything permission when applying defaults
185 \core\session\manager::set_user(get_admin());
187 // apply all default settings, just in case do it twice to fill all defaults
188 admin_apply_default_settings(NULL, false);
189 admin_apply_default_settings(NULL, false);
191 // This needs to happen at the end to ensure it occurs after all caches
192 // have been purged for the last time.
193 // This will build a cached version of the current theme for the user
194 // to immediately start browsing the site.
195 upgrade_themes();
197 echo get_string('cliupgradefinished', 'admin', $a)."\n";
198 exit(0); // 0 means success