backup 3.0.23 → 3.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +42 -45
- data/Guardfile +7 -4
- data/README.md +10 -7
- data/backup.gemspec +2 -2
- data/lib/backup.rb +27 -97
- data/lib/backup/archive.rb +14 -6
- data/lib/backup/cli/helpers.rb +52 -49
- data/lib/backup/cli/utility.rb +9 -1
- data/lib/backup/compressor/base.rb +10 -4
- data/lib/backup/compressor/bzip2.rb +22 -26
- data/lib/backup/compressor/custom.rb +53 -0
- data/lib/backup/compressor/gzip.rb +22 -23
- data/lib/backup/compressor/lzma.rb +15 -13
- data/lib/backup/compressor/pbzip2.rb +20 -17
- data/lib/backup/config.rb +6 -3
- data/lib/backup/configuration.rb +33 -0
- data/lib/backup/configuration/helpers.rb +114 -28
- data/lib/backup/configuration/store.rb +24 -0
- data/lib/backup/database/base.rb +0 -6
- data/lib/backup/database/mongodb.rb +27 -11
- data/lib/backup/database/mysql.rb +19 -14
- data/lib/backup/database/postgresql.rb +16 -11
- data/lib/backup/database/redis.rb +7 -11
- data/lib/backup/database/riak.rb +3 -6
- data/lib/backup/dependency.rb +5 -11
- data/lib/backup/model.rb +14 -5
- data/lib/backup/notifier/campfire.rb +3 -16
- data/lib/backup/notifier/hipchat.rb +1 -7
- data/lib/backup/notifier/mail.rb +1 -1
- data/lib/backup/packager.rb +29 -19
- data/lib/backup/pipeline.rb +110 -0
- data/lib/backup/storage/dropbox.rb +4 -7
- data/lib/backup/syncer/base.rb +8 -4
- data/lib/backup/syncer/cloud/base.rb +247 -0
- data/lib/backup/syncer/cloud/cloud_files.rb +78 -0
- data/lib/backup/syncer/cloud/s3.rb +68 -0
- data/lib/backup/syncer/rsync/base.rb +1 -4
- data/lib/backup/syncer/rsync/local.rb +9 -5
- data/lib/backup/syncer/rsync/pull.rb +1 -1
- data/lib/backup/syncer/rsync/push.rb +10 -5
- data/lib/backup/version.rb +1 -1
- data/spec-live/.gitignore +6 -0
- data/spec-live/README +7 -0
- data/spec-live/backups/config.rb +153 -0
- data/spec-live/backups/config.yml.template +43 -0
- data/spec-live/compressor/custom_spec.rb +30 -0
- data/spec-live/compressor/gzip_spec.rb +30 -0
- data/spec-live/notifier/mail_spec.rb +85 -0
- data/spec-live/spec_helper.rb +85 -0
- data/spec-live/storage/dropbox_spec.rb +151 -0
- data/spec-live/storage/local_spec.rb +83 -0
- data/spec-live/storage/scp_spec.rb +193 -0
- data/spec-live/syncer/cloud/s3_spec.rb +124 -0
- data/spec/archive_spec.rb +86 -31
- data/spec/cleaner_spec.rb +8 -0
- data/spec/cli/helpers_spec.rb +200 -75
- data/spec/cli/utility_spec.rb +11 -3
- data/spec/compressor/base_spec.rb +31 -10
- data/spec/compressor/bzip2_spec.rb +212 -57
- data/spec/compressor/custom_spec.rb +106 -0
- data/spec/compressor/gzip_spec.rb +212 -57
- data/spec/compressor/lzma_spec.rb +75 -35
- data/spec/compressor/pbzip2_spec.rb +93 -52
- data/spec/configuration/helpers_spec.rb +406 -0
- data/spec/configuration/store_spec.rb +39 -0
- data/spec/configuration_spec.rb +62 -0
- data/spec/database/base_spec.rb +19 -10
- data/spec/database/mongodb_spec.rb +195 -70
- data/spec/database/mysql_spec.rb +183 -64
- data/spec/database/postgresql_spec.rb +167 -53
- data/spec/database/redis_spec.rb +121 -46
- data/spec/database/riak_spec.rb +96 -27
- data/spec/dependency_spec.rb +2 -0
- data/spec/encryptor/base_spec.rb +10 -0
- data/spec/encryptor/gpg_spec.rb +29 -13
- data/spec/encryptor/open_ssl_spec.rb +40 -21
- data/spec/logger_spec.rb +4 -0
- data/spec/model_spec.rb +19 -2
- data/spec/notifier/base_spec.rb +32 -17
- data/spec/notifier/campfire_spec.rb +63 -45
- data/spec/notifier/hipchat_spec.rb +79 -56
- data/spec/notifier/mail_spec.rb +82 -46
- data/spec/notifier/prowl_spec.rb +53 -32
- data/spec/notifier/twitter_spec.rb +62 -41
- data/spec/packager_spec.rb +95 -36
- data/spec/pipeline_spec.rb +259 -0
- data/spec/spec_helper.rb +6 -5
- data/spec/storage/base_spec.rb +61 -41
- data/spec/storage/cloudfiles_spec.rb +69 -45
- data/spec/storage/dropbox_spec.rb +158 -36
- data/spec/storage/ftp_spec.rb +69 -45
- data/spec/storage/local_spec.rb +47 -23
- data/spec/storage/ninefold_spec.rb +55 -31
- data/spec/storage/rsync_spec.rb +67 -50
- data/spec/storage/s3_spec.rb +65 -41
- data/spec/storage/scp_spec.rb +65 -41
- data/spec/storage/sftp_spec.rb +65 -41
- data/spec/syncer/base_spec.rb +91 -4
- data/spec/syncer/cloud/base_spec.rb +511 -0
- data/spec/syncer/cloud/cloud_files_spec.rb +181 -0
- data/spec/syncer/cloud/s3_spec.rb +174 -0
- data/spec/syncer/rsync/base_spec.rb +46 -66
- data/spec/syncer/rsync/local_spec.rb +55 -26
- data/spec/syncer/rsync/pull_spec.rb +15 -4
- data/spec/syncer/rsync/push_spec.rb +59 -52
- data/templates/cli/utility/compressor/bzip2 +1 -4
- data/templates/cli/utility/compressor/custom +11 -0
- data/templates/cli/utility/compressor/gzip +1 -4
- data/templates/cli/utility/compressor/lzma +3 -0
- data/templates/cli/utility/compressor/pbzip2 +3 -0
- data/templates/cli/utility/database/mysql +4 -1
- data/templates/cli/utility/syncer/cloud_files +17 -19
- data/templates/cli/utility/syncer/s3 +18 -20
- metadata +38 -92
- data/lib/backup/configuration/base.rb +0 -15
- data/lib/backup/configuration/compressor/base.rb +0 -9
- data/lib/backup/configuration/compressor/bzip2.rb +0 -23
- data/lib/backup/configuration/compressor/gzip.rb +0 -23
- data/lib/backup/configuration/compressor/lzma.rb +0 -23
- data/lib/backup/configuration/compressor/pbzip2.rb +0 -28
- data/lib/backup/configuration/database/base.rb +0 -19
- data/lib/backup/configuration/database/mongodb.rb +0 -49
- data/lib/backup/configuration/database/mysql.rb +0 -42
- data/lib/backup/configuration/database/postgresql.rb +0 -41
- data/lib/backup/configuration/database/redis.rb +0 -39
- data/lib/backup/configuration/database/riak.rb +0 -29
- data/lib/backup/configuration/encryptor/base.rb +0 -9
- data/lib/backup/configuration/encryptor/gpg.rb +0 -17
- data/lib/backup/configuration/encryptor/open_ssl.rb +0 -32
- data/lib/backup/configuration/notifier/base.rb +0 -28
- data/lib/backup/configuration/notifier/campfire.rb +0 -25
- data/lib/backup/configuration/notifier/hipchat.rb +0 -41
- data/lib/backup/configuration/notifier/mail.rb +0 -112
- data/lib/backup/configuration/notifier/presently.rb +0 -25
- data/lib/backup/configuration/notifier/prowl.rb +0 -23
- data/lib/backup/configuration/notifier/twitter.rb +0 -21
- data/lib/backup/configuration/storage/base.rb +0 -18
- data/lib/backup/configuration/storage/cloudfiles.rb +0 -25
- data/lib/backup/configuration/storage/dropbox.rb +0 -58
- data/lib/backup/configuration/storage/ftp.rb +0 -29
- data/lib/backup/configuration/storage/local.rb +0 -17
- data/lib/backup/configuration/storage/ninefold.rb +0 -20
- data/lib/backup/configuration/storage/rsync.rb +0 -29
- data/lib/backup/configuration/storage/s3.rb +0 -25
- data/lib/backup/configuration/storage/scp.rb +0 -25
- data/lib/backup/configuration/storage/sftp.rb +0 -25
- data/lib/backup/configuration/syncer/base.rb +0 -10
- data/lib/backup/configuration/syncer/cloud.rb +0 -23
- data/lib/backup/configuration/syncer/cloud_files.rb +0 -30
- data/lib/backup/configuration/syncer/rsync/base.rb +0 -28
- data/lib/backup/configuration/syncer/rsync/local.rb +0 -11
- data/lib/backup/configuration/syncer/rsync/pull.rb +0 -11
- data/lib/backup/configuration/syncer/rsync/push.rb +0 -31
- data/lib/backup/configuration/syncer/s3.rb +0 -23
- data/lib/backup/notifier/presently.rb +0 -88
- data/lib/backup/syncer/cloud.rb +0 -187
- data/lib/backup/syncer/cloud_files.rb +0 -56
- data/lib/backup/syncer/s3.rb +0 -47
- data/spec/configuration/base_spec.rb +0 -35
- data/spec/configuration/compressor/bzip2_spec.rb +0 -29
- data/spec/configuration/compressor/gzip_spec.rb +0 -29
- data/spec/configuration/compressor/lzma_spec.rb +0 -29
- data/spec/configuration/compressor/pbzip2_spec.rb +0 -32
- data/spec/configuration/database/base_spec.rb +0 -17
- data/spec/configuration/database/mongodb_spec.rb +0 -56
- data/spec/configuration/database/mysql_spec.rb +0 -53
- data/spec/configuration/database/postgresql_spec.rb +0 -53
- data/spec/configuration/database/redis_spec.rb +0 -50
- data/spec/configuration/database/riak_spec.rb +0 -35
- data/spec/configuration/encryptor/gpg_spec.rb +0 -26
- data/spec/configuration/encryptor/open_ssl_spec.rb +0 -35
- data/spec/configuration/notifier/base_spec.rb +0 -32
- data/spec/configuration/notifier/campfire_spec.rb +0 -32
- data/spec/configuration/notifier/hipchat_spec.rb +0 -44
- data/spec/configuration/notifier/mail_spec.rb +0 -71
- data/spec/configuration/notifier/presently_spec.rb +0 -35
- data/spec/configuration/notifier/prowl_spec.rb +0 -29
- data/spec/configuration/notifier/twitter_spec.rb +0 -35
- data/spec/configuration/storage/cloudfiles_spec.rb +0 -41
- data/spec/configuration/storage/dropbox_spec.rb +0 -38
- data/spec/configuration/storage/ftp_spec.rb +0 -44
- data/spec/configuration/storage/local_spec.rb +0 -29
- data/spec/configuration/storage/ninefold_spec.rb +0 -32
- data/spec/configuration/storage/rsync_spec.rb +0 -41
- data/spec/configuration/storage/s3_spec.rb +0 -38
- data/spec/configuration/storage/scp_spec.rb +0 -41
- data/spec/configuration/storage/sftp_spec.rb +0 -41
- data/spec/configuration/syncer/cloud_files_spec.rb +0 -44
- data/spec/configuration/syncer/rsync/base_spec.rb +0 -33
- data/spec/configuration/syncer/rsync/local_spec.rb +0 -10
- data/spec/configuration/syncer/rsync/pull_spec.rb +0 -10
- data/spec/configuration/syncer/rsync/push_spec.rb +0 -43
- data/spec/configuration/syncer/s3_spec.rb +0 -38
- data/spec/notifier/presently_spec.rb +0 -181
- data/spec/syncer/cloud_files_spec.rb +0 -192
- data/spec/syncer/s3_spec.rb +0 -192
- data/templates/cli/utility/notifier/presently +0 -13
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Configuration
|
|
5
|
-
module Syncer
|
|
6
|
-
module RSync
|
|
7
|
-
class Push < Base
|
|
8
|
-
class << self
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
# Server credentials
|
|
12
|
-
attr_accessor :username, :password
|
|
13
|
-
|
|
14
|
-
##
|
|
15
|
-
# Server IP Address and SSH port
|
|
16
|
-
attr_accessor :ip
|
|
17
|
-
|
|
18
|
-
##
|
|
19
|
-
# The SSH port to connect to
|
|
20
|
-
attr_accessor :port
|
|
21
|
-
|
|
22
|
-
##
|
|
23
|
-
# Flag for compressing (only compresses for the transfer)
|
|
24
|
-
attr_accessor :compress
|
|
25
|
-
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Configuration
|
|
5
|
-
module Syncer
|
|
6
|
-
class S3 < Cloud
|
|
7
|
-
class << self
|
|
8
|
-
##
|
|
9
|
-
# Amazon Simple Storage Service (S3) Credentials
|
|
10
|
-
attr_accessor :access_key_id, :secret_access_key
|
|
11
|
-
|
|
12
|
-
##
|
|
13
|
-
# The S3 bucket to store files to
|
|
14
|
-
attr_accessor :bucket
|
|
15
|
-
|
|
16
|
-
##
|
|
17
|
-
# The AWS region of the specified S3 bucket
|
|
18
|
-
attr_accessor :region
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
Backup::Dependency.load('httparty')
|
|
4
|
-
|
|
5
|
-
module Backup
|
|
6
|
-
module Notifier
|
|
7
|
-
class Presently < Base
|
|
8
|
-
|
|
9
|
-
##
|
|
10
|
-
# Presently subdomain
|
|
11
|
-
attr_accessor :subdomain
|
|
12
|
-
|
|
13
|
-
##
|
|
14
|
-
# Presently credentials
|
|
15
|
-
attr_accessor :user_name, :password
|
|
16
|
-
|
|
17
|
-
##
|
|
18
|
-
# Group id
|
|
19
|
-
attr_accessor :group_id
|
|
20
|
-
|
|
21
|
-
def initialize(model, &block)
|
|
22
|
-
super(model)
|
|
23
|
-
|
|
24
|
-
instance_eval(&block) if block_given?
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
##
|
|
30
|
-
# Notify the user of the backup operation results.
|
|
31
|
-
# `status` indicates one of the following:
|
|
32
|
-
#
|
|
33
|
-
# `:success`
|
|
34
|
-
# : The backup completed successfully.
|
|
35
|
-
# : Notification will be sent if `on_success` was set to `true`
|
|
36
|
-
#
|
|
37
|
-
# `:warning`
|
|
38
|
-
# : The backup completed successfully, but warnings were logged
|
|
39
|
-
# : Notification will be sent, including a copy of the current
|
|
40
|
-
# : backup log, if `on_warning` was set to `true`
|
|
41
|
-
#
|
|
42
|
-
# `:failure`
|
|
43
|
-
# : The backup operation failed.
|
|
44
|
-
# : Notification will be sent, including the Exception which caused
|
|
45
|
-
# : the failure, the Exception's backtrace, a copy of the current
|
|
46
|
-
# : backup log and other information if `on_failure` was set to `true`
|
|
47
|
-
#
|
|
48
|
-
def notify!(status)
|
|
49
|
-
name = case status
|
|
50
|
-
when :success then 'Success'
|
|
51
|
-
when :warning then 'Warning'
|
|
52
|
-
when :failure then 'Failure'
|
|
53
|
-
end
|
|
54
|
-
message = "[Backup::%s] #{@model.label} (#{@model.trigger})" % name
|
|
55
|
-
send_message(message)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def send_message(message)
|
|
59
|
-
client = Client.new(subdomain, user_name, password, group_id)
|
|
60
|
-
client.update(message)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
class Client
|
|
64
|
-
include HTTParty
|
|
65
|
-
|
|
66
|
-
attr_accessor :subdomain, :user_name, :password, :group_id
|
|
67
|
-
|
|
68
|
-
def initialize(subdomain, user_name, password, group_id)
|
|
69
|
-
@subdomain = subdomain
|
|
70
|
-
@user_name = user_name
|
|
71
|
-
@password = password
|
|
72
|
-
@group_id = group_id
|
|
73
|
-
|
|
74
|
-
self.class.base_uri "https://#{subdomain}.presently.com"
|
|
75
|
-
self.class.basic_auth user_name, password
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def update(message)
|
|
79
|
-
message = "d @#{group_id} #{message}" if group_id
|
|
80
|
-
self.class.post "/api/twitter/statuses/update.json", :body => {
|
|
81
|
-
:status => message,
|
|
82
|
-
:source => "Backup Notifier"
|
|
83
|
-
}
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
data/lib/backup/syncer/cloud.rb
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
# Only load the Fog gem, along with the Parallel gem, when the Backup::Syncer::Cloud class is loaded
|
|
5
|
-
Backup::Dependency.load('fog')
|
|
6
|
-
Backup::Dependency.load('parallel')
|
|
7
|
-
|
|
8
|
-
module Backup
|
|
9
|
-
module Syncer
|
|
10
|
-
class Cloud < Base
|
|
11
|
-
|
|
12
|
-
##
|
|
13
|
-
# Create a Mutex to synchronize certain parts of the code
|
|
14
|
-
# in order to prevent race conditions or broken STDOUT.
|
|
15
|
-
MUTEX = Mutex.new
|
|
16
|
-
|
|
17
|
-
##
|
|
18
|
-
# Concurrency setting - defaults to false, but can be set to:
|
|
19
|
-
# - :threads
|
|
20
|
-
# - :processes
|
|
21
|
-
attr_accessor :concurrency_type
|
|
22
|
-
|
|
23
|
-
##
|
|
24
|
-
# Concurrency level - the number of threads or processors to use. Defaults to 2.
|
|
25
|
-
attr_accessor :concurrency_level
|
|
26
|
-
|
|
27
|
-
##
|
|
28
|
-
# Instantiates a new Cloud Syncer object and sets the default
|
|
29
|
-
# configuration specified in the Backup::Configuration::Syncer::S3. Then
|
|
30
|
-
# it sets the object defaults if particular properties weren't set.
|
|
31
|
-
# Finally it'll evaluate the users configuration file and overwrite
|
|
32
|
-
# anything that's been defined.
|
|
33
|
-
def initialize(&block)
|
|
34
|
-
load_defaults!
|
|
35
|
-
|
|
36
|
-
@path ||= 'backups'
|
|
37
|
-
@directories ||= Array.new
|
|
38
|
-
@mirror ||= false
|
|
39
|
-
@concurrency_type = false
|
|
40
|
-
@concurrency_level = 2
|
|
41
|
-
|
|
42
|
-
instance_eval(&block) if block_given?
|
|
43
|
-
|
|
44
|
-
@path = path.sub(/^\//, '')
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
##
|
|
48
|
-
# Performs the Sync operation
|
|
49
|
-
def perform!
|
|
50
|
-
Logger.message("#{ self.class } started the syncing process:")
|
|
51
|
-
|
|
52
|
-
directories.each do |directory|
|
|
53
|
-
SyncContext.new(directory, repository_object, path).
|
|
54
|
-
sync! mirror, concurrency_type, concurrency_level
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
private
|
|
59
|
-
|
|
60
|
-
class SyncContext
|
|
61
|
-
attr_reader :directory, :bucket, :path
|
|
62
|
-
|
|
63
|
-
##
|
|
64
|
-
# Creates a new SyncContext object which handles a single directory
|
|
65
|
-
# from the Syncer::Base @directories array.
|
|
66
|
-
def initialize(directory, bucket, path)
|
|
67
|
-
@directory, @bucket, @path = directory, bucket, path
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
##
|
|
71
|
-
# Performs the sync operation using the provided techniques (mirroring/concurrency).
|
|
72
|
-
def sync!(mirror = false, concurrency_type = false, concurrency_level = 2)
|
|
73
|
-
block = Proc.new { |relative_path| sync_file relative_path, mirror }
|
|
74
|
-
|
|
75
|
-
case concurrency_type
|
|
76
|
-
when FalseClass
|
|
77
|
-
all_file_names.each &block
|
|
78
|
-
when :threads
|
|
79
|
-
Parallel.each all_file_names, :in_threads => concurrency_level, &block
|
|
80
|
-
when :processes
|
|
81
|
-
Parallel.each all_file_names, :in_processes => concurrency_level, &block
|
|
82
|
-
else
|
|
83
|
-
raise "Unknown concurrency_type setting: #{concurrency_type.inspect}"
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
private
|
|
88
|
-
|
|
89
|
-
##
|
|
90
|
-
# Gathers all the remote and local file name and merges them together, removing
|
|
91
|
-
# duplicate keys if any, and sorts the in alphabetical order.
|
|
92
|
-
def all_file_names
|
|
93
|
-
@all_file_names ||= (local_files.keys | remote_files.keys).sort
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
##
|
|
97
|
-
# Returns a Hash of local files (the keys are the filesystem paths,
|
|
98
|
-
# the values are the LocalFile objects for that given file)
|
|
99
|
-
def local_files
|
|
100
|
-
@local_files ||= begin
|
|
101
|
-
local_hashes.split("\n").collect { |line|
|
|
102
|
-
LocalFile.new directory, line
|
|
103
|
-
}.inject({}) { |hash, file|
|
|
104
|
-
hash[file.relative_path] = file
|
|
105
|
-
hash
|
|
106
|
-
}
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
##
|
|
111
|
-
# Returns a String of file paths and their md5 hashes.
|
|
112
|
-
def local_hashes
|
|
113
|
-
MUTEX.synchronize { Logger.message("\s\sGenerating checksums for #{ directory }") }
|
|
114
|
-
`find #{directory} -print0 | xargs -0 openssl md5 2> /dev/null`
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
##
|
|
118
|
-
# Returns a Hash of remote files (the keys are the remote paths,
|
|
119
|
-
# the values are the Fog file objects for that given file)
|
|
120
|
-
def remote_files
|
|
121
|
-
@remote_files ||= bucket.files.to_a.select { |file|
|
|
122
|
-
file.key[%r{^#{remote_base}/}]
|
|
123
|
-
}.inject({}) { |hash, file|
|
|
124
|
-
key = file.key.gsub(/^#{remote_base}\//,
|
|
125
|
-
"#{directory.split('/').last}/")
|
|
126
|
-
hash[key] = file
|
|
127
|
-
hash
|
|
128
|
-
}
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
##
|
|
132
|
-
# Creates and returns a String that represents the base remote storage path
|
|
133
|
-
def remote_base
|
|
134
|
-
@remote_base ||= [path, directory.split('/').last].select { |part|
|
|
135
|
-
part && part.strip.length > 0
|
|
136
|
-
}.join('/')
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
##
|
|
140
|
-
# Performs a sync operation on a file. When mirroring is enabled
|
|
141
|
-
# and a local file has been removed since the last sync, it will also
|
|
142
|
-
# remove it from the remote location. It will no upload files that
|
|
143
|
-
# have not changed since the last sync. Checks are done using an md5 hash.
|
|
144
|
-
# If a file has changed, or has been newly added, the file will be transferred/overwritten.
|
|
145
|
-
def sync_file(relative_path, mirror)
|
|
146
|
-
local_file = local_files[relative_path]
|
|
147
|
-
remote_file = remote_files[relative_path]
|
|
148
|
-
|
|
149
|
-
if local_file && File.exist?(local_file.path)
|
|
150
|
-
unless remote_file && remote_file.etag == local_file.md5
|
|
151
|
-
MUTEX.synchronize { Logger.message("\s\s[transferring] #{relative_path}") }
|
|
152
|
-
bucket.files.create(
|
|
153
|
-
:key => "#{path}/#{relative_path}".gsub(/^\//, ''),
|
|
154
|
-
:body => File.open(local_file.path)
|
|
155
|
-
)
|
|
156
|
-
else
|
|
157
|
-
MUTEX.synchronize { Logger.message("\s\s[skipping] #{relative_path}") }
|
|
158
|
-
end
|
|
159
|
-
elsif remote_file && mirror
|
|
160
|
-
MUTEX.synchronize { Logger.message("\s\s[removing] #{relative_path}") }
|
|
161
|
-
remote_file.destroy
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
class LocalFile
|
|
167
|
-
attr_reader :directory, :path, :md5
|
|
168
|
-
|
|
169
|
-
##
|
|
170
|
-
# Creates a new LocalFile object using the given directory and line
|
|
171
|
-
# from the md5 hash checkup. This object figures out the path, relative_path and md5 hash
|
|
172
|
-
# for the file.
|
|
173
|
-
def initialize(directory, line)
|
|
174
|
-
@directory = directory
|
|
175
|
-
@path, @md5 = *line.chomp.match(/^MD5\(([^\)]+)\)= (\w+)$/).captures
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
##
|
|
179
|
-
# Returns the relative path to the file.
|
|
180
|
-
def relative_path
|
|
181
|
-
@relative_path ||= path.gsub %r{^#{directory}},
|
|
182
|
-
directory.split('/').last
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
end
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Syncer
|
|
5
|
-
class CloudFiles < Cloud
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
# Rackspace CloudFiles Credentials
|
|
9
|
-
attr_accessor :api_key, :username
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
# Rackspace CloudFiles Container
|
|
13
|
-
attr_accessor :container
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
# Rackspace AuthURL allows you to connect to a different Rackspace datacenter
|
|
17
|
-
# - https://auth.api.rackspacecloud.com (Default: US)
|
|
18
|
-
# - https://lon.auth.api.rackspacecloud.com (UK)
|
|
19
|
-
attr_accessor :auth_url
|
|
20
|
-
|
|
21
|
-
##
|
|
22
|
-
# Improve performance and avoid data transfer costs by setting @servicenet to `true`
|
|
23
|
-
# This only works if Backup runs on a Rackspace server
|
|
24
|
-
attr_accessor :servicenet
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
##
|
|
29
|
-
# Established and creates a new Fog storage object for CloudFiles.
|
|
30
|
-
def connection
|
|
31
|
-
@connection ||= Fog::Storage.new(
|
|
32
|
-
:provider => provider,
|
|
33
|
-
:rackspace_username => username,
|
|
34
|
-
:rackspace_api_key => api_key,
|
|
35
|
-
:rackspace_auth_url => auth_url,
|
|
36
|
-
:rackspace_servicenet => servicenet
|
|
37
|
-
)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
##
|
|
41
|
-
# Creates a new @repository_object (container). Fetches it from Cloud Files
|
|
42
|
-
# if it already exists, otherwise it will create it first and fetch use that instead.
|
|
43
|
-
def repository_object
|
|
44
|
-
@repository_object ||= connection.directories.get(container) ||
|
|
45
|
-
connection.directories.create(:key => container)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
##
|
|
49
|
-
# This is the provider that Fog uses for the Cloud Files
|
|
50
|
-
def provider
|
|
51
|
-
"Rackspace"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
data/lib/backup/syncer/s3.rb
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Syncer
|
|
5
|
-
class S3 < Cloud
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
# Amazon Simple Storage Service (S3) Credentials
|
|
9
|
-
attr_accessor :access_key_id, :secret_access_key
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
# The S3 bucket to store files to
|
|
13
|
-
attr_accessor :bucket
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
# The AWS region of the specified S3 bucket
|
|
17
|
-
attr_accessor :region
|
|
18
|
-
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
##
|
|
22
|
-
# Established and creates a new Fog storage object for S3.
|
|
23
|
-
def connection
|
|
24
|
-
@connection ||= Fog::Storage.new(
|
|
25
|
-
:provider => provider,
|
|
26
|
-
:aws_access_key_id => access_key_id,
|
|
27
|
-
:aws_secret_access_key => secret_access_key,
|
|
28
|
-
:region => region
|
|
29
|
-
)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
##
|
|
33
|
-
# Creates a new @repository_object (bucket). Fetches it from S3
|
|
34
|
-
# if it already exists, otherwise it will create it first and fetch use that instead.
|
|
35
|
-
def repository_object
|
|
36
|
-
@repository_object ||= connection.directories.get(bucket) ||
|
|
37
|
-
connection.directories.create(:key => bucket, :location => region)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
##
|
|
41
|
-
# This is the provider that Fog uses for the Cloud Files
|
|
42
|
-
def provider
|
|
43
|
-
"AWS"
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|