- Patch #304163 by chx, David_Rothstein: allow update.php to regenerate settings.php
parent
0e0ca3b589
commit
bbe7b77475
|
|
@ -1167,7 +1167,7 @@ function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NO
|
|||
*/
|
||||
function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
|
||||
if ($message) {
|
||||
if (!isset($_SESSION['messages']) && function_exists('drupal_set_session')) {
|
||||
if (!isset($_SESSION['messages'])) {
|
||||
drupal_set_session('messages', array());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -996,61 +996,3 @@ function drupal_check_module($module) {
|
|||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check installation requirements and report any errors.
|
||||
*/
|
||||
function install_check_requirements($profile, $verify) {
|
||||
// Check the profile requirements.
|
||||
$requirements = $profile ? drupal_check_profile($profile) : array();
|
||||
|
||||
// If Drupal is not set up already, we need to create a settings file.
|
||||
if (!$verify) {
|
||||
$writable = FALSE;
|
||||
$conf_path = './' . conf_path(FALSE, TRUE);
|
||||
$settings_file = $conf_path . '/settings.php';
|
||||
$file = $conf_path;
|
||||
$exists = FALSE;
|
||||
// Verify that the directory exists.
|
||||
if (drupal_verify_install_file($conf_path, FILE_EXIST, 'dir')) {
|
||||
// Check to make sure a settings.php already exists.
|
||||
$file = $settings_file;
|
||||
if (drupal_verify_install_file($settings_file, FILE_EXIST)) {
|
||||
$exists = TRUE;
|
||||
// If it does, make sure it is writable.
|
||||
$writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
|
||||
$exists = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$exists) {
|
||||
$requirements['settings file exists'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('The settings file does not exist.'),
|
||||
'severity' => REQUIREMENT_ERROR,
|
||||
'description' => st('The @drupal installer requires that you create a settings file as part of the installation process. Copy the %default_file file to %file. More details about installing Drupal are available in <a href="@install_txt">INSTALL.txt</a>.', array('@drupal' => drupal_install_profile_name(), '%file' => $file, '%default_file' => $conf_path .'/default.settings.php', '@install_txt' => base_path() .'INSTALL.txt')),
|
||||
);
|
||||
}
|
||||
else {
|
||||
$requirements['settings file exists'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('The %file file exists.', array('%file' => $file)),
|
||||
);
|
||||
if (!$writable) {
|
||||
$requirements['settings file writable'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('The settings file is not writable.'),
|
||||
'severity' => REQUIREMENT_ERROR,
|
||||
'description' => st('The @drupal installer requires write permissions to %file during the installation process. If you are unsure how to grant file permissions, please consult the <a href="@handbook_url">online handbook</a>.', array('@drupal' => drupal_install_profile_name(), '%file' => $file, '@handbook_url' => 'http://drupal.org/server-permissions')),
|
||||
);
|
||||
}
|
||||
else {
|
||||
$requirements['settings file'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('Settings file is writable.'),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $requirements;
|
||||
}
|
||||
|
|
|
|||
58
install.php
58
install.php
|
|
@ -886,6 +886,64 @@ function install_reserved_tasks() {
|
|||
return array('configure', 'profile-install', 'profile-install-batch', 'locale-initial-import', 'locale-initial-batch', 'profile-finished', 'locale-remaining-batch', 'finished', 'done');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check installation requirements and report any errors.
|
||||
*/
|
||||
function install_check_requirements($profile, $verify) {
|
||||
// Check the profile requirements.
|
||||
$requirements = drupal_check_profile($profile);
|
||||
|
||||
// If Drupal is not set up already, we need to create a settings file.
|
||||
if (!$verify) {
|
||||
$writable = FALSE;
|
||||
$conf_path = './' . conf_path(FALSE, TRUE);
|
||||
$settings_file = $conf_path . '/settings.php';
|
||||
$file = $conf_path;
|
||||
$exists = FALSE;
|
||||
// Verify that the directory exists.
|
||||
if (drupal_verify_install_file($conf_path, FILE_EXIST, 'dir')) {
|
||||
// Check to make sure a settings.php already exists.
|
||||
$file = $settings_file;
|
||||
if (drupal_verify_install_file($settings_file, FILE_EXIST)) {
|
||||
$exists = TRUE;
|
||||
// If it does, make sure it is writable.
|
||||
$writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
|
||||
$exists = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$exists) {
|
||||
$requirements['settings file exists'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('The settings file does not exist.'),
|
||||
'severity' => REQUIREMENT_ERROR,
|
||||
'description' => st('The @drupal installer requires that you create a settings file as part of the installation process. Copy the %default_file file to %file. More details about installing Drupal are available in <a href="@install_txt">INSTALL.txt</a>.', array('@drupal' => drupal_install_profile_name(), '%file' => $file, '%default_file' => $conf_path .'/default.settings.php', '@install_txt' => base_path() .'INSTALL.txt')),
|
||||
);
|
||||
}
|
||||
else {
|
||||
$requirements['settings file exists'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('The %file file exists.', array('%file' => $file)),
|
||||
);
|
||||
if (!$writable) {
|
||||
$requirements['settings file writable'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('The settings file is not writable.'),
|
||||
'severity' => REQUIREMENT_ERROR,
|
||||
'description' => st('The @drupal installer requires write permissions to %file during the installation process. If you are unsure how to grant file permissions, please consult the <a href="@handbook_url">online handbook</a>.', array('@drupal' => drupal_install_profile_name(), '%file' => $file, '@handbook_url' => 'http://drupal.org/server-permissions')),
|
||||
);
|
||||
}
|
||||
else {
|
||||
$requirements['settings file'] = array(
|
||||
'title' => st('Settings file'),
|
||||
'value' => st('Settings file is writable.'),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $requirements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the installation task list to the current page.
|
||||
*/
|
||||
|
|
|
|||
173
update.php
173
update.php
|
|
@ -584,10 +584,30 @@ function update_fix_d6_requirements() {
|
|||
* changes to the database should be made here.
|
||||
*/
|
||||
function update_prepare_d7_bootstrap() {
|
||||
// Allow the database system to work even though the registry has not
|
||||
// been created yet.
|
||||
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
|
||||
// Allow the bootstrap to proceed even if a Drupal 6 settings.php file is
|
||||
// still being used.
|
||||
include_once DRUPAL_ROOT . '/includes/install.inc';
|
||||
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
|
||||
global $databases, $db_url, $update_rewrite_settings;
|
||||
if (empty($databases) && !empty($db_url)) {
|
||||
$databases = update_parse_db_url($db_url);
|
||||
// Record the fact that the settings.php file will need to be rewritten.
|
||||
$update_rewrite_settings = TRUE;
|
||||
$settings_file = conf_path() . '/settings.php';
|
||||
$writable = drupal_verify_install_file($settings_file, FILE_EXIST|FILE_READABLE|FILE_WRITABLE);
|
||||
$requirements = array(
|
||||
'settings file' => array(
|
||||
'title' => 'Settings file',
|
||||
'value' => $writable ? 'The settings file is writable.' : 'The settings file is not writable.',
|
||||
'severity' => $writable ? REQUIREMENT_OK : REQUIREMENT_ERROR,
|
||||
'description' => $writable ? '' : 'Drupal requires write permissions to <em>' . $settings_file . '</em> during the update process. If you are unsure how to grant file permissions, please consult the <a href="http://drupal.org/server-permissions">online handbook</a>.',
|
||||
),
|
||||
);
|
||||
update_extra_requirements($requirements);
|
||||
}
|
||||
// Allow the database system to work even if the registry has not been
|
||||
// created yet.
|
||||
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
|
||||
drupal_install_init_database();
|
||||
spl_autoload_unregister('drupal_autoload_class');
|
||||
spl_autoload_unregister('drupal_autoload_interface');
|
||||
|
|
@ -605,12 +625,57 @@ function update_prepare_d7_bootstrap() {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform Drupal 6.x to 7.x updates that are required for update.php
|
||||
* to function properly.
|
||||
*
|
||||
* This function runs when update.php is run the first time for 7.x,
|
||||
* even before updates are selected or performed. It is important
|
||||
* that if updates are not ultimately performed that no changes are
|
||||
* made which make it impossible to continue using the prior version.
|
||||
*/
|
||||
function update_fix_d7_requirements() {
|
||||
// Rewrite the settings.php file if necessary.
|
||||
// @see update_prepare_d7_bootstrap().
|
||||
global $update_rewrite_settings, $db_url;
|
||||
if (!empty($update_rewrite_settings)) {
|
||||
$databases = update_parse_db_url($db_url);
|
||||
file_put_contents(conf_path() . '/settings.php', "\n" . '$databases = ' . var_export($databases, TRUE) . ';', FILE_APPEND);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse database connection URLs (in the old, pre-Drupal 7 format) and
|
||||
* return them as an array of database connection information.
|
||||
*/
|
||||
function update_parse_db_url($db_url) {
|
||||
$databases = array();
|
||||
if (!is_array($db_url)) {
|
||||
$db_url = array('default' => $db_url);
|
||||
}
|
||||
foreach ($db_url as $database => $url) {
|
||||
$url = parse_url($url);
|
||||
$databases[$database]['default'] = array(
|
||||
// MySQLi uses the mysql driver.
|
||||
'driver' => $url['scheme'] == 'mysqli' ? 'mysql' : $url['scheme'],
|
||||
// Remove the leading slash to get the database name.
|
||||
'database' => substr(urldecode($url['path']), 1),
|
||||
'username' => urldecode($url['user']),
|
||||
'password' => isset($url['pass']) ? urldecode($url['pass']) : '',
|
||||
'host' => urldecode($url['host']),
|
||||
'port' => isset($url['port']) ? urldecode($url['port']) : '',
|
||||
);
|
||||
}
|
||||
return $databases;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the update task list to the current page.
|
||||
*/
|
||||
function update_task_list($active = NULL) {
|
||||
// Default list of tasks.
|
||||
$tasks = array(
|
||||
'requirements' => 'Verify requirements',
|
||||
'info' => 'Overview',
|
||||
'select' => 'Review updates',
|
||||
'run' => 'Run updates',
|
||||
|
|
@ -621,58 +686,34 @@ function update_task_list($active = NULL) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Check update requirements and report any errors.
|
||||
* Returns (and optionally stores) extra requirements that only apply during
|
||||
* particular parts of the update.php process.
|
||||
*/
|
||||
function update_check_requirements() {
|
||||
global $db_url, $databases;
|
||||
$requirements = array();
|
||||
|
||||
// If we will rewrite the settings.php then we need to make sure it is
|
||||
// writeable.
|
||||
if (empty($databases) && !empty($db_url) && is_string($db_url)) {
|
||||
$requirements = install_check_requirements('', FALSE);
|
||||
function update_extra_requirements($requirements = NULL) {
|
||||
static $extra_requirements = array();
|
||||
if (isset($requirements)) {
|
||||
$extra_requirements += $requirements;
|
||||
}
|
||||
$warnings = FALSE;
|
||||
|
||||
// Check the system module requirements only.
|
||||
$requirements += module_invoke('system', 'requirements', 'update');
|
||||
$severity = drupal_requirements_severity($requirements);
|
||||
|
||||
// If there are issues, report them.
|
||||
if ($severity != REQUIREMENT_OK) {
|
||||
foreach ($requirements as $requirement) {
|
||||
if (isset($requirement['severity']) && $requirement['severity'] != REQUIREMENT_OK) {
|
||||
$message = isset($requirement['description']) ? $requirement['description'] : '';
|
||||
if (isset($requirement['value']) && $requirement['value']) {
|
||||
$message .= ' (Currently using ' . $requirement['title'] . ' ' . $requirement['value'] . ')';
|
||||
}
|
||||
$warnings = TRUE;
|
||||
drupal_set_message($message, 'warning');
|
||||
}
|
||||
}
|
||||
}
|
||||
return $warnings;
|
||||
return $extra_requirements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts Drupal 6 $db_url to Drupal 7 $databases array.
|
||||
* Check update requirements and report any errors.
|
||||
*/
|
||||
function update_check_d7_settings() {
|
||||
global $db_url, $databases;
|
||||
function update_check_requirements() {
|
||||
// Check the system module and update.php requirements only.
|
||||
$requirements = module_invoke('system', 'requirements', 'update');
|
||||
$requirements += update_extra_requirements();
|
||||
$severity = drupal_requirements_severity($requirements);
|
||||
|
||||
if (empty($databases) && !empty($db_url) && is_string($db_url)) {
|
||||
$url = parse_url($db_url);
|
||||
$driver = substr($db_url, 0, strpos($db_url, '://'));
|
||||
if ($driver == 'mysqli') {
|
||||
$driver = 'mysql';
|
||||
}
|
||||
$databases['default']['default']['driver'] = $driver;
|
||||
$databases['default']['default']['database'] = substr($url['path'], 1);
|
||||
foreach (array('user' => 'username', 'pass' => 'password', 'host' => 'host', 'port' => 'port') as $old_key => $new_key) {
|
||||
$databases['default']['default'][$new_key] = isset($url[$old_key]) ? urldecode($url[$old_key]) : '';
|
||||
}
|
||||
$conf_path = conf_path();
|
||||
file_put_contents($conf_path .'/settings.php', "\n" . '$databases = '. var_export($databases, TRUE) . ';', FILE_APPEND);
|
||||
// If there are issues, report them.
|
||||
if ($severity == REQUIREMENT_ERROR) {
|
||||
update_task_list('requirements');
|
||||
drupal_set_title('Requirements problem');
|
||||
$status_report = theme('status_report', $requirements);
|
||||
$status_report .= 'Please check the error messages and <a href="' . request_uri() . '">try again</a>.';
|
||||
print theme('update_page', $status_report);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -680,15 +721,20 @@ function update_check_d7_settings() {
|
|||
// Our custom error handler is not yet installed, so we just suppress them.
|
||||
ini_set('display_errors', FALSE);
|
||||
|
||||
// We prepare a minimal bootstrap for the update requirements check to avoid
|
||||
// reaching the PHP memory limit.
|
||||
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
|
||||
update_prepare_d7_bootstrap();
|
||||
|
||||
// We only load DRUPAL_BOOTSTRAP_CONFIGURATION for the update requirements
|
||||
// check to avoid reaching the PHP memory limit.
|
||||
// Determine if the current user has access to run update.php.
|
||||
drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
|
||||
$update_access_allowed = !empty($update_free_access) || $user->uid == 1;
|
||||
|
||||
// Only allow the requirements check to proceed if the current user has access
|
||||
// to run updates (since it may expose sensitive information about the site's
|
||||
// configuration).
|
||||
$op = isset($_REQUEST['op']) ? $_REQUEST['op'] : '';
|
||||
if (empty($op)) {
|
||||
// Minimum load of components.
|
||||
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
|
||||
|
||||
if (empty($op) && $update_access_allowed) {
|
||||
require_once DRUPAL_ROOT . '/includes/install.inc';
|
||||
require_once DRUPAL_ROOT . '/includes/file.inc';
|
||||
require_once DRUPAL_ROOT . '/modules/system/system.install';
|
||||
|
|
@ -708,22 +754,12 @@ if (empty($op)) {
|
|||
drupal_maintenance_theme();
|
||||
|
||||
// Check the update requirements for Drupal.
|
||||
$warnings = update_check_requirements();
|
||||
|
||||
// Display the warning messages (if any) in a dedicated maintenance page,
|
||||
// or redirect to the update information page if no message.
|
||||
if ($warnings) {
|
||||
drupal_maintenance_theme();
|
||||
print theme('update_page', '<form method="post" action="update.php?op=info"><input type="submit" value="Continue" /></form>', FALSE);
|
||||
exit;
|
||||
}
|
||||
// Write D7 settings file.
|
||||
update_check_d7_settings();
|
||||
update_check_requirements();
|
||||
|
||||
// Redirect to the update information page if all requirements were met.
|
||||
install_goto('update.php?op=info');
|
||||
}
|
||||
|
||||
update_prepare_d7_bootstrap();
|
||||
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
|
||||
drupal_maintenance_theme();
|
||||
|
||||
|
|
@ -731,14 +767,15 @@ drupal_maintenance_theme();
|
|||
// not passed through the error handler) will cause a message to be printed.
|
||||
ini_set('display_errors', TRUE);
|
||||
|
||||
// Access check:
|
||||
if (!empty($update_free_access) || $user->uid == 1) {
|
||||
// Only proceed with updates if the user is allowed to run them.
|
||||
if ($update_access_allowed) {
|
||||
|
||||
include_once DRUPAL_ROOT . '/includes/install.inc';
|
||||
include_once DRUPAL_ROOT . '/includes/batch.inc';
|
||||
drupal_load_updates();
|
||||
|
||||
update_fix_d6_requirements();
|
||||
update_fix_d7_requirements();
|
||||
update_fix_compatibility();
|
||||
|
||||
$op = isset($_REQUEST['op']) ? $_REQUEST['op'] : '';
|
||||
|
|
|
|||
Loading…
Reference in New Issue