moodle/admin/cliupgrade.php

1227 lines
47 KiB
PHP

<?php
/**
* cliupgrade.php
* Command Line Installer and Upgrader for Moodle
* @author Dilan Anuruddha
*
*/
//Intruders OUT!!!
if (!empty($_SERVER['GATEWAY_INTERFACE'])){
error_log("cli-installer should not be called from apache!");
echo 'This script is not accessible from the webserver';
exit;
}
/**
* BEFORE YOU ADD/EDIT/DELETE ANYTHING IN THIS DOCUMENT PLEASE READ
*
* When you add some code that print something on to standard out always wrap it around if clause with $verbose
* argument check. If the $verbose is CLI_NO, you shouldn't print anything. If $verboser is CLI_SEMI it's ok to print a
* summarized version. If $verbose is CLI_FULL you can print anything you want.
*
* When you add a code that read input from the standard input you should wrap it with appropriate if clause, allowing
* required level of interaction. Also remember to add the same option as a command line argument list.
* In CLI_FULL interaction mode, whether you have set the argument in commandline or not you
* should prompt for user input. In CLI_SEMI interaction only the arguments which are not set are prompted for user input.
* No interaction mode doesn't prompt user for anyinput. If any argument is not specified then the default value should be assumed.
* So do the appropriate thing considering this when you edit or delete this code
*
*/
//=============================================================================//
// Set values for initial structures
//Suppress all errors
error_reporting(E_ALL);
//define constants
define('CLI_VAL_OPT',0);
define('CLI_VAL_REQ',1);
define('CLI_NO',0);
define('CLI_SEMI',1);
define('CLI_FULL',2);
define('CLI_UPGRADE',1);
/// Default array contain default values for all installation options
/// Please see after library inclusion for more default values - which require libraries
$DEFAULT=array();
// Set default values
$DEFAULT['lang'] = 'en_utf8';
$DEFAULT['dbhost'] = 'localhost';
$DEFAULT['dbuser'] = '';
$DEFAULT['dbpass'] = '';
$DEFAULT['dbtype'] = 'mysql';
$DEFAULT['dbname'] = 'moodle';
$DEFAULT['prefix'] = 'mdl_';
$DEFAULT['downloadlangpack']= false;
$DEFAULT['wwwroot'] = '';
$DEFAULT['dirroot'] = dirname(dirname((__FILE__)));
$DEFAULT['dataroot'] = dirname(dirname(dirname(__FILE__))) . '/moodledata';
$DEFAULT['admindirname'] = 'admin';
$DEFAULT['verbose'] = CLI_SEMI;
$DEFAULT['interactivelevel']= CLI_SEMI;
$DEFAULT['agreelicense'] = true;
$DEFAULT['confirmrelease'] = true;
$DEFAULT['sitefullname'] = 'Moodle Site (Please Change Site Name!!)';
$DEFAULT['siteshortname'] = 'moodle';
$DEFAULT['sitesummary'] = 'Brief Description of the site';
$DEFAULT['sitenewsitems'] = 3;
$DEFAULT['adminusername'] = 'admin';
$DEFAULT['adminpassword'] = 'admin';
$DEFAULT['adminemail'] = 'root@localhost';
///set valid long options ans state whether value for options is required or optional
/// Example :If value is required it would be legal to write the script like $php cliupgrade --lang=en_utf8
/// but writing the script like $php cliupgrade --lang would be illegal.
/// As you may have already seen $php cliupgrade --help is valid since hep argument had CLI_VAL_OPT set
$LONG_OPTIONS = array(
'lang' =>CLI_VAL_REQ,
'webaddr' =>CLI_VAL_REQ,
'moodledir' =>CLI_VAL_REQ,
'datadir' =>CLI_VAL_REQ,
'dbtype' =>CLI_VAL_REQ,
'dbhost' =>CLI_VAL_REQ,
'dbname' =>CLI_VAL_REQ,
'dbuser' =>CLI_VAL_REQ,
'dbpass' =>CLI_VAL_REQ,
'prefix' =>CLI_VAL_REQ,
'agreelicense' =>CLI_VAL_REQ,
'confirmrelease' =>CLI_VAL_REQ,
'sitefullname' =>CLI_VAL_REQ,
'siteshortname' =>CLI_VAL_REQ,
'sitesummary' =>CLI_VAL_REQ,
'sitenewsitems' =>CLI_VAL_REQ,
'adminfirstname' =>CLI_VAL_REQ,
'adminlastname' =>CLI_VAL_REQ,
'adminusername' =>CLI_VAL_REQ,
'adminpassword' =>CLI_VAL_REQ,
'adminemail' =>CLI_VAL_REQ,
'verbose' =>CLI_VAL_REQ,
'interactivelevel' =>CLI_VAL_REQ,
'help' =>CLI_VAL_OPT);
//Initialize the intall array
$INSTALL=array();
$SESSION->lang = $DEFAULT['lang'];
$CFG->dirroot = $DEFAULT['dirroot'];
$CFG->libdir = $DEFAULT['dirroot'].'/lib';
$CFG->dataroot = $DEFAULT['dataroot'];
$CFG->admin = $DEFAULT['admindirname'];
$CFG->directorypermissions = 00777;
$CFG->running_installer = true;
$COURSE->id = 0;
// include standard Moodle libraries
require_once($CFG->libdir.'/installlib.php');
require_once($CFG->libdir.'/clilib.php'); //cli-library
require_once($CFG->libdir.'/setuplib.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/moodlelib.php');
require_once($CFG->libdir.'/weblib.php');
require_once($CFG->libdir.'/environmentlib.php');
require_once($CFG->libdir.'/componentlib.class.php');
require_once($CFG->dirroot.'/version.php');
error('TODO fix CLI installer'); //TODO: fix cli installer
/// Set default values - things that require the libraries
$DEFAULT['adminfirstname'] = get_string('admin');
$DEFAULT['adminlastname'] = get_string('user');
/// Set version and release
$INSTALL['version'] = $version;
$INSTALL['release'] = $release;
//========================================================================================//
//Command line option processing//
//fetch arguments
$args = Console_Getopt::readPHPArgv();
//checking errors for argument fetching
if (PEAR::isError($args)) {
console_write('pearargerror','install');
die();
}
//short options
$short_opts = '';
//long options
$long_opts = create_long_options($LONG_OPTIONS);
//get the argumets to options array
if ( realpath($_SERVER['argv'][0]) == __FILE__ && count($args)>1) {
$console_opt = Console_Getopt::getOpt($args,$short_opts,$long_opts);
} else {
$console_opt = Console_Getopt::getOpt($args,$short_opts,$long_opts);
}
//detect erros in the options
if (PEAR::isError($console_opt)) {
console_write('invalidargumenthelp');
console_write( "\n", '', false);
die();
}
//Get the option values to an array of option keys and values
$options=get_options($console_opt);
// if user want help print the help without validating option values
if (is_array($options)) {
if(array_key_exists('help',$options)){
console_write('usagehelp');
console_write( "\n", '', false);
die ;
}
}
//check for validity of options and exit if errors found
validate_option_values($options);
// insert options array options into INSTALL array
foreach ( $options as $key=>$value) {
//map input argument value to INSTALL array values, Argument names kept bcoz they make sense!!!
if ( $key == 'moodledir') {
$key='dirroot';
} else if ($key == 'webaddr'){
$key='wwwroot';
} else if ($key == 'datadir') {
$key = 'dataroot';
}
$INSTALL[$key]=$value;
}
// if verbose is not set at commandline assume default values
if (!isset($INSTALL['verbose'])) {
$INSTALL['verbose']=$DEFAULT['verbose'];
}
//if interactive level is not set at commandline assume default value
if (!isset($INSTALL['interactivelevel'])) {
$INSTALL['interactivelevel'] = $DEFAULT['interactivelevel'];
}
// set references for interactive level and verbose install array
$interactive = &$INSTALL['interactivelevel'];
$verbose = &$INSTALL['verbose'];
if (!file_exists(dirname(dirname(__FILE__)) . '/config.php')) {
$configfile = dirname(dirname(__FILE__)) . '/config.php';
//welcome message
if ($verbose > CLI_NO) {
console_write( "\n", '', false);
console_write( "\n", '', false);
console_write('welcometext','install');
console_write( "\n", '', false);
console_write( "\n", '', false);
}
//============================================================================//
//Language selection for the installation
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['lang'])) ) ) {
$langs=get_installer_list_of_languages();
console_write( "\n", '', false);
console_write( "\n", '', false);
console_write('selectlanguage','install');
console_write( "\n", '', false);
console_write('availablelangs','install');
console_write( "\n", '', false);
//output available languages
foreach ( $langs as $language ) {
console_write("\t",'',false);
console_write($language,'',false);
console_write("\n",'',false);
}
console_write( "\n", '', false);
console_write('yourchoice','install');
$short_code_langs = get_short_codes($langs);
$INSTALL['lang']=read_element($short_code_langs);
$SESSION->lang = $INSTALL['lang'];
}
//==============================================================================//
//Checking PHP settings
$silent=false;
if ($verbose == CLI_NO) {
$silent=true;
}else{
console_write( "\n", '', false);
console_write('checkingphpsettings','install');
console_write( "\n", '', false);
}
/// Check that PHP is of a sufficient version
check_compatibility(inst_check_php_version(), get_string('phpversion', 'install'), get_string('php52versionerror', 'install'),false,$silent);
/// Check session auto start
check_compatibility(!ini_get_bool('session.auto_start'), get_string('sessionautostart', 'install'), get_string('sessionautostarterror', 'install'),false,$silent);
/// Check magic quotes
check_compatibility(!ini_get_bool('magic_quotes_runtime'), get_string('magicquotesruntime', 'install'), get_string('magicquotesruntimeerror', 'install'),false,$silent);
/// Check unsupported PHP configuration
check_compatibility(ini_get_bool('register_globals'), get_string('globalsquotes', 'install'), get_string('globalswarning', 'install'),false,$silent);
/// Check safe mode
check_compatibility(!ini_get_bool('safe_mode'), get_string('safemode', 'install'), get_string('safemodeerror', 'install'), true,$silent);
/// Check file uploads
check_compatibility(ini_get_bool('file_uploads'), get_string('fileuploads', 'install'), get_string('fileuploadserror', 'install'), true,$silent);
/// Check GD version
check_compatibility(check_gd_version(), get_string('gdversion', 'install'), get_string('gdversionerror', 'install'), true,$silent);
/// Check memory limit
check_compatibility(check_memory_limit(), get_string('memorylimit', 'install'), get_string('memorylimiterror', 'install'), true,$silent);
//================================================================================//
// Moodle directories and web address
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dirroot']) || !isset($INSTALL['wwwroot']) || !isset($INSTALL['dataroot']) ) ) ) {
console_write( "\n", '', false);
console_write( "\n", '', false);
console_write('locationanddirectories','install');
console_write( "\n", '', false);
console_write( "\n", '', false);
}
//input the web directory
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dirroot'])) ) ) {
console_write('inputwebdirectory','install');
//if directories validation lib is found change this to read_dir() and
//edit read_dir() in lib/installlib.php to point to validation code
$INSTALL['dirroot']=read();
}
//input the web adress
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['wwwroot'])) ) ) {
console_write('inputwebadress','install');
$INSTALL['wwwroot']=read_url();
}
//input data directory
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dataroot'])) ) ) {
console_write('inputdatadirectory','install');
//if directories validation lib is found change this to read_dir() and
//edit read_dir() in lib/installlib.php to point to validation code
$INSTALL['dataroot']=read();
}
/// check wwwroot
if (ini_get('allow_url_fopen') && false) { /// This was not reliable
if (($fh = @fopen($INSTALL['wwwroot']."/$CFG->admin/cliupgrade.php", 'r')) === false) {
console_write_error(get_string('wwwrooterror'),'install',false);
}
}
if (isset($fh)) fclose($fh);
/// check dirroot
if (($fh = @fopen($INSTALL['dirroot']."/$CFG->admin/cliupgrade.php", 'r')) === false ) {
console_write_error(get_string('dirrooterror'),'install',false);
}
if (isset($fh)) fclose($fh);
/// check dataroot
$CFG->dataroot = $INSTALL['dataroot'];
if (make_upload_directory('sessions', false) === false ) {
console_write_error(get_string('datarooterror'),'install',false);
}
//================================================================================//
// Database settings Moodle database
// Database section heading
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dbhost']) || !isset($INSTALL['dbname']) || !isset($INSTALL['dbtype']) || !isset($INSTALL['dbuser']) || !isset($INSTALL['dbpass']) || !isset($INSTALL['prefix']) ) ) ) {
console_write( "\n", '', false);
console_write( "\n", '', false);
console_write('databasesettingsformoodle','install');
console_write( "\n", '', false);
console_write( "\n", '', false);
}
//Input dialogs
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dbhost']) ))) {
console_write('databasehost','install');
$INSTALL['dbhost']=read(); // localhost
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dbname']) ))) {
console_write('databasename','install');
$INSTALL['dbname']=read(); //'moodletest3';
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dbtype']) ))) {
$dbtypes=array('mysql','oci8po','postgres7','mssql','mssql_n','odbc_mssql');
console_write( "\n", '', false);
console_write('availabledbtypes','install');
console_write( "\n", '', false);
foreach ($dbtypes as $dbtype) {
console_write("\t",'',false);
console_write($dbtype,'install');
console_write("\n",'',false);
}
console_write('yourchoice','install');
$INSTALL['dbtype']=read_element($dbtypes);//'mysql';//
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dbuser']) ))) {
console_write('databaseuser','install');
$INSTALL['dbuser']=read();//'root';
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['dbpass']) ))) {
console_write('databasepass','install');
$INSTALL['dbpass']=read();//'';
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['prefix']) ))) {
console_write('tableprefix','install');
$INSTALL['prefix']=read();//'mdl_';//
}
// Running validation tests
/// different format for postgres7 by socket
if ($INSTALL['dbtype'] == 'postgres7' and ($INSTALL['dbhost'] == 'localhost' || $INSTALL['dbhost'] == '127.0.0.1')) {
$INSTALL['dbhost'] = "user='{$INSTALL['dbuser']}' password='{$INSTALL['dbpass']}' dbname='{$INSTALL['dbname']}'";
$INSTALL['dbuser'] = '';
$INSTALL['dbpass'] = '';
$INSTALL['dbname'] = '';
if ($INSTALL['prefix'] == '') { /// must have a prefix
$INSTALL['prefix'] = 'mdl_';
}
}
if ($INSTALL['dbtype'] == 'mysql') { /// Check MySQL extension is present
if (!extension_loaded('mysql')) {
$errormsg = get_string('mysqlextensionisnotpresentinphp', 'install');
}
}
if ($INSTALL['dbtype'] == 'postgres7') { /// Check PostgreSQL extension is present
if (!extension_loaded('pgsql')) {
$errormsg = get_string('pgsqlextensionisnotpresentinphp', 'install');
}
}
if ($INSTALL['dbtype'] == 'mssql') { /// Check MSSQL extension is present
if (!function_exists('mssql_connect')) {
$errormsg = get_string('mssqlextensionisnotpresentinphp', 'install');
}
}
if ($INSTALL['dbtype'] == 'mssql_n') { /// Check MSSQL extension is present
if (!function_exists('mssql_connect')) {
$errormsg = get_string('mssqlextensionisnotpresentinphp', 'install');
}
}
if ($INSTALL['dbtype'] == 'odbc_mssql') { /// Check ODBC extension is present
if (!extension_loaded('odbc')) {
$errormsg = get_string('odbcextensionisnotpresentinphp', 'install');
}
}
if ($INSTALL['dbtype'] == 'oci8po') { /// Check OCI extension is present
if (!extension_loaded('oci8')) {
$errormsg = get_string('ociextensionisnotpresentinphp', 'install');
}
}
if (empty($INSTALL['prefix']) && $INSTALL['dbtype'] != 'mysql') { // All DBs but MySQL require prefix (reserv. words)
$errormsg = get_string('dbwrongprefix', 'install');
}
if ($INSTALL['dbtype'] == 'oci8po' && strlen($INSTALL['prefix']) > 2) { // Oracle max prefix = 2cc (30cc limit)
$errormsg = get_string('dbwrongprefix', 'install');
}
if ($INSTALL['dbtype'] == 'oci8po' && !empty($INSTALL['dbhost'])) { // Oracle host must be blank (tnsnames.ora has it)
$errormsg = get_string('dbwronghostserver', 'install');
}
if (empty($errormsg)) {
error_reporting(0); // Hide errors
if (! $dbconnected = $DB->connect($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'], $INSTALL['prefix'])) {
if (!$DB->create_database($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'])) {
$errormsg = get_string('dbcreationerror', 'install');
$nextstage = DATABASE;
} else {
$dbconnected = $DB->connect($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'], $INSTALL['prefix']);
}
} else {
// TODO: db encoding checks ??
}
}
// check for errors in db section
if (isset($errormsg)) {
console_write_error($errormsg,'',false);
}
//==========================================================================//
// Check the environment
//check connection to database
if ($dbconnected) {
/// Execute environment check, printing results
if (!check_moodle_environment($INSTALL['release'], $environment_results, false)) {
$errormsg = get_string('errorsinenvironment', 'install') . "\n";
}
} else {
/// We never should reach this because DB has been tested before arriving here
$errormsg = get_string('dbconnectionerror', 'install');
}
// check for errors in environment
if (isset($errormsg)) {
console_write_error($errormsg,'',false);
}
// Print Environment Status
if ($verbose > CLI_NO) {
print_environment_status($environment_results);
}
//==============================================================================//
//download the language pack if it doesn't exist
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['downloadlangaugepack']) ))) {
$site_langs=get_list_of_languages();
if (!key_exists($INSTALL['lang'],$site_langs)) {
console_write( "\n", '', false);
console_write( "\n", '', false);
console_write('downloadlanguagepack','install');
$download_lang_pack=read_yes_no();
if($download_lang_pack == 'yes'){
$downloadsuccess = false;
/// Create necessary lang dir
if (!make_upload_directory('lang', false)) {
console_write_error(get_string('cannotcreatelangdir','error'),false);
}
/// Download and install component
if (($cd = new component_installer('http://download.moodle.org', 'lang16',
$INSTALL['lang'].'.zip', 'languages.md5', 'lang')) && empty($errormsg)) {
$status = $cd->install(); //returns ERROR | UPTODATE | INSTALLED
switch ($status) {
case ERROR:
if ($cd->get_error() == 'remotedownloadnotallowed') {
$a = new stdClass();
$a->url = 'http://download.moodle.org/lang16/'.$pack.'.zip';
$a->dest= $CFG->dataroot.'/lang';
console_write(get_string($cd->get_error(), 'error', $a),false);
} else {
$downloaderror = get_string($cd->get_error(), 'error');
console_write(get_string($cd->get_error(), 'error'),false);
}
break;
case UPTODATE:
case INSTALLED:
$downloadsuccess = true;
break;
default:
//We shouldn't reach this point
}
} else {
//We shouldn't reach this point
}
}
}
}
if ( $verbose > CLI_NO && !empty($downloadsuccess)) {
//print success message if language pack download is successful
console_write('downloadsuccess');
print_newline();
}
$CONFFILE = array();
//==================================================================================//
//set INSTALL array values to CONFFILE array
foreach ($INSTALL as $key => $value) {
$CONFFILE[$key] = $value;
}
//==================================================================================//
//if any value is not set, set default values
foreach ($DEFAULT as $key => $value){
if (!isset($INSTALL[$key])){
$CONFFILE[$key]=$value;
}
}
//==================================================================================//
//create configuration file depending on the previous settings
if ($verbose > CLI_NO) {
console_write('creatingconfigfile','install');
console_write( "\n", '', false);
}
$str = '<?php /// Moodle Configuration File '."\r\n";
$str .= "\r\n";
$str .= 'unset($CFG);'."\r\n";
$str .= '$CFG = new stdClass();'."\r\n"; // prevent PHP5 strict warnings
$str .= "\r\n";
$database = $databases[$CONFFILE['dbtype']];
$dbconfig = $database->export_dbconfig($CONFFILE['dbhost'], $CONFFILE['dbuser'], $CONFFILE['dbpass'], $CONFFILE['dbname'], $CONFFILE['prefix']);
foreach ($dbconfig as $key=>$value) {
$key = str_pad($key, 9);
$str .= '$CFG->'.$key.' = '.var_export($value, true).";\r\n";
}
$str .= "\r\n";
$str .= '$CFG->wwwroot = '.var_export($CONFFILE['wwwrootform'], true).";\r\n";
$str .= '$CFG->dirroot = '.var_export($CONFFILE['dirrootform'], true).";\r\n";
$str .= '$CFG->dataroot = '.var_export($CONFFILE['dataroot'], true).";\r\n";
$str .= '$CFG->admin = '.var_export($CONFFILE['admindirname'], true).";\r\n";
$str .= "\r\n";
$str .= '$CFG->directorypermissions = 00777; // try 02777 on a server in Safe Mode'."\r\n";
$str .= "\r\n";
$str .= 'require_once("$CFG->dirroot/lib/setup.php");'."\r\n";
$str .= '// MAKE SURE WHEN YOU EDIT THIS FILE THAT THERE ARE NO SPACES, BLANK LINES,'."\r\n";
$str .= '// RETURNS, OR ANYTHING ELSE AFTER THE TWO CHARACTERS ON THE NEXT LINE.'."\r\n";
$str .= '?>';
umask(0133);
//save the configuration file
if (( $configsuccess = ($fh = @fopen($configfile, 'w')) ) !== false) {
fwrite($fh, $str);
fclose($fh);
if ($verbose > CLI_NO) {
console_write('configfilecreated','install');
console_write( "\n", '', false);
}
} else {
console_write('configfilenotwritten','install');
console_write( "\n", '', false);
console_write( "\n", '', false);
console_write_error( $str, '', false);
}
if ( $verbose ) {
console_write('installationiscomplete','install');
console_write( "\n", '', false);
}
}
if ( file_exists(dirname(dirname(__FILE__)) . '/config.php')) {
// This is what happens if there is no upgrade....
//console_write_error('configurationfileexist','install');
//console_write( "\n", '', false);
//die;
// If the configuration file does not exists exit, this should never occur !!
if (!file_exists(dirname(dirname(__FILE__)) . '/config.php')) {
console_write_error('configfiledoesnotexist','install');
}
/// Check that PHP is of a sufficient version
/// Moved here because older versions do not allow while(@ob_end_clean());
if (version_compare(phpversion(), "5.2.4") < 0) {
$phpversion = phpversion();
console_write_error("Sorry, Moodle requires PHP 5.2.4 or later (currently using version $phpversion)",'',false);
}
/// Turn off time limits and try to flush everything all the time, sometimes upgrades can be slow.
@set_time_limit(0);
@ob_implicit_flush(true);
//check with someone who know? that does this do?
// while(@ob_end_clean()); // ob_end_flush prevents sending of headers
//unset();
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once($CFG->libdir.'/adminlib.php'); // Contains various admin-only functions
/**
* @todo check upgrade status, if upgrader is running already, notify user and exit.
* existing thing might work for this with some modifications
*
*/
///check PHP Settings
if (ini_get_bool('session.auto_start')) {
console_write_error("The PHP server variable 'session.auto_start' should be Off ",'',false);
}
if (ini_get_bool('magic_quotes_runtime')) {
console_write_error("The PHP server variable 'magic_quotes_runtime' should be Off ",'',false);
}
if (!ini_get_bool('file_uploads')) {
console_write_error("The PHP server variable 'file_uploads' is not turned On" ,'',false);
}
/// Check that config.php has been edited
if ($CFG->wwwroot == "http://example.com/moodle") {
console_write_error("Moodle has not been configured yet. You need to edit config.php first.",'',false);
}
/// Check settings in config.php
$dirroot = dirname(realpath("../index.php"));
if (!empty($dirroot) and $dirroot != $CFG->dirroot) {
console_write_error("Please fix your settings in config.php:
\nYou have:
\n\$CFG->dirroot = \"".addslashes($CFG->dirroot)."\";
\nbut it should be:
\n\$CFG->dirroot = \"".addslashes($dirroot)."\";",'',false);
}
/// Set some necessary variables during set-up to avoid PHP warnings later on this page
if (!isset($CFG->release)) {
$CFG->release = "";
}
if (!isset($CFG->version)) {
$CFG->version = "";
}
if (is_readable("$CFG->dirroot/version.php")) {
include_once("$CFG->dirroot/version.php"); # defines $version
}
if (!$version or !$release) {
console_write_error('Main version.php was not readable or specified','',false);# without version, stop
}
if ( $verbose == CLI_NO ) {
$DB->set_debug(false);
} else if ( $verbose == CLI_FULL ) {
$DB->set_debug (true);
}
/// Check if the main tables have been installed yet or not.
if (!$tables = $DB->get_tables() ) { // No tables yet at all.
$maintables = false;
} else { // Check for missing main tables
$maintables = true;
$mtables = array("config", "course", "course_categories", "course_modules",
"course_sections", "log", "log_display", "modules",
"user");
foreach ($mtables as $mtable) {
if (!in_array($mtable, $tables)) {
$maintables = false;
break;
}
}
}
if (! $maintables) {
/// hide errors from headers in case debug enabled in config.php
$origdebug = $CFG->debug;
$CFG->debug = DEBUG_MINIMAL;
error_reporting($CFG->debug);
if ( $interactive == CLI_FULL || ($interactive == CLI_SEMI && (!isset($INSTALL['agreelicense']) || empty($INSTALL['agreelicense']))) ) {
//Print copyright notice and ask to continue
console_write(get_string('copyrightnotice'),'',false);
print_newline();
console_write(get_string('gpl'),'',false);
print_newline();
console_write('doyouagree','install',true);
$agreelicense = read_boolean();
}
if ( !isset($agreelicense)) {
$agreelicense = $DEFAULT['agreelicense'];
}
if (!$agreelicense) {
console_write_error('disagreelicense');
}
if ( $interactive == CLI_FULL || ( $interactive == CLI_SEMI && (!isset($INSTALL['confirmrelease']) || empty($INSTALL['confirmrelease'])))) {
console_write(get_string("currentrelease"),'',false);
print_newline();
console_write("Moodle $release",'',false);
print_newline();
console_write('askcontinue');
$confirmrelease = read_boolean();
}
if (!isset($confirmrelease)) {
$confirmrelease = $DEFAULT['confirmrelease'];
}
if (!$confirmrelease) {
console_write_error('versionerror');
}
$strdatabasesetup = get_string("databasesetup");
$strdatabasesuccess = get_string("databasesuccess");
// print_header($strdatabasesetup, $strdatabasesetup, $strdatabasesetup,
// "", upgrade_get_javascript(), false, "&nbsp;", "&nbsp;");
/// return to original debugging level
$CFG->debug = $origdebug;
error_reporting($CFG->debug);
upgrade_started();
/// Both old .sql files and new install.xml are supported
/// But we prioritise install.xml (XMLDB) if present
if (!$DB->setup_is_unicodedb()) {
if (!$DB->change_db_encoding()) {
// If could not convert successfully, throw error, and prevent installation
console_write_error('unicoderequired', 'admin');
}
}
$DB->get_manager()->install_from_xmldb_file("$CFG->libdir/db/install.xml"); //New method
/// Continue with the instalation
// Install the roles system.
moodle_install_roles();
// Write default settings unconditionally (i.e. even if a setting is already set, overwrite it)
// (this should only have any effect during initial install).
$adminroot = admin_get_root();
$adminroot->prune('backups'); // backup settings table not created yet
admin_apply_default_settings($adminroot);
/// This is used to handle any settings that must exist in $CFG but which do not exist in
/// admin_get_root()/$ADMIN as admin_setting objects (there are some exceptions).
apply_default_exception_settings(array('alternateloginurl' => '',
'auth' => 'email',
'auth_pop3mailbox' => 'INBOX',
'changepassword' => '',
'enrol' => 'manual',
'enrol_plugins_enabled' => 'manual',
'guestloginbutton' => 1,
'registerauth' => 'email',
'style' => 'default',
'template' => 'default',
'theme' => 'standardwhite',
'filter_multilang_converted' => 1));
notify($strdatabasesuccess, "green");
require_once $CFG->dirroot.'/mnet/lib.php';
}
/// Check version of Moodle code on disk compared with database
/// and upgrade if possible.
if (file_exists("$CFG->dirroot/lib/db/upgrade.php")) {
include_once("$CFG->dirroot/lib/db/upgrade.php"); # defines new upgrades
}
$stradministration = get_string("administration");
if ($CFG->version) {
if ($version > $CFG->version) { // upgrade
$a->oldversion = "$CFG->release ($CFG->version)";
$a->newversion = "$release ($version)";
$strdatabasechecking = get_string("databasechecking", "", $a);
// hide errors from headers in case debug is enabled
$origdebug = $CFG->debug;
$CFG->debug = DEBUG_MINIMAL;
error_reporting($CFG->debug);
// logout in case we are upgrading from pre 1.7 version - prevention of weird session problems
if ($CFG->version < 2006050600) {
require_logout();
}
if (empty($confirmupgrade)) {
if ( $interactive == CLI_FULL || ($interactive == CLI_SEMI && !isset($INSTALL['confirmupgrade']))) {
print_newline();
console_write($strdatabasechecking,'',false);
print_newline();
console_write('askcontinue');
$confirmupgrade = read_boolean();
}
}
if (empty($confirmrelease)) {
if ( $interactive == CLI_FULL || ($interactive == CLI_SEMI && !isset($INSTALL['confirmrelease']))) {
$strcurrentrelease = get_string("currentrelease");
console_write($strcurrentrelease,'',false);
print_newline();
console_write("Moodle $release",'',false);
print_newline();
console_write(get_string('releasenoteslink', 'install', 'http://docs.moodle.org/en/Release_Notes'),'',false);
print_newline();
console_write('askcontinue');
$confirmrelease = read_boolean();
}
require_once($CFG->libdir.'/environmentlib.php');
console_write('environment', 'admin');
if (!check_moodle_environment($release, $environment_results, false)) {
// Print Environment Status
if ($verbose > CLI_NO) {
print_newline();
print_environment_status_detailed($environment_results);
print_newline();
console_write('environmenterrorupgrade', 'admin');
}
if(!read_boolean()){
console_write_error('','',false);
}
} else {
if ( $interactive == CLI_FULL || $interactive == CLI_SEMI) {
console_write('environmentok', 'admin');
}
}
}
$strdatabasesuccess = get_string("databasesuccess");
/// return to original debugging level
$CFG->debug = $origdebug;
error_reporting($CFG->debug);
upgrade_started();
/// Upgrade current language pack if we can
upgrade_language_pack();
if ( $verbose > CLI_NO ) {
console_write($strdatabasechecking,'',false);
}
/// Launch the old main upgrade (if exists)
$status = true;
if (function_exists('main_upgrade')) {
$status = main_upgrade($CFG->version);
}
/// If succesful and exists launch the new main upgrade (XMLDB), called xmldb_main_upgrade
if ($status && function_exists('xmldb_main_upgrade')) {
$status = xmldb_main_upgrade($CFG->version);
}
/// If successful, continue upgrading roles and setting everything properly
if ($status) {
if (!update_capabilities()) {
console_write_error('Had trouble upgrading the core capabilities for the Roles System','',false);
}
if (set_config("version", $version)) {
remove_dir($CFG->dataroot . '/cache', true); // flush cache
notify($strdatabasesuccess, "green");
/// print_continue("upgradesettings.php");
} else {
console_write_error('Upgrade failed! (Could not update version in config table)','',false);
}
/// Main upgrade not success
} else {
console_write_error('Main Upgrade failed! See lib/db/upgrade.php','',false);
}
} else if ($version < $CFG->version) {
notify("WARNING!!! The code you are using is OLDER than the version that made these databases!");
}
} else {
if (!set_config("version", $version)) {
console_write_error("A problem occurred inserting current version into databases",'',false);
}
}
/// Find and check all main modules and load them up or upgrade them if necessary
/// first old *.php update and then the new upgrade.php script
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingactivitymodule','install'),'',1);
}
upgrade_activity_modules('');// Don't return anywhere
/// Check all questiontype plugins and upgrade if necessary
/// first old *.php update and then the new upgrade.php script
/// It is important that this is done AFTER the quiz module has been upgraded
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingqtypeplugin','install'),'',1);
}
upgrade_plugins('qtype', 'question/type', ''); // Don't return anywhere
/// Check all blocks and load (or upgrade them if necessary)
/// first old *.php update and then the new upgrade.php script
require_once("$CFG->dirroot/lib/blocklib.php");
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingblocksplugin','install'),'',1);
}
upgrade_blocks_plugins(''); // Don't return anywhere
/// Check all enrolment plugins and upgrade if necessary
/// first old *.php update and then the new upgrade.php script
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingenrolplugin','install'),'',1);
}
upgrade_plugins('enrol', 'enrol', ''); // Don't return anywhere
/// Check all course formats and upgrade if necessary
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingcourseformatplugin','install'),'',1);
}
upgrade_plugins('format','course/format',''); // Don't return anywhere
/// Check for local database customisations
/// first old *.php update and then the new upgrade.php script
require_once("$CFG->dirroot/lib/locallib.php");
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradinglocaldb','install'),'',1);
}
upgrade_local_db(''); // Don't return anywhere
/// Check for changes to RPC functions
require_once("$CFG->dirroot/$CFG->admin/mnet/adminlib.php");
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingrpcfunctions','install'),'',1);
}
upgrade_RPC_functions(''); // Don't return anywhere
/// Upgrade all plugins for gradebook
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradinggradeexportplugin','install'),'',1);
}
upgrade_plugins('gradeexport', 'grade/export', ''); // Don't return anywhere
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradinggradeimportplugin','install'),'',1);
}
upgrade_plugins('gradeimport', 'grade/import', ''); // Don't return anywhere
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradinggradereportplugin','install'),'',1);
}
upgrade_plugins('gradereport', 'grade/report', ''); // Don't return anywhere
/// Check all message output plugins and upgrade if necessary
if ( $verbose > CLI_NO ) {
print_heading(get_string('upgradingmessageoutputpluggin','install'),'',1);
}
upgrade_plugins('message','message/output',''); // Don't return anywhere
/// just make sure upgrade logging is properly terminated
upgrade_finished();
/// Set up the site
if (! $site = get_site()) {
// We are about to create the site "course"
require_once($CFG->libdir.'/blocklib.php');
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( (!isset($INSTALL['sitefullname'])) || (!isset($INSTALL['siteshortname'])) || (!isset($INSTALL['sitesummary'])) || (!isset($INSTALL['sitenewsitems'])) )) ) {
console_write('siteinfo');
print_newline();
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['sitefullname'])) ) ) {
console_write('sitefullname');
$sitefullname = read();
} else if (isset($INSTALL['sitefullname'])) {
$sitefullname = $INSTALL['sitefullname'];
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['siteshortname'])) ) ) {
console_write('siteshortname');
$siteshortname = read();
} else if (isset($INSTALL['siteshortname'])) {
$siteshortname = $INSTALL['siteshortname'];
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['sitesummary'])) ) ) {
console_write('sitesummary');
$sitesummary =read();
} else if (isset($INSTALL['sitesummary'])) {
$sitesummary = $INSTALL['sitesummary'];
}
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['sitenewsitems'])) ) ) {
console_write('sitenewsitems');
$sitenewsitems = read_int();
} else if (isset($INSTALL['sitenewsitems'])) {
$sitenewsitems = $INSTALL['sitenewsitems'];
}
if (!isset($sitefullname)) {
$sitefullname = $DEFAULT['sitefullname'];
}
if (!isset($siteshortname)) {
$siteshortname = $DEFAULT['siteshortname'];
}
if (!isset($sitesummary)) {
$sitesummary = $DEFAULT['sitesummary'];
}
if (!isset($sitenewsitems)) {
$sitenewsitems = $DEFAULT['sitenewsitems'];
}
$newsite = new Object();
$newsite->fullname = $sitefullname;
$newsite->shortname = $siteshortname;
$newsite->summary = $sitesummary;
$newsite->newsitems = $sitenewsitems;
$newsite->numsections = 0;
$newsite->category = 0;
$newsite->format = 'site'; // Only for this course
$newsite->timemodified = time();
if ($newid = $DB->insert_record('course', $newsite)) {
// Site created, add blocks for it
$page = page_create_object(PAGE_COURSE_VIEW, $newid);
blocks_repopulate_page($page); // Return value not checked because you can always edit later
// create default course category
$cat = get_course_category();
}
}
/// Define the unique site ID code if it isn't already
if (empty($CFG->siteidentifier)) { // Unique site identification code
set_config('siteidentifier', random_string(32).$_SERVER['HTTP_HOST']);
}
/// Check if the guest user exists. If not, create one.
if (!$DB->record_exists("user", array("username"=>"guest"))) {
if (! $guest = create_guest_record()) {
notify("Could not create guest user record !!!");
}
}
/// Set up the admin user
if (empty($CFG->rolesactive)) {
// If full interactive or semi interactive with at least one option is not set print the admininfo message
if ( ($interactive == CLI_FULL) || ($interactive == CLI_SEMI && (!isset($INSTALL['adminfirstname']) || !isset($INSTALL['adminlastname']) || !isset($INSTALL['adminusername']) || !isset($INSTALL['adminpassword']) || !isset($INSTALL['adminemail']) ))) {
console_write('admininfo');
print_newline();
}
// Assign the first name
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['adminfirstname'])) ) ) {
console_write('adminfirstname');
$adminfirstname = read();
} else if (isset($INSTALL['adminfirstname'])) {
$adminfirstname = $INSTALL['adminfirstname'];
}
// Assign the last name
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['adminlastname'])) ) ) {
console_write('adminlastname');
$adminlastname = read();
} else if (isset($INSTALL['adminlastname'])) {
$adminlastname = $INSTALL['adminlastname'];
}
// Assign user name
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['adminusername'])) ) ) {
console_write('adminusername');
$adminusername = read();
} else if (isset($INSTALL['adminusername'])) {
$adminusername = $INSTALL['adminusername'];
}
// Assign password
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['adminpassword'])) ) ) {
console_write('adminpassword');
$adminpassword = read();
} else if (isset($INSTALL['adminpassword'])) {
$adminpassword = $INSTALL['adminpassword'];
}
// Assign email
if ( ( $interactive == CLI_FULL ) || ($interactive == CLI_SEMI && ( !isset($INSTALL['adminemail'])) ) ) {
console_write('adminemail');
$adminemail = read();
} else if (isset($INSTALL['adminemail'])) {
$adminemail = $INSTALL['adminemail'];
}
/// If values not set in above set all values to their defaults
if (!isset($adminfirstname)) {
$adminfirstname = $DEFAULT['adminfirstname'];
}
if (!isset($adminlastname)) {
$adminlastname = $DEFAULT['adminlastname'];
}
if (!isset($adminusername)) {
$adminusername = $DEFAULT['adminusername'];
}
if (!isset($adminpassword)) {
$adminpassword = $DEFAULT['adminpassword'];
}
if (!isset($adminemail)) {
$adminemail = $DEFAULT['adminemail'];
}
$user = new object();
$user->auth = 'manual';
$user->firstname = $adminfirstname; //get_string('admin');
$user->lastname = $adminlastname; //get_string('user');
$user->username = $adminusername; //'admin';
$user->password = hash_internal_user_password($adminpassword); // 'admin'
$user->email = $adminemail; //'root@localhost';
$user->confirmed = 1;
$user->mnethostid = $CFG->mnet_localhost_id;
$user->lang = $CFG->lang;
$user->maildisplay = 1;
$user->timemodified = time();
create_admin_user($user);
}
if ( $verbose > CLI_NO ) {
print_newline();
console_write('upgradingcompleted');
console_write( "\n", '', false);
}
}
?>