/** * Tasks performed after the database is initialized. */ function install_tasks($profile, $task) { global $base_url, $install_locale; // Bootstrap newly installed Drupal, while preserving existing messages. $messages = isset($_SESSION['messages']) ? $_SESSION['messages'] : ''; drupal_install_init_database(); drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); $_SESSION['messages'] = $messages; // URL used to direct page requests. $url = $base_url . '/install.php?locale=' . $install_locale . '&profile=' . $profile; // Build a page for final tasks. if (empty($task)) { variable_set('install_task', 'profile-install'); $task = 'profile-install'; } // We are using a list of if constructs here to allow for // passing from one task to the other in the same request. // Install profile modules. if ($task == 'profile-install') { $modules = variable_get('install_profile_modules', array()); $files = system_get_module_data(); variable_del('install_profile_modules'); $operations = array(); foreach ($modules as $module) { $operations[] = array('_install_module_batch', array($module, $files[$module]->info['name'])); } $batch = array('operations' => $operations, 'finished' => '_install_profile_batch_finished', 'title' => st('Installing @drupal', array('@drupal' => drupal_install_profile_name())), 'error_message' => st('The installation has encountered an error.')); // Start a batch, switch to 'profile-install-batch' task. We need to // set the variable here, because batch_process() redirects. variable_set('install_task', 'profile-install-batch'); batch_set($batch); batch_process($url, $url); } // We are running a batch install of the profile's modules. // This might run in multiple HTTP requests, constantly redirecting // to the same address, until the batch finished callback is invoked // and the task advances to 'locale-initial-import'. if ($task == 'profile-install-batch') { include_once DRUPAL_ROOT . '/includes/batch.inc'; $output = _batch_page(); } // Import interface translations for the enabled modules. if ($task == 'locale-initial-import') { if (!empty($install_locale) && $install_locale != 'en') { include_once DRUPAL_ROOT . '/includes/locale.inc'; // Enable installation language as default site language. locale_add_language($install_locale, NULL, NULL, NULL, '', NULL, 1, TRUE); // Collect files to import for this language. $batch = locale_batch_by_language($install_locale, '_install_locale_initial_batch_finished'); if (!empty($batch)) { // Remember components we cover in this batch set. variable_set('install_locale_batch_components', $batch['#components']); // Start a batch, switch to 'locale-batch' task. We need to // set the variable here, because batch_process() redirects. variable_set('install_task', 'locale-initial-batch'); batch_set($batch); batch_process($url, $url); } } // Found nothing to import or not foreign language, go to next task. $task = 'configure'; } if ($task == 'locale-initial-batch') { include_once DRUPAL_ROOT . '/includes/batch.inc'; include_once DRUPAL_ROOT . '/includes/locale.inc'; $output = _batch_page(); } if ($task == 'configure') { if (variable_get('site_name', FALSE) || variable_get('site_mail', FALSE)) { // Site already configured: This should never happen, means re-running // the installer, possibly by an attacker after the 'install_task' variable // got accidentally blown somewhere. Stop it now. install_already_done_error(); } $form = drupal_render(drupal_get_form('install_configure_form', $url)); if (!variable_get('site_name', FALSE) && !variable_get('site_mail', FALSE)) { // Not submitted yet: Prepare to display the form. $output = $form; drupal_set_title(st('Configure site')); // Warn about settings.php permissions risk $settings_dir = './' . conf_path(); $settings_file = $settings_dir . '/settings.php'; if (!drupal_verify_install_file($settings_file, FILE_EXIST | FILE_READABLE | FILE_NOT_WRITABLE) || !drupal_verify_install_file($settings_dir, FILE_NOT_WRITABLE, 'dir')) { drupal_set_message(st('All necessary changes to %dir and %file have been made, so you should remove write permissions to them now in order to avoid security risks. If you are unsure how to do so, please consult the <a href="@handbook_url">online handbook</a>.', array('%dir' => $settings_dir, '%file' => $settings_file, '@handbook_url' => 'http://drupal.org/server-permissions')), 'error'); } else { drupal_set_message(st('All necessary changes to %dir and %file have been made. They have been set to read-only for security.', array('%dir' => $settings_dir, '%file' => $settings_file))); } // Add JavaScript validation. _user_password_dynamic_validation(); drupal_add_js(drupal_get_path('module', 'system') . '/system.js'); // Add JavaScript time zone detection. drupal_add_js('misc/timezone.js'); // We add these strings as settings because JavaScript translation does not // work on install time. drupal_add_js(array('copyFieldValue' => array('edit-site-mail' => array('edit-account-mail'))), 'setting'); drupal_add_js('jQuery(function () { Drupal.cleanURLsInstallCheck(); });', 'inline'); // Build menu to allow clean URL check. menu_rebuild(); // Cache a fully-built schema. This is necessary for any // invocation of index.php because: (1) setting cache table // entries requires schema information, (2) that occurs during // bootstrap before any module are loaded, so (3) if there is no // cached schema, drupal_get_schema() will try to generate one // but with no loaded modules will return nothing. // // This logically could be done during task 'done' but the clean // URL check requires it now. drupal_get_schema(NULL, TRUE); } else { $task = 'profile'; } } // If found an unknown task or the 'profile' task, which is // reserved for profiles, hand over the control to the profile, // so it can run any number of custom tasks it defines. if (!in_array($task, install_reserved_tasks())) { $function = $profile . '_profile_tasks'; if (function_exists($function)) { // The profile needs to run more code, maybe even more tasks. // $task is sent through as a reference and may be changed! $output = $function($task, $url); } // If the profile doesn't move on to a new task we assume // that it is done. if ($task == 'profile') { $task = 'profile-finished'; } } // Profile custom tasks are done, so let the installer regain // control and proceed with importing the remaining translations. if ($task == 'profile-finished') { if (!empty($install_locale) && $install_locale != 'en') { include_once DRUPAL_ROOT . '/includes/locale.inc'; // Collect files to import for this language. Skip components // already covered in the initial batch set. $batch = locale_batch_by_language($install_locale, '_install_locale_remaining_batch_finished', variable_get('install_locale_batch_components', array())); // Remove temporary variable. variable_del('install_locale_batch_components'); if (!empty($batch)) { // Start a batch, switch to 'locale-remaining-batch' task. We need to // set the variable here, because batch_process() redirects. variable_set('install_task', 'locale-remaining-batch'); batch_set($batch); batch_process($url, $url); } } // Found nothing to import or not foreign language, go to next task. $task = 'finished'; } if ($task == 'locale-remaining-batch') { include_once DRUPAL_ROOT . '/includes/batch.inc'; include_once DRUPAL_ROOT . '/includes/locale.inc'; $output = _batch_page(); } // Display a 'finished' page to user. if ($task == 'finished') { drupal_set_title(st('@drupal installation complete', array('@drupal' => drupal_install_profile_name()))); $messages = drupal_set_message(); $output = '<p>' . st('Congratulations, @drupal has been successfully installed.', array('@drupal' => drupal_install_profile_name())) . '</p>'; $output .= '<p>' . (isset($messages['error']) ? st('Please review the messages above before continuing on to <a href="@url">your new site</a>.', array('@url' => url(''))) : st('You may now visit <a href="@url">your new site</a>.', array('@url' => url('')))) . '</p>'; $output .= '<p>' . st('For more information on configuring Drupal, please refer to the <a href="@help">help section</a>.', array('@help' => url('admin/help'))) . '</p>'; $task = 'done'; } // The end of the install process. Remember profile used. if ($task == 'done') { // Rebuild menu and registry to get content type links registered by the // profile, and possibly any other menu items created through the tasks. menu_rebuild(); // Register actions declared by any modules. actions_synchronize(); // Randomize query-strings on css/js files, to hide the fact that // this is a new install, not upgraded yet. _drupal_flush_css_js(); variable_set('install_profile', $profile); // Cache a fully-built schema. drupal_get_schema(NULL, TRUE); } // Set task for user, and remember the task in the database. install_task_list($task); variable_set('install_task', $task); // Run cron to populate update status tables (if available) so that users // will be warned if they've installed an out of date Drupal version. // Will also trigger indexing of profile-supplied content or feeds. drupal_cron_run(); // Output page, if some output was required. Otherwise it is possible // that we are printing a JSON page and theme output should not be there. if (isset($output)) { print theme('maintenance_page', $output); } }
/** * Helper function to test compatibility of a module or theme. */ function update_check_incompatibility($name, $type = 'module') { static $themes, $modules; // Store values of expensive functions for future use. if (empty($themes) || empty($modules)) { $themes = _system_get_theme_data(); $modules = system_get_module_data(); } if ($type == 'module' && isset($modules[$name])) { $file = $modules[$name]; } elseif ($type == 'theme' && isset($themes[$name])) { $file = $themes[$name]; } if (!isset($file) || !isset($file->info['core']) || $file->info['core'] != DRUPAL_CORE_COMPATIBILITY || version_compare(phpversion(), $file->info['php']) < 0 || $type == 'module' && empty($file->info['files'])) { return TRUE; } return FALSE; }
/** * Installation task; install required modules via a batch process. * * @param $install_state * An array of information about the current installation state. * @return * The batch definition. */ function install_profile_modules(&$install_state) { $modules = variable_get('install_profile_modules', array()); $files = system_get_module_data(); variable_del('install_profile_modules'); $operations = array(); foreach ($modules as $module) { $operations[] = array('_install_module_batch', array($module, $files[$module]->info['name'])); } $batch = array('operations' => $operations, 'title' => st('Installing @drupal', array('@drupal' => drupal_install_profile_name())), 'error_message' => st('The installation has encountered an error.')); return $batch; }