You are here

class backup_migrate_destination_filesource in Backup and Migrate 6.3

Same name and namespace in other branches
  1. 8.3 includes/sources.filesource.inc \backup_migrate_destination_filesource
  2. 7.3 includes/sources.filesource.inc \backup_migrate_destination_filesource

A destination type for saving locally to the server.

Hierarchy

Expanded class hierarchy of backup_migrate_destination_filesource

1 string reference to 'backup_migrate_destination_filesource'
backup_migrate_backup_migrate_source_subtypes in includes/sources.inc
Implementation of hook_backup_migrate_source_subtypes().

File

includes/sources.filesource.inc, line 15
A destination type for saving locally to the server.

View source
class backup_migrate_destination_filesource extends backup_migrate_source {
  var $supported_ops = array(
    'restore',
    'configure',
    'delete',
    'source',
  );
  function type_name() {
    return t("Files Directory");
  }

  /**
   * Declare the current files directory as a backup source..
   */
  function sources() {
    $out = array();
    $out['files'] = backup_migrate_create_destination('filesource', array(
      'machine_name' => 'files',
      'location' => file_directory_path(),
      'name' => t('Files Directory'),
      'show_in_list' => FALSE,
    ));
    return $out;
  }

  /**
   * Get the form for the settings for the files destination.
   */
  function edit_form() {
    $form = parent::edit_form();
    $form['location'] = array(
      "#type" => "textfield",
      "#title" => t("Directory path"),
      "#default_value" => $this
        ->get_location(),
      "#required" => TRUE,
      "#description" => t('Enter the path to the directory to save the backups to. Use a relative path to pick a path relative to your Drupal root directory. The web server must be able to write to this path.'),
    );
    return $form;
  }

  /**
   * Return a list of backup filetypes.
   */
  function file_types() {
    return array(
      "tar" => array(
        "extension" => "tar",
        "filemime" => "application/x-tar",
        "backup" => TRUE,
        "restore" => TRUE,
      ),
    );
  }

  /**
   * Get the form for the settings for this destination.
   *
   * Return the default directories whose data can be ignored. These directories contain
   *  info which can be easily reproducted. Also exclude the backup and migrate folder
   *  to prevent exponential bloat.
   */
  function backup_settings_default() {
    return array(
      'exclude_filepaths' => "backup_migrate\nimagecache\ncss\njs\nctools\nimagefield_thumbs",
    );
  }

  /**
   * Get the form for the backup settings for this destination.
   */
  function backup_settings_form($settings) {
    $form['exclude_filepaths'] = array(
      "#type" => "textarea",
      "#multiple" => TRUE,
      "#title" => t("Exclude the following files or directories"),
      "#default_value" => $settings['exclude_filepaths'],
      "#description" => t("A list of files or directories to be excluded from backups. Add one path per line relative to the directory being backed up."),
    );
    return $form;
  }

  /**
   * Backup from this source.
   */
  function backup_to_file($file, $settings) {
    if ($out = $this
      ->_backup_to_file_cli($file, $settings)) {
      return $out;
    }
    else {
      return $this
        ->_backup_to_file_php($file, $settings);
    }
  }

  /**
   * Backup from this source.
   */
  function _backup_to_file_php($file, $settings) {
    if ($this
      ->check_libs()) {
      $excluded_paths = empty($settings->filters['exclude_filepaths']) ? '' : $settings->filters['exclude_filepaths'];
      $files = $this
        ->get_files_to_backup($this
        ->get_realpath(), $settings, $this
        ->get_excluded_paths($excluded_paths), realpath('.') . '/');
      if ($files) {
        $file
          ->push_type('tar');
        $gz = new Archive_Tar($file
          ->filepath(), false);
        $gz
          ->addModify($files, '', $this
          ->get_realpath());
        return $file;
      }
      backup_migrate_backup_fail('No files available.', array(), $settings);
      return FALSE;
    }
    return FALSE;
  }

  /**
   * Backup from this source.
   */
  function _backup_to_file_cli($file, $settings) {
    if (!empty($settings->filters['use_cli']) && function_exists('backup_migrate_exec') && function_exists('escapeshellarg')) {
      $excluded_paths = empty($settings->filters['exclude_filepaths']) ? '' : $settings->filters['exclude_filepaths'];
      $exclude = array();
      foreach ($this
        ->get_excluded_paths($excluded_paths) as $path) {
        $exclude[] = '--exclude=' . escapeshellarg($path);
      }
      $exclude = implode(' ', $exclude);

      // Create a symlink in a temp directory so we can rename the file in the archive.
      $temp = backup_migrate_temp_directory();
      $file
        ->push_type('tar');
      backup_migrate_exec("tar --dereference -C %input -rf %output {$exclude} .", array(
        '%output' => $file
          ->filepath(),
        '%input' => $this
          ->get_realpath(),
        '%temp' => $temp,
      ));
      return $file;
    }
    return FALSE;
  }

  /**
   * Restore to this source.
   */
  function restore_from_file($file, &$settings) {
    if ($out = $this
      ->_restore_from_file_cli($file, $settings)) {
      return $out;
    }
    else {
      return $this
        ->_restore_from_file_php($file, $settings);
    }
  }

  /**
   * Restore to this source.
   */
  function _restore_from_file_php($file, &$settings) {
    if ($this
      ->check_libs()) {
      $from = $file
        ->pop_type();
      $temp = backup_migrate_temp_directory();
      $tar = new Archive_Tar($from
        ->filepath());
      $tar
        ->extractModify($temp, $file->name);

      // Older B&M Files format included a base 'files' directory.
      if (file_exists($temp . '/files')) {
        $temp = $temp . '/files';
      }
      if (file_exists($temp . '/' . $file->name . '/files')) {
        $temp = $temp . '/files';
      }

      // Move the files from the temp directory.
      _backup_migrate_move_files($temp, $this
        ->get_realpath());
      return $file;
    }
    return FALSE;
  }

  /**
   * Restore to this source.
   */
  function _restore_from_file_cli($file, &$settings) {
    if (!empty($settings->filters['use_cli']) && function_exists('backup_migrate_exec')) {
      $temp = backup_migrate_temp_directory();
      backup_migrate_exec("tar -C %temp -xf %input", array(
        '%input' => $file
          ->filepath(),
        '%temp' => $temp,
      ));

      // Older B&M Files format included a base 'files' directory.
      if (file_exists($temp . '/files')) {
        $temp = $temp . '/files';
      }
      if (file_exists($temp . '/' . $file->name . '/files')) {
        $temp = $temp . '/files';
      }

      // Move the files from the temp directory.
      backup_migrate_exec("mv -rf %temp/* %output", array(
        '%output' => $this
          ->get_realpath(),
        '%temp' => $temp,
      ));
      return $file;
    }
    return FALSE;
  }

  /**
   * Get a list of files to backup from the given set if dirs. Exclude any that match the array $exclude.
   */
  function get_files_to_backup($dir, $settings, $exclude = array(), $base_dir = '') {
    $out = array();
    if (!file_exists($dir)) {
      backup_migrate_backup_fail('Directory %dir does not exist.', array(
        '%dir' => $dir,
      ), $settings);
      return FALSE;
    }
    if ($handle = @opendir($dir)) {
      while (($file = readdir($handle)) !== FALSE) {
        if ($file != '.' && $file != '..' && !in_array($file, $exclude)) {
          $file = realpath($dir . '/' . $file);
          $path = str_replace($base_dir, '', $file);

          // If the path is not excluded.
          if (!in_array($path, $exclude)) {
            if (is_dir($file)) {
              $subdir = $this
                ->get_files_to_backup($file, $settings, $exclude, $base_dir);

              // If there was an error reading the subdirectory then abort the backup.
              if ($subdir === FALSE) {
                closedir($handle);
                return FALSE;
              }

              // If the directory is empty, add an empty directory.
              if (count($subdir) == 0) {
                $out[] = $path;
              }
              $out = array_merge($out, $subdir);
            }
            else {
              if (is_readable($file)) {
                $out[] = $path;
              }
              else {
                backup_migrate_backup_fail('The directory cannot be backed up because the file %file cannot be read by the web server.', array(
                  '%file' => str_replace($base_dir, '', $file),
                ), $settings);
                closedir($handle);
                return FALSE;
              }
            }
          }
        }
      }
      closedir($handle);
    }
    else {
      backup_migrate_backup_fail('Could not open directory %dir', array(
        '%dir' => $dir,
      ), $settings);
      return FALSE;
    }
    return $out;
  }

  /**
   * Break the excpluded paths string into a usable list of paths.
   */
  function get_excluded_paths($paths) {
    $out = explode("\n", $paths);
    foreach ($out as $key => $val) {
      $out[$key] = trim($val, "/ \t\r\n");
    }
    return $out;
  }

  /**
   * Check that the required libraries are installed.
   */
  function check_libs() {
    $result = true;

    // Extend inlcude path with path to this module's includes directory.
    $includes_directory = './' . drupal_get_path('module', 'backup_migrate_files') . '/includes';
    $include_path_old = set_include_path($includes_directory . ';' . get_include_path());

    // Check if PEAR.php is present in a non-fatal way and error gracefully if it isn't.
    include_once 'PEAR.php';
    if (!class_exists('PEAR')) {
      _backup_migrate_message('PEAR is not installed correctly. See the README.txt file in the backup_migrate_files module directory for help.', array(), 'error');
      $result = false;
    }

    // Check if Tar.php is present in a non-fatal way and error gracefully if it isn't.
    if ($result) {

      // Try to get version in this module's includes directory first, but prevent warning texts being output.
      if (file_exists($includes_directory . '/Tar.php')) {
        include_once $includes_directory . '/Tar.php';
      }
      if (!class_exists('Archive_Tar')) {

        // Try to get via PEAR directory structure.
        include_once 'Archive/Tar.php';
        if (!class_exists('Archive_Tar')) {
          _backup_migrate_message('Archive_Tar is not installed correctly. See the README.txt file in the backup_migrate_files module directory for help.', array(), 'error');
          $result = false;
        }
      }
    }

    // Restore include path.
    set_include_path($include_path_old);
    return $result;
  }

  /**
   * Get the file location.
   */
  function get_realpath() {
    return drupal_realpath($this
      ->get_location());
  }

}

Members

Namesort descending Modifiers Type Description Overrides
backup_migrate_destination_filesource::$supported_ops property Overrides backup_migrate_location::$supported_ops 1
backup_migrate_destination_filesource::backup_settings_default function Get the form for the settings for this destination. Overrides backup_migrate_location::backup_settings_default 1
backup_migrate_destination_filesource::backup_settings_form function Get the form for the backup settings for this destination. Overrides backup_migrate_location::backup_settings_form
backup_migrate_destination_filesource::backup_to_file function Backup from this source.
backup_migrate_destination_filesource::check_libs function Check that the required libraries are installed.
backup_migrate_destination_filesource::edit_form function Get the form for the settings for the files destination. Overrides backup_migrate_location::edit_form
backup_migrate_destination_filesource::file_types function Return a list of backup filetypes. Overrides backup_migrate_location::file_types 1
backup_migrate_destination_filesource::get_excluded_paths function Break the excpluded paths string into a usable list of paths.
backup_migrate_destination_filesource::get_files_to_backup function Get a list of files to backup from the given set if dirs. Exclude any that match the array $exclude.
backup_migrate_destination_filesource::get_realpath function Get the file location.
backup_migrate_destination_filesource::restore_from_file function Restore to this source.
backup_migrate_destination_filesource::sources function Declare the current files directory as a backup source.. 1
backup_migrate_destination_filesource::type_name function 1
backup_migrate_destination_filesource::_backup_to_file_cli function Backup from this source. 1
backup_migrate_destination_filesource::_backup_to_file_php function Backup from this source. 1
backup_migrate_destination_filesource::_restore_from_file_cli function Restore to this source. 1
backup_migrate_destination_filesource::_restore_from_file_php function Restore to this source. 1
backup_migrate_item::$settings_path property
backup_migrate_item::$show_in_list property
backup_migrate_item::$storage property
backup_migrate_item::all_items function Get all of the given items.
backup_migrate_item::decode_db_row function Decode a loaded db row (unserialize necessary fields).
backup_migrate_item::delete function Delete the item from the database.
backup_migrate_item::edit_form_submit function Submit the edit form for the item. 6
backup_migrate_item::edit_form_validate function Validate the edit form for the item. 4
backup_migrate_item::export function Return as an exported array of values.
backup_migrate_item::from_array function Load an existing item from an array.
backup_migrate_item::generate_id function Return a random (very very likely unique) string id for a new item.
backup_migrate_item::get function Get the member with the given key.
backup_migrate_item::get_actions function Get the rendered action links for a destination.
backup_migrate_item::get_default_values function Get the default values for standard parameters. 2
backup_migrate_item::get_id function Get the primary id for this item (if any is set).
backup_migrate_item::get_list function Get a table of all items of this type. 1
backup_migrate_item::get_list_header function Get header for a lost of this type.
backup_migrate_item::get_machine_name_field function Get the machine name field name from the schema.
backup_migrate_item::get_menu_items function Get the menu items for manipulating this type. 2
backup_migrate_item::get_primary_key function Get the primary key field title from the schema.
backup_migrate_item::get_schema function Get the schema for the item type.
backup_migrate_item::get_serialized_fields function Return the fields which must be serialized before saving to the db.
backup_migrate_item::get_settings_path function Get the columns needed to list the type.
backup_migrate_item::item function A particular item.
backup_migrate_item::item_exists function A particular item.
backup_migrate_item::load_row function Load an existing item from an database (serialized) array.
backup_migrate_item::revert_confirm_message function Get the message to send to the user when confirming the deletion of the item.
backup_migrate_item::save function Save the item to the database.
backup_migrate_item::set_id function Set the primary id for this item (if any is set).
backup_migrate_item::show_in_list function Get the columns needed to list the type.
backup_migrate_item::to_array function Return as an array of values. 1
backup_migrate_item::unique_id function Make sure this item has a unique id. Should only be called for new items or the item will collide with itself.
backup_migrate_item::_merge_defaults function Merge parameters with the given defaults.
backup_migrate_item::__construct function Constructor, set the basic info pulled from the db or generated programatically. 4
backup_migrate_location::$default_values property Overrides backup_migrate_item::$default_values 1
backup_migrate_location::$subtype property
backup_migrate_location::backup_settings_form_submit function Submit the settings form. Any values returned will be saved.
backup_migrate_location::backup_settings_form_validate function Get the form for the settings for this filter.
backup_migrate_location::can_read_file function Determine if we can read the given file. 1
backup_migrate_location::create function Create a new location of the correct type. Overrides backup_migrate_item::create
backup_migrate_location::delete_confirm_message function Get the message to send to the user when confirming the deletion of the item. Overrides backup_migrate_item::delete_confirm_message 1
backup_migrate_location::get_action_links function Get the action links for a location. Overrides backup_migrate_item::get_action_links 1
backup_migrate_location::get_display_location function 4
backup_migrate_location::get_list_column_info function Get the columns needed to list the type. Overrides backup_migrate_item::get_list_column_info
backup_migrate_location::get_list_row function Get a row of data to be used in a list of items of this type. Overrides backup_migrate_item::get_list_row 1
backup_migrate_location::get_location function 3
backup_migrate_location::get_name function Get the name of the item. Overrides backup_migrate_item::get_name 1
backup_migrate_location::get_subtype_name function Get the type name of this location for display to the user.
backup_migrate_location::glue_url function Glue a URLs component parts back into a URL. 1
backup_migrate_location::op function Does this location support the given operation.
backup_migrate_location::ops function
backup_migrate_location::remove_op function Remove the given op from the support list.
backup_migrate_location::restore_settings_default function Get the form for the settings for this filter.
backup_migrate_location::restore_settings_form function Get the form for the settings for this filter.
backup_migrate_location::restore_settings_form_submit function Submit the settings form. Any values returned will be saved.
backup_migrate_location::restore_settings_form_validate function Get the form for the settings for this filter.
backup_migrate_location::settings function
backup_migrate_location::settings_default function Get the form for the settings for this location type. 1
backup_migrate_location::settings_form function Get the form for the settings for this location. 1
backup_migrate_location::settings_form_submit function Submit the settings form. Any values returned will be saved. 1
backup_migrate_location::settings_form_validate function Validate the form for the settings for this location. 1
backup_migrate_location::set_location function 3
backup_migrate_location::set_name function
backup_migrate_location::set_url function Break a URL into it's component parts. 1
backup_migrate_location::url function Get a url from the parts. 1
backup_migrate_source::$db_table property Overrides backup_migrate_location::$db_table
backup_migrate_source::$plural property Overrides backup_migrate_location::$plural
backup_migrate_source::$singular property Overrides backup_migrate_location::$singular
backup_migrate_source::$title_plural property Overrides backup_migrate_location::$title_plural
backup_migrate_source::$title_singular property Overrides backup_migrate_location::$title_singular
backup_migrate_source::$type_name property Overrides backup_migrate_location::$type_name
backup_migrate_source::location_types function Get the available location types. Overrides backup_migrate_location::location_types
backup_migrate_source::strings function This function is not supposed to be called. It is just here to help the po extractor out. Overrides backup_migrate_location::strings