Class: Backup::Archive

Inherits:
Object
  • Object
show all
Includes:
Utilities::Helpers
Defined in:
lib/backup/archive.rb

Defined Under Namespace

Classes: DSL, Error

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, name, &block) ⇒ Archive

Adds a new Archive to a Backup Model.

Backup::Model.new(:my_backup, 'My Backup') do
  archive :my_archive do |archive|
    archive.add 'path/to/archive'
    archive.add '/another/path/to/archive'
    archive.exclude 'path/to/exclude'
    archive.exclude '/another/path/to/exclude'
  end
end

All paths added using ‘add` or `exclude` will be expanded to their full paths from the root of the filesystem. Files will be added to the tar archive using these full paths, and their leading `/` will be preserved (using tar’s ‘-P` option).

/path/to/pwd/path/to/archive/...
/another/path/to/archive/...

When a ‘root` path is given, paths to add/exclude are taken as relative to the `root` path, unless given as absolute paths.

Backup::Model.new(:my_backup, 'My Backup') do
  archive :my_archive do |archive|
    archive.root '~/my_data'
    archive.add 'path/to/archive'
    archive.add '/another/path/to/archive'
    archive.exclude 'path/to/exclude'
    archive.exclude '/another/path/to/exclude'
  end
end

This directs ‘tar` to change directories to the `root` path to create the archive. Unless paths were given as absolute, the paths within the archive will be relative to the `root` path.

path/to/archive/...
/another/path/to/archive/...

For absolute paths added to this archive, the leading ‘/` will be preserved. Take note that when archives are extracted, leading `/` are stripped by default, so care must be taken when extracting archives with mixed relative/absolute paths.



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/backup/archive.rb', line 54

def initialize(model, name, &block)
  @model   = model
  @name    = name.to_s
  @options = {
    :sudo        => false,
    :root        => false,
    :paths       => [],
    :excludes    => [],
    :tar_options => ''
  }
  DSL.new(@options).instance_eval(&block)
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



8
9
10
# File 'lib/backup/archive.rb', line 8

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



8
9
10
# File 'lib/backup/archive.rb', line 8

def options
  @options
end

Instance Method Details

#perform!Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/backup/archive.rb', line 67

def perform!
  Logger.info "Creating Archive '#{ name }'..."

  path = File.join(Config.tmp_path, @model.trigger, 'archives')
  FileUtils.mkdir_p(path)

  pipeline = Pipeline.new
  with_files_from(paths_to_package) do |files_from|
    pipeline.add(
      "#{ tar_command } #{ tar_options } -cPf -#{ tar_root } " +
      "#{ paths_to_exclude } #{ files_from }",
      tar_success_codes
    )

    extension = 'tar'
    @model.compressor.compress_with do |command, ext|
      pipeline << command
      extension << ext
    end if @model.compressor

    pipeline << "#{ utility(:cat) } > " +
        "'#{ File.join(path, "#{ name }.#{ extension }") }'"
    pipeline.run
  end

  if pipeline.success?
    Logger.info "Archive '#{ name }' Complete!"
  else
    raise Error, "Failed to Create Archive '#{ name }'\n" +
        pipeline.error_messages
  end
end