Commit 331ace95 authored by Adrian Rossouw's avatar Adrian Rossouw Committed by adrian

Provide a layer of conditional includes for specific Drupal versions. One...

Provide a layer of conditional includes for specific Drupal versions. One provision install can now drive Drupal 5, 6 and 7 platforms, without needing anything additional downloaded.
parent 779e38c2
......@@ -73,6 +73,5 @@ function provision_drupal_provision_deploy_rollback(&$data, $url) {
function provision_drupal_provision_post_deploy(&$data, $url) {
provision_invoke('update', $data, $url);
$cmd = sprintf("php %s/drupal_deploy.php %s %s", dirname(__FILE__), $url, $data['old_site_url']);
provision_exec($cmd, $data);
provision_platform_include(dirname(__FILE__), 'deploy');
}
<?php
if (is_array($GLOBALS['db_url'])) {
$db_url = $GLOBALS['db_url']['default'];
}
if ($parts = @parse_url($db_url)) {
$data['db_type'] = $parts['scheme'];
$data['db_user'] = $parts['user'];
$data['db_host'] = $parts['host'];
$data['db_passwd'] = $parts['pass'];
$data['db_name'] = substr($parts['path'], 1);
$data['profile'] = variable_get('install_profile', 'default');
$has_locale = db_result(db_query("SELECT status FROM {system} WHERE type='module' AND name='locale'"));
if ($has_locale) {
$locale = db_result(db_query("SELECT locale FROM {locales_meta} WHERE isdefault=1 AND enabled=1"));
}
$data['language'] = ($locale) ? ($locale) : 'en';
}
<?php
/**
* @file
* Rebuild all the caches
*/
$GLOBALS['url'] = $data['site_url'];
$GLOBALS['profile'] = $data['profile'];
$GLOBALS['install_locale'] = $data['language'];
$GLOBALS['client_email'] = $data['client_email'];
require_once 'includes/install.inc';
/**
* Verify if Drupal is installed.
*/
function install_verify_drupal() {
$result = @db_query("SELECT name FROM {system} WHERE name = 'system'");
return $result && db_result($result) == 'system';
}
/**
* Verify existing settings.php
*/
function install_verify_settings() {
global $db_prefix, $db_type, $db_url;
// Verify existing settings (if any).
if ($db_url != 'mysql://username:password@localhost/databasename') {
// We need this because we want to run form_get_errors.
$url = parse_url(is_array($db_url) ? $db_url['default'] : $db_url);
$db_user = urldecode($url['user']);
$db_pass = urldecode($url['pass']);
$db_host = urldecode($url['host']);
$db_port = isset($url['port']) ? urldecode($url['port']) : '';
$db_path = ltrim(urldecode($url['path']), '/');
$settings_file = './'. conf_path() .'/settings.php';
return TRUE;
}
return FALSE;
}
function install_send_welcome_mail($url, $profile, $language, $client_email) {
// create the admin account or change some parameters if the install profile
// already created one
$account = user_load(array('uid' => 1));
if (!$account) {
$account = new stdClass();
}
$edit['name'] = 'admin';
$edit['pass'] = user_password();
$edit['mail'] = $client_email;
$edit['status'] = 1;
$account = user_save($account, $edit);
// Mail one time login URL and instructions.
$from = variable_get('site_mail', ini_get('sendmail_from'));
$onetime = user_pass_reset_url($account);
$variables = array(
'!username' => $account->name, '!site' => variable_get('site_name', 'Drupal'), '!login_url' => $onetime,
'!uri' => $base_url, '!uri_brief' => preg_replace('!^https?://!', '', $base_url), '!mailto' => $account->mail,
'!date' => format_date(time()), '!login_uri' => url('user', NULL, NULL, TRUE),
'!edit_uri' => url('user/'. $account->uid .'/edit', NULL, NULL, TRUE));
// allow the profile to override welcome email text
if (file_exists("./profiles/$profile/provision_welcome_mail.inc")) {
require_once "./profiles/$profile/provision_welcome_mail.inc";
$mailkey = 'welcome-mail-admin';
}
elseif (file_exists(dirname(__FILE__) . '/provision_welcome_mail.inc')) {
/** use the module provided welcome email
* We can not use drupal_get_path here,
* as we are connected to the provisioned site's database
*/
require_once dirname(__FILE__) . '/provision_welcome_mail.inc';
$mailkey = 'welcome-mail-admin';
}
else {
// last resort use the user-pass mail text
$mailkey = 'user-pass';
}
if ($mailkey == 'welcome-mail-admin') {
$subject = st($mail['subject'], $variables);
$body = st($mail['body'], $variables);
}
else {
$subject = _user_mail_text('pass_subject', $variables);
$body = _user_mail_text('pass_body', $variables);
}
$mail_success = drupal_mail($mailkey, $account->mail, $subject, $body, $from);
if ($mail_success) {
provision_log('message', t('Sent welcome mail to @client', array('@client' => $client_email)));
}
else {
provision_log('notice', t('Could not send welcome mail to @client', array('@client' => $client_email)));
}
provision_log('message', t('Login url: !onetime', array('!onetime' => $onetime)));
}
function install_main() {
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
// This must go after drupal_bootstrap(), which unsets globals!
global $profile, $install_locale, $client_email;
require_once './modules/system/system.install';
require_once './includes/file.inc';
// Check existing settings.php.
$verify = install_verify_settings();
// Drupal may already be installed.
if ($verify) {
// Establish a connection to the database.
require_once './includes/database.inc';
db_set_active();
// Check if Drupal is installed.
if (install_verify_drupal()) {
provision_set_error(PROVISION_SITE_INSTALLED);
provision_log('error', st('Site is already installed'));
return FALSE;
}
}
else {
provision_set_error(PROVISION_FRAMEWORK_ERROR);
provision_log('error', st('Config file could not be loaded'));
return FALSE;
}
// Load module basics (needed for hook invokes).
include_once './includes/module.inc';
$module_list['system']['filename'] = 'modules/system/system.module';
$module_list['filter']['filename'] = 'modules/filter/filter.module';
module_list(TRUE, FALSE, FALSE, $module_list);
drupal_load('module', 'system');
drupal_load('module', 'filter');
provision_log("install", st("Installing Drupal schema"));
// Load the profile.
require_once "./profiles/$profile/$profile.profile";
provision_log("install", st("Loading @profile install profile", array("@profile" => $profile)));
$requirements = drupal_check_profile($profile);
$severity = drupal_requirements_severity($requirements);
// If there are issues, report them.
if ($severity == REQUIREMENT_ERROR) {
foreach ($requirements as $requirement) {
if (isset($requirement['severity']) && $requirement['severity'] == REQUIREMENT_ERROR) {
drupal_set_message($requirement['descristion'] .' ('. st('Currently using !item !version', array('!item' => $requirement['title'], '!version' => $requirement['value'])) .')', 'error');
}
}
return FALSE;
}
// Verify existence of all required modules.
$modules = drupal_verify_profile($profile, $install_locale);
if (!$modules) {
provision_set_error(PROVISION_FRAMEWORK_ERROR);
return FALSE;
}
foreach ($modules as $module) {
provision_log("success", st("Installing module : @module", array("@module" => $module)));
}
// Perform actual installation defined in the profile.
drupal_install_profile($profile, $modules);
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
// Show profile finalization info.
$function = $profile .'_profile_final';
if (function_exists($function)) {
// More steps required
$profile_message = $function();
}
variable_set('install_profile', $profile);
if ($client_email) {
install_send_welcome_mail($url, $profile, $language, $client_email);
}
}
install_main();
<?php
// $Id$
/**
* @file
* Update.php for provisioned sites.
* This file is a derivative of the standard drupal update.php,
* which has been modified to allow being run from the command
* line.
*/
ob_start();
include_once("update.php");
ob_end_clean();
function update_main() {
include_once './includes/install.inc';
drupal_load_updates();
update_fix_schema_version();
update_fix_watchdog_115();
update_fix_watchdog();
update_fix_sessions();
$start = array();
foreach (module_list() as $module) {
$updates = drupal_get_schema_versions($module);
if ($updates !== FALSE) {
$updates = drupal_map_assoc($updates);
$updates[] = 'No updates available';
$default = drupal_get_installed_schema_version($module);
foreach (array_keys($updates) as $update) {
if ($update > $default) {
$default = $update;
break;
}
}
$start[$module] = $default;
}
}
$update_results = array();
foreach ($start as $module => $version) {
drupal_set_installed_schema_version($module, $version - 1);
$updates = drupal_get_schema_versions($module);
$max_version = max($updates);
if ($version <= $max_version) {
provision_log('notice', pt('Updating module @module from schema version @start to schema version @max', array('@module' => $module, '@start' => $version - 1, '@max' => $max_version)));
foreach ($updates as $update) {
$finished = FALSE;
if ($update >= $version) {
while (!$finished) {
// do update
$ret = module_invoke($module, 'update_' . $update);
// Assume the update finished unless the update results indicate otherwise.
foreach ($ret as $info) {
if (!$info['success']) {
provision_set_error('PROVISION_DB_ERROR');
}
provision_log( ($info['success']) ? 'success' : 'error', $info['query']);
}
$finished = 1;
if (isset($ret['#finished'])) {
$finished = $ret['#finished'];
unset($ret['#finished']);
}
}
drupal_set_installed_schema_version($module, $update);
}
}
}
else {
provision_log("notice", pt('No updates for @module module', array('@module' => $module)));
}
}
}
update_main();
<?php
require_once(dirname(__FILE__) . '/../provision.inc');
if ($argv[1]) {
provision_external_init($argv[1]);
}
else {
provision_set_error(PROVISION_FRAMEWORK_ERROR);
provision_log("error", "USAGE: import.php url\n");
}
if ($parts = @parse_url($GLOBALS['db_url'])) {
$data['db_type'] = $parts['scheme'];
$data['db_user'] = $parts['user'];
......@@ -20,4 +11,3 @@ if ($parts = @parse_url($GLOBALS['db_url'])) {
$language = language_default();
$data['language'] = $language->language;
}
provision_output($data);
......@@ -4,22 +4,13 @@
* Rebuild all the caches
*/
require_once(dirname(__FILE__) . '/../provision.inc');
if (sizeof($argv) == 5) {
// Fake the necessary HTTP headers that Drupal needs:
provision_external_init($argv[1], FALSE);
$GLOBALS['url'] = $argv[1];
$GLOBALS['profile'] = $argv[2];
$GLOBALS['install_locale'] = $argv[3];
$GLOBALS['client_email'] = $argv[4];
require_once 'includes/install.inc';
define('MAINTENANCE_MODE', 'install');
}
else {
provision_set_error(PROVISION_FRAMEWORK_ERROR);
provision_log("error", "USAGE: install.php url profile locale email\n");
}
$GLOBALS['url'] = $data['site_url'];
$GLOBALS['profile'] = $data['profile'];
$GLOBALS['install_locale'] = $data['language'];
$GLOBALS['client_email'] = $data['client_email'];
require_once 'includes/install.inc';
define('MAINTENANCE_MODE', 'install');
/**
* Verify if Drupal is installed.
......@@ -316,6 +307,4 @@ function install_main() {
install_send_welcome_mail($url, $profile, $instal_locale, $client_email);
}
}
$data = array();
install_main($url, $data);
provision_output($data);
install_main();
<?php
global $databases;
if ($db = $databases['default']['default']) {
$data['db_type'] = $db['driver'];
$data['db_user'] = $db['username'];
$data['db_host'] = $db['host'];
$data['db_passwd'] = $db['password'];
$data['db_name'] = $db['database'];
$data['profile'] = variable_get('install_profile', 'default');
$language = language_default();
$data['language'] = $language->language;
}
<?php
/**
* @file
* Rebuild all the caches
*/
$GLOBALS['url'] = $data['site_url'];
$GLOBALS['profile'] = $data['profile'];
$GLOBALS['install_locale'] = $data['language'];
$GLOBALS['client_email'] = $data['client_email'];
require_once 'includes/install.inc';
define('MAINTENANCE_MODE', 'install');
/**
* Verify if Drupal is installed.
*/
function install_verify_drupal() {
try {
$result = @db_query("SELECT name FROM {system} WHERE name = 'system'");
return $result && db_result($result) == 'system';
}
catch (Exception $e) {
}
}
/**
* Verify existing settings.php
*/
function install_verify_settings() {
global $db_prefix, $db_type, $db_url, $databases;
return TRUE;
// Verify existing settings (if any).
if (!empty($db_url)) {
// We need this because we want to run form_get_errors.
$url = parse_url(is_array($db_url) ? $db_url['default'] : $db_url);
$db_user = urldecode($url['user']);
$db_pass = urldecode($url['pass']);
$db_host = urldecode($url['host']);
$db_port = isset($url['port']) ? urldecode($url['port']) : '';
$db_path = ltrim(urldecode($url['path']), '/');
$settings_file = './'. conf_path() .'/settings.php';
return TRUE;
}
return FALSE;
}
function install_send_welcome_mail($url, $profile, $language, $client_email) {
if ($client_email) {
// create the admin account
$account = user_load(1);
$edit['name'] = 'admin';
$edit['pass'] = user_password();
$edit['mail'] = $client_email;
$edit['status'] = 1;
// temporarily disable drupal's default mail notification
$prev = variable_get('user_mail_status_activated_notify', TRUE);
variable_set('user_mail_status_activated_notify', FALSE);
$account = user_save($account, $edit);
variable_set('user_mail_status_activated_notify', $prev);
// Mail one time login URL and instructions.
$from = variable_get('site_mail', ini_get('sendmail_from'));
$onetime = user_pass_reset_url($account);
$mail_params['variables'] = array(
'!username' => $account->name, '!site' => variable_get('site_name', 'Drupal'), '!login_url' => $onetime,
'!uri' => $base_url, '!uri_brief' => preg_replace('!^https?://!', '', $base_url), '!mailto' => $account->mail,
'!date' => format_date(time()), '!login_uri' => url('user', array('absolute' => TRUE)),
'!edit_uri' => url('user/'. $account->uid .'/edit', array('absolute' => TRUE)));
$mail_success = drupal_mail('install', 'welcome-admin', $account->mail, user_preferred_language($account), $mail_params, $from, TRUE);
if ($mail_success) {
provision_log('message', t('Sent welcome mail to @client', array('@client' => $client_email)));
}
else {
provision_log('notice', t('Could not send welcome mail to @client', array('@client' => $client_email)));
}
provision_log('message', t('Login url: !onetime', array('!onetime' => $onetime)));
}
}
function install_mail($key, &$message, $params) {
switch ($key) {
case 'welcome-admin':
// allow the profile to override welcome email text
if (file_exists("./profiles/$profile/provision_welcome_mail.inc")) {
require_once "./profiles/$profile/provision_welcome_mail.inc";
$custom = TRUE;
}
elseif (file_exists(dirname(__FILE__) . '/provision_welcome_mail.inc')) {
/** use the module provided welcome email
* We can not use drupal_get_path here,
* as we are connected to the provisioned site's database
*/
require_once dirname(__FILE__) . '/provision_welcome_mail.inc';
$custom = TRUE;
}
else {
// last resort use the user-pass mail text
$custom = FALSE;
}
if ($custom) {
$message['subject'] = st($mail['subject'], $params['variables']);
$message['body'] = st($mail['body'], $params['variables']);
}
else {
$message['subject'] = _user_mail_text('pass_subject', $params['variables']);
$message['body'] = _user_mail_text('pass_body', $params['variables']);
}
break;
}
}
function install_main() {
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
// This must go after drupal_bootstrap(), which unsets globals!
global $profile, $install_locale, $client_email, $conf, $url;
require_once './modules/system/system.install';
require_once './includes/file.inc';
// Ensure correct page headers are sent (e.g. caching)
drupal_page_header();
// Set up $language, so t() caller functions will still work.
drupal_init_language();
// Load module basics (needed for hook invokes).
include_once './includes/module.inc';
$module_list['system']['filename'] = 'modules/system/system.module';
$module_list['filter']['filename'] = 'modules/filter/filter.module';
module_list(TRUE, FALSE, $module_list);
drupal_load('module', 'system');
drupal_load('module', 'filter');
// Set up theme system for the maintenance page.
drupal_maintenance_theme(); // Check existing settings.php.
$verify = install_verify_settings();
// Drupal may already be installed.
if ($verify) {
// Since we have a database connection, we use the normal cache system.
// This is important, as the installer calls into the Drupal system for
// the clean URL checks, so we should maintain the cache properly.
require_once DRUPAL_ROOT . '/includes/cache.inc';
$conf['cache_inc'] = 'includes/cache.inc';
// Initialize the database system. Note that the connection
// won't be initialized until it is actually requested.
require_once DRUPAL_ROOT . '/includes/database/database.inc';
// Check if Drupal is installed.
if (install_verify_drupal()) {
provision_set_error(PROVISION_SITE_INSTALLED);
provision_log('error', st('Site is already installed'));
return FALSE;
}
}
else {
// Since no persistent storage is available yet, and functions that check
// for cached data will fail, we temporarily replace the normal cache
// system with a stubbed-out version that short-circuits the actual
// caching process and avoids any errors.
require_once DRUPAL_ROOT . '/includes/cache-install.inc';
$conf['cache_inc'] = 'includes/cache-install.inc';
}
provision_log("install", st("Installing Drupal schema"));
// Load the profile.
require_once "./profiles/$profile/$profile.profile";
provision_log("install", st("Loading @profile install profile", array("@profile" => $profile)));
provision_log("install", st("Installing translation : @locale", array("@locale" => $install_locale)));
/**
* Handles requirement checking
*
* This code is based on install_check_requirements in install.php
* We separate this out because we want to avoid all the user interface
* code in this function, so we only use the relevant part of it.
*/
$missing_requirement = FALSE;
$requirements = drupal_check_profile($profile);
$severity = drupal_requirements_severity($requirements);
// If there are issues, report them.
if ($severity == REQUIREMENT_ERROR) {
foreach ($requirements as $requirement) {
if (isset($requirement['severity']) && $requirement['severity'] == REQUIREMENT_ERROR) {
drupal_set_message($requirement['description'] .' ('. st('Currently using !item !version', array('!item' => $requirement['title'], '!version' => $requirement['value'])) .')', 'error');
}
}
$missing_requirement = TRUE;
}
if ($severity == REQUIREMENT_WARNING) {
foreach ($requirements as $requirement) {
if (isset($requirement['severity']) && $requirement['severity'] == REQUIREMENT_WARNING) {
$message = $requirement['description'];
if (isset($requirement['value']) && $requirement['value']) {
$message .= ' ('. st('Currently using !item !version', array('!item' => $requirement['title'], '!version' => $requirement['value'])) .')';
}
drupal_set_message($message, 'warning');
}
}
}
if ($missing_requirement) {
provision_set_error(PROVISION_INSTALL_ERROR);
provision_log('error', t("Could not meet the requirements for installing the drupal profile"));
return FALSE;
}
// Verify existence of all required modules.
$requirements = drupal_verify_profile($profile, $install_locale);
// Check the severity of the requirements reported.
$severity = drupal_requirements_severity($requirements);
if ($severity == REQUIREMENT_ERROR) {
provision_log('error', t('Missing requirements'));
provision_set_error(PROVISION_FRAMEWORK_ERROR);
return FALSE;
}