diff --git a/file/file.drush.inc b/file/file.drush.inc index 8090f63065d447ee0796df971e7b85d3a58cfcfe..44cbf3c40e6754091d5f25a98165b89607a3ac18 100644 --- a/file/file.drush.inc +++ b/file/file.drush.inc @@ -25,85 +25,6 @@ function file_drush_exit() { } class provisionService_file extends provisionService { - /** - * Perform tasks on a path. - * - * Perform tasks on a path, and logs error messages / codes on success or - * failure. This function will call another method which defines the - * functionality, and exists to provide a consistent interface for file - * operations with error logging integration. - * - * Many of the $op methods are really simple, but are wrapped in methods to - * provide a consistent interface for path to operate with. - * - * @param type - * The type of operation to perform. One of the following: - * fopen - Get a file pointer for writing. - * - * @param path - * The path you want to perform the file operation on. - * - * @param confirm - * Confirm that the final value of the file operation matches this value. - * This value defaults to TRUE, which is sufficient for most file operations. - * - * These exceptions are : - * fopen - $confirm is the $mode - * - * @param succeed_message - * Log this as a notice into the logging system, if the operation completed succesfully. - * - * @param fail_message - * Log this as a error to the logging system, if the $error_codes parameter has been set, - * otherwise, log this as a warning. If the operation specifies an additional reason for - * the operation failing, it will be appended to this message. - * - * @param error_codes - * Generate these system level errors using the provision error bitmasks. - * - * @return - * Returns TRUE if the test against $confirm passed, otherwise returns FALSE. - */ - function path($op, $path, $confirm = TRUE, $succeed_message = NULL, $fail_message = NULL, $error_codes = NULL) { - if (method_exists($this, $op)) { - // The reason variable is passed into the operation function, to allow the function - // to specify an additional reason as to why the operation failed. - $reason = ''; - - $value = $this->$op($path, $confirm, $reason); - - clearstatcache(); // this needs to be called, otherwise we get the old info - $tokens = array("@path" => $path, "@op" => $op, "@confirm" => $confirm); - if ($reason) { - $fail_message .= " (" . $reason . ")"; - } - $status = is_array($value) ? ($value[0] == $confirm) : ($value == $confirm); - if ($status) { - if (!is_null($succeed_message)) { - drush_log(dt($succeed_message, $tokens), 'message'); - } - } - else { - if ($error_codes) { - // Trigger a sysem halting error - if (!is_null($fail_message)) { - drush_set_error($error_codes, dt($fail_message, $tokens)); - } - else { - drush_set_error($error_codes); - } - } - else { - // Trigger a warning - if (!is_null($fail_message)) { - drush_log(dt($fail_message, $tokens), 'warning'); - } - } - } - return is_array($value) ? $value[1] : $status; - } - } - /** * Determine if $path can be written to. * @@ -206,14 +127,6 @@ class provisionService_file extends provisionService { return $this; } - function fopen($path, $mode) { - $fp = fopen($path, $mode); - if ($fp === FALSE) { - return FALSE; - } - return array(TRUE, $fp); - } - /** * Change the file permissions of $path to the octal value in $perms. * diff --git a/platform/provision_drupal.drush.inc b/platform/provision_drupal.drush.inc index 196d98268de6d5d48f4b6cdb0bcb69dd5e759daf..70acb7b8237628dfce90c12f20a58974e88edac3 100644 --- a/platform/provision_drupal.drush.inc +++ b/platform/provision_drupal.drush.inc @@ -163,16 +163,6 @@ function _provision_drupal_site_installed($url) { return FALSE; } -/** - * The default template to use while generating config files. - * - * @return - * The default template for the config file - */ -function _provision_drupal_default_template() { - return file_get_contents(dirname(__FILE__) .'/provision_drupal_settings.tpl.php'); -} - /** * Generate a settings file for the site. * @@ -183,27 +173,14 @@ function _provision_drupal_default_template() { * because the modules might provide additional information about the site. */ function _provision_drupal_create_settings_file($url = NULL) { - $options = drush_get_merged_options(); - - // As of Drupal 7 there is no more mysqli type - if (drush_drupal_major_version() >= 7) { - $options['db_type'] = ($options['db_type'] == 'mysqli') ? 'mysql' : $options['db_type']; - } - - $options['extra_config'] = "# Extra configuration from modules:\n"; - $options['extra_config'] .= join("\n", drush_command_invoke_all('provision_drupal_config', $url, $options)); - - drush_log(dt("Generate settings.php file")); if (provision_service('file')->exists('sites/' . $url . '/settings.php')->status()) { provision_service('file')->chmod('sites/' . $url . '/settings.php', 0640) ->succeed('Changed permissions of settings.php to @perm') ->fail('Could not change permissions of settings.php to @perm'); } - $fp = provision_service('file')->path('fopen', 'sites/' . $url . '/settings.php', 'w'); - $text = _provision_drupal_default_template(); - fwrite($fp, "<?php\n". provision_render_config($text, $options)); - fclose($fp); + $config = new provisionConfig_drupal_settings(drush_get_merged_options()); + $config->write(); # Change the permissions of the file provision_service('file')->chmod('sites/' . $url . '/settings.php', 0440) @@ -215,6 +192,24 @@ function _provision_drupal_create_settings_file($url = NULL) { ->fail('Could not change group ownership of settings.php to @gid'); } +class provisionConfig_drupal_settings extends provisionConfig { + public $template = 'provision_drupal_settings.tpl.php'; + public $description = 'Drupal settings.php file'; + + function filename() { + return $this->data['sites_path'] . '/' . $this->data['site_url'] . '/settings.php'; + } + + function process() { + if (drush_drupal_major_version() >= 7) { + $this->data['db_type'] = ($this->data['db_type'] == 'mysqli') ? 'mysql' : $this->data['db_type']; + } + + $this->data['extra_config'] = "# Extra configuration from modules:\n"; + $this->data['extra_config'] .= join("\n", drush_command_invoke_all('provision_drupal_config', $this->data['site_url'], $this->data)); + } +} + /** * Create the directories needed to host a drupal site * diff --git a/platform/provision_drupal_settings.tpl.php b/platform/provision_drupal_settings.tpl.php index ff1b44998d91a39ef7fdcffea65517d41c69217e..8122b0938e4c8d13cc72f20bf6c7fac89dd91085 100644 --- a/platform/provision_drupal_settings.tpl.php +++ b/platform/provision_drupal_settings.tpl.php @@ -1,3 +1,4 @@ +<?php print '<?php' ?> /** * The database credentials are stored in the Apache vhost config * of the associated site with SetEnv parameters. diff --git a/platform/verify.provision.inc b/platform/verify.provision.inc index 0b3f79efb0128dc16f6c3071299a0fe68137229c..b0193925cd967972bddd93668be64bf29f4f80ed 100644 --- a/platform/verify.provision.inc +++ b/platform/verify.provision.inc @@ -28,14 +28,10 @@ function drush_provision_drupal_provision_verify($url = null) { provision_service('file')->create_dir(drush_get_option('config_path'), dt('Provision configuration'), 0711); provision_service('file')->create_dir(drush_get_option('config_path') . '/includes', dt('Provision PHP configuration'), 0711); if (!provision_service('file')->exists(drush_get_option('config_path') . '/includes/global.inc')->succeed('Global configuration file exists')->status()) { - # create an empty global.inc so the include doesn't fail with - # open_basedir restrictions - if (!$file = provision_service('file')->path('fopen', drush_get_option('config_path') . '/includes/global.inc', 'a')) { - drush_set_error('PROVISION_FRAMEWORK_ERROR', dt('Cannot create global settings configuration')); - } else { - fwrite($file, "<?php # global settings.php"); - fclose($file); - } + // Create an empty global.inc so the include doesn't fail with + // open_basedir restrictions + $config = new provisionConfig_global_settings(drush_get_merged_options()); + $config->write(); } provision_service('file')->create_dir(drush_get_option('backup_path'), dt('Backup'), 0700); provision_service('file')->writable(drush_get_option('sites_path')) @@ -57,6 +53,17 @@ function drush_provision_drupal_provision_verify($url = null) { } } +class provisionConfig_global_settings extends provisionConfig { + public $template = 'global_settings.tpl.php'; + public $description = 'Global settings.php file'; + + function filename() { + return $this->data['config_path'] . '/includes/global.inc'; + } + + function process() { + } +} /** * Implementation of hook_provision_post_verify diff --git a/provision.inc b/provision.inc index 6ec6c7545fdd826f683c3acfce04d1414bd3aaf2..c11b373a6593d5449b58e5da5fc80a7230cd520f 100644 --- a/provision.inc +++ b/provision.inc @@ -90,27 +90,29 @@ function provision_save_site_data() { drush_save_config($context); - $filename = _drush_config_file($context); if (!drush_get_error()) { - // append the db settings in the _SERVER variable so normal drush commands can still read it. - $cache = drush_get_context($context); - - $fp = provision_service('file')->path('fopen', $filename, 'a+'); - $fields = array('db_type', 'db_host', 'db_user', 'db_passwd', 'db_name'); - - foreach ($fields as $key) { - $line = "\n\$_SERVER['$key'] = ". var_export($cache[$key], TRUE) .';'; - fwrite($fp, $line); - } - fwrite($fp, "\n"); - fclose($fp); + $config = new provisionConfig_drushrc(drush_get_merged_options()); + $config->write(); } - provision_service('file')->chmod($filename, 0600) + provision_service('file')->chmod(_drush_config_file($context), 0600) ->succeed('Changed permissions of drushrc.php to @perm') ->fail('Could not change permissions of drushrc.php to @perm'); } +class provisionConfig_drushrc extends provisionConfig { + public $template = 'provision_drushrc.tpl.php'; + public $description = 'Drush configuration file'; + + function filename() { + return $this->data['config-file']; + } + + function process() { + $this->mode = 'a+'; + } +} + /** * @} End of "defgroup sitedata". */ @@ -134,43 +136,6 @@ function provision_save_platform_data() { return drush_save_config('drupal'); } -/** - * @defgroup provisionvalues Value replacement support for the provisioning framework - * @{ - */ - -/** - * Generate the text for a config file using php - */ -function provision_render_config($template, $variables) { - drush_errors_off(); - extract($variables, EXTR_SKIP); // Extract the variables to a local namespace - ob_start(); // Start output buffering - eval('?'.'>' . $template); // Generate content - $contents = ob_get_contents(); // Get the contents of the buffer - ob_end_clean(); // End buffering and discard - drush_errors_on(); - return $contents; // Return the contents -} - -/** - * Write a config based on a template - * - * @see provision_render_config() - */ -function provision_write_config($drush_option, $file, $template, $data) { - $file = provision_service('file')->path('fopen', drush_get_option($drush_option) . '/' . $file, 'w'); - $text = provision_render_config($template, $data); - fwrite($file, $text); - fclose($file); -} - - -/** - * @} End of "defgroup provisionvalues". - */ - - /** * Remove files or directories, recursively * diff --git a/provision.service.inc b/provision.service.inc index ced538f25ac3a9884a741fd94d9f56a59508e261..139393b80aa1c53f3ff6ee02850ce5b797b99232 100644 --- a/provision.service.inc +++ b/provision.service.inc @@ -86,6 +86,7 @@ class provisionConfig { public $template = null; public $data = array(); public $description = null; + protected $mode = 'w'; function __construct($data = array()) { if (is_null($this->template)) { @@ -141,7 +142,7 @@ class provisionConfig { if ($template = $this->load_template()) { #todo - convert to file_service - $file = fopen($filename, "w"); + $file = fopen($filename, $this->mode); $text = $this->render_template($template, $this->data); fwrite($file, $text); fclose($file); diff --git a/ssl/provision_ssl.drush.inc b/ssl/provision_ssl.drush.inc index ee977f08f15467d82801694e880fcbd0be6b6ac9..09482cf9ca1e609330d54533ae4916a444f71898 100644 --- a/ssl/provision_ssl.drush.inc +++ b/ssl/provision_ssl.drush.inc @@ -1,5 +1,6 @@ <?php +include_once(dirname(__FILE__) . '/../provision.service.inc'); /** * @file * @@ -24,14 +25,8 @@ function provision_ssl_provision_apache_vhost_config($url, $options) { if ($options['ssl_redirect']) { // That's pretty bad, but if we *don't* do that, the vhost is never updated after the first write // XXX: we need a better way to identify if this is legit - if (provision_service('file')->exists(drush_get_option('vhost_path') . '/' . $url . '_80')->status()) { - drush_log(dt('Overwriting existing vhost %url:80 with redirection', array('%url' => $url)), 'warning'); - } - $newoptions = $options; - // in the redirection template, the ServerName is the first alias in the list - array_push($newoptions['aliases'], $options['site_url']); - $newoptions['site_port'] = 80; - provision_write_config('vhost_path', $url . '_80', _provision_apache_redirect_template(), $newoptions); + $config = new provisionConfig_ssl_vhost(drush_get_merged_options()); + $config->write(); } return array("php_value session.cookie_secure 1", "SSLEngine On"); } else { @@ -39,6 +34,20 @@ function provision_ssl_provision_apache_vhost_config($url, $options) { } } +class provisionConfig_ssl_vhost extends provisionConfig { + public $template = '../http/apache/vhost_redirect.tpl.php'; + public $description = 'Redirect for SSL'; + + function filename() { + return $this->data['vhost_path'] . '/' . $this->data['site_url'] . '_80'; + } + + function process() { + array_push($this->data['aliases'], $this->data['site_url']); + $this->data['site_port'] = 80; + } +} + /** * Implementation of hook_provision_apache_delete_vhost() *