Skip to content
backup.provision.inc 3.86 KiB
Newer Older
<?php

/**
 * Provision backup command
 *
 * Back up an existing site
 */

/**
 * Make sure the site is installed and enabled, and that we have a valid target to back up to.
 */
function drush_provision_drupal_provision_backup_validate($backup_file = NULL) {
  if (!@drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION)) {
    if (drush_get_option('force', false)) {
      drush_log("clearing error");
      drush_set_context('DRUSH_ERROR_CODE', DRUSH_SUCCESS);
    }
  }
  if (!drush_get_option('installed') && !drush_get_option('force', false)) {
     drush_set_error('PROVISION_DRUPAL_SITE_NOT_FOUND');

  // This is the actual drupal provisioning requirements. 
Neil Drumm's avatar
Neil Drumm committed
  if (!is_dir(d()->platform->server->backup_path)) {
    drush_set_error('PROVISION_BACKUP_PATH_NOT_FOUND');
    if (provision_file()->exists($backup_file)->status()) {
      drush_set_error('PROVISION_BACKUP_ALREADY_EXISTS', dt('Back up file @path already exists.', array('@path' => $backup_file)));
    }
    else {
      drush_log(dt('Backing site up to @path.', array('@path' => $backup_file)), 'message');
      drush_set_option('backup_file', $backup_file);
Adrian Rossouw's avatar
Adrian Rossouw committed
    $suggested = d()->platform->server->backup_path . '/' . d()->uri . '-' . date("Ymd.His", mktime()) . '.tar.gz';

    // Use format of mysite.com-2008-01-02, if already existing, add number.
    while (is_file($suggested)) {
Adrian Rossouw's avatar
Adrian Rossouw committed
      $suggested = d()->platform->server->backup_path . '/' . d()->uri . '-' .  date('Ymd.His', mktime()) . '_' . $count . '.tar.gz';
    drush_set_option('backup_file', $suggested);
function drush_provision_drupal_provision_backup() {
  // Adds the site directory into the backup file
  drush_log(dt("Adding sites directory to !backup_file", array('!backup_file' => $backup_file)), 'backup');
  $olddir = getcwd();
  // we need to do this because some retarded implementations of tar (e.g. SunOS) don't support -C
  if (substr($backup_file, -2) == 'gz') {
    // same as above: some do not support -z
    $command = "tar cpf - . | gzip -c > %s";
  $result = provision_shell_exec($command,  $backup_file);
  chdir($olddir);
  if (!$result && !drush_get_option('force', false)) {
    drush_set_error('PROVISION_BACKUP_FAILED', dt("Could not back up sites directory for drupal"));

/**
 * Remove the backup file if something went wrong
 */
mig5's avatar
mig5 committed
function drush_provision_drupal_provision_backup_rollback() {
  $backup_file = drush_get_option('backup_file');
  if (file_exists($backup_file)) {
    provision_file()->unlink($backup_file)
      ->succeed('Removed stale backup file @path')
      ->fail('Failed deleting backup file @path');

/**
 * Post backup purge. delete older files if instructed too.
 */
function drush_provision_drupal_post_provision_backup() {
  if ($timestamp = drush_get_option('delete_backups_older_than',FALSE)) {
    $timestamp = mktime() - $timestamp;
    $to_delete = array();
    $regex = sprintf("/^%s-(.*)\.(.*)\.tar\.gz$/", d()->uri);
    $backup_path = d('@server_master')->backup_path;
    $files = drush_scan_directory($backup_path , $regex, array('.', '..', 'CVS', '.svn'), 0, FALSE, 'basename');

    if (sizeof($files)) {
      foreach ($files as $filename => $file) {
        $matches = array();
         preg_match($regex, $filename, $matches);
        $filetime = strtotime($matches[1] .' '. $matches[2]);
        if ($filetime < $timestamp) {
          $to_delete[] = $backup_path . '/' . $filename;
        }
      }

      foreach ($to_delete as $delete) {
        provision_file()->unlink($delete)->succeed("Backup file @path has been deleted")->fail("Backup file @path could not be deleted");
      }
      drush_set_option('backup_files_deleted', $to_delete);
    }
  }
}