backup_checksum 3.0.23
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/.gitignore +7 -0
- data/.travis.yml +10 -0
- data/Gemfile +28 -0
- data/Gemfile.lock +130 -0
- data/Guardfile +21 -0
- data/LICENSE.md +24 -0
- data/README.md +476 -0
- data/backup_checksum.gemspec +32 -0
- data/bin/backup +11 -0
- data/lib/backup.rb +217 -0
- data/lib/backup/archive.rb +117 -0
- data/lib/backup/binder.rb +22 -0
- data/lib/backup/checksum/base.rb +44 -0
- data/lib/backup/checksum/shasum.rb +16 -0
- data/lib/backup/cleaner.rb +121 -0
- data/lib/backup/cli/helpers.rb +88 -0
- data/lib/backup/cli/utility.rb +247 -0
- data/lib/backup/compressor/base.rb +29 -0
- data/lib/backup/compressor/bzip2.rb +50 -0
- data/lib/backup/compressor/gzip.rb +47 -0
- data/lib/backup/compressor/lzma.rb +50 -0
- data/lib/backup/compressor/pbzip2.rb +56 -0
- data/lib/backup/config.rb +173 -0
- data/lib/backup/configuration/base.rb +15 -0
- data/lib/backup/configuration/checksum/base.rb +9 -0
- data/lib/backup/configuration/checksum/shasum.rb +9 -0
- data/lib/backup/configuration/compressor/base.rb +9 -0
- data/lib/backup/configuration/compressor/bzip2.rb +23 -0
- data/lib/backup/configuration/compressor/gzip.rb +23 -0
- data/lib/backup/configuration/compressor/lzma.rb +23 -0
- data/lib/backup/configuration/compressor/pbzip2.rb +28 -0
- data/lib/backup/configuration/database/base.rb +19 -0
- data/lib/backup/configuration/database/mongodb.rb +49 -0
- data/lib/backup/configuration/database/mysql.rb +42 -0
- data/lib/backup/configuration/database/postgresql.rb +41 -0
- data/lib/backup/configuration/database/redis.rb +39 -0
- data/lib/backup/configuration/database/riak.rb +29 -0
- data/lib/backup/configuration/encryptor/base.rb +9 -0
- data/lib/backup/configuration/encryptor/gpg.rb +17 -0
- data/lib/backup/configuration/encryptor/open_ssl.rb +32 -0
- data/lib/backup/configuration/helpers.rb +52 -0
- data/lib/backup/configuration/notifier/base.rb +28 -0
- data/lib/backup/configuration/notifier/campfire.rb +25 -0
- data/lib/backup/configuration/notifier/hipchat.rb +41 -0
- data/lib/backup/configuration/notifier/mail.rb +112 -0
- data/lib/backup/configuration/notifier/presently.rb +25 -0
- data/lib/backup/configuration/notifier/prowl.rb +23 -0
- data/lib/backup/configuration/notifier/twitter.rb +21 -0
- data/lib/backup/configuration/storage/base.rb +18 -0
- data/lib/backup/configuration/storage/cloudfiles.rb +25 -0
- data/lib/backup/configuration/storage/dropbox.rb +58 -0
- data/lib/backup/configuration/storage/ftp.rb +29 -0
- data/lib/backup/configuration/storage/local.rb +17 -0
- data/lib/backup/configuration/storage/ninefold.rb +20 -0
- data/lib/backup/configuration/storage/rsync.rb +29 -0
- data/lib/backup/configuration/storage/s3.rb +25 -0
- data/lib/backup/configuration/storage/scp.rb +25 -0
- data/lib/backup/configuration/storage/sftp.rb +25 -0
- data/lib/backup/configuration/syncer/base.rb +10 -0
- data/lib/backup/configuration/syncer/cloud.rb +23 -0
- data/lib/backup/configuration/syncer/cloud_files.rb +30 -0
- data/lib/backup/configuration/syncer/rsync/base.rb +28 -0
- data/lib/backup/configuration/syncer/rsync/local.rb +11 -0
- data/lib/backup/configuration/syncer/rsync/pull.rb +11 -0
- data/lib/backup/configuration/syncer/rsync/push.rb +31 -0
- data/lib/backup/configuration/syncer/s3.rb +23 -0
- data/lib/backup/database/base.rb +59 -0
- data/lib/backup/database/mongodb.rb +232 -0
- data/lib/backup/database/mysql.rb +163 -0
- data/lib/backup/database/postgresql.rb +146 -0
- data/lib/backup/database/redis.rb +139 -0
- data/lib/backup/database/riak.rb +69 -0
- data/lib/backup/dependency.rb +114 -0
- data/lib/backup/encryptor/base.rb +29 -0
- data/lib/backup/encryptor/gpg.rb +80 -0
- data/lib/backup/encryptor/open_ssl.rb +72 -0
- data/lib/backup/errors.rb +124 -0
- data/lib/backup/logger.rb +152 -0
- data/lib/backup/model.rb +386 -0
- data/lib/backup/notifier/base.rb +81 -0
- data/lib/backup/notifier/campfire.rb +168 -0
- data/lib/backup/notifier/hipchat.rb +99 -0
- data/lib/backup/notifier/mail.rb +206 -0
- data/lib/backup/notifier/presently.rb +88 -0
- data/lib/backup/notifier/prowl.rb +65 -0
- data/lib/backup/notifier/twitter.rb +70 -0
- data/lib/backup/package.rb +51 -0
- data/lib/backup/packager.rb +108 -0
- data/lib/backup/pipeline.rb +107 -0
- data/lib/backup/splitter.rb +75 -0
- data/lib/backup/storage/base.rb +119 -0
- data/lib/backup/storage/cloudfiles.rb +87 -0
- data/lib/backup/storage/cycler.rb +117 -0
- data/lib/backup/storage/dropbox.rb +181 -0
- data/lib/backup/storage/ftp.rb +119 -0
- data/lib/backup/storage/local.rb +82 -0
- data/lib/backup/storage/ninefold.rb +116 -0
- data/lib/backup/storage/rsync.rb +149 -0
- data/lib/backup/storage/s3.rb +94 -0
- data/lib/backup/storage/scp.rb +99 -0
- data/lib/backup/storage/sftp.rb +108 -0
- data/lib/backup/syncer/base.rb +42 -0
- data/lib/backup/syncer/cloud.rb +190 -0
- data/lib/backup/syncer/cloud_files.rb +56 -0
- data/lib/backup/syncer/rsync/base.rb +52 -0
- data/lib/backup/syncer/rsync/local.rb +53 -0
- data/lib/backup/syncer/rsync/pull.rb +38 -0
- data/lib/backup/syncer/rsync/push.rb +113 -0
- data/lib/backup/syncer/s3.rb +47 -0
- data/lib/backup/template.rb +46 -0
- data/lib/backup/version.rb +43 -0
- data/spec/archive_spec.rb +335 -0
- data/spec/cleaner_spec.rb +304 -0
- data/spec/cli/helpers_spec.rb +176 -0
- data/spec/cli/utility_spec.rb +363 -0
- data/spec/compressor/base_spec.rb +31 -0
- data/spec/compressor/bzip2_spec.rb +83 -0
- data/spec/compressor/gzip_spec.rb +83 -0
- data/spec/compressor/lzma_spec.rb +83 -0
- data/spec/compressor/pbzip2_spec.rb +124 -0
- data/spec/config_spec.rb +321 -0
- data/spec/configuration/base_spec.rb +35 -0
- data/spec/configuration/compressor/bzip2_spec.rb +29 -0
- data/spec/configuration/compressor/gzip_spec.rb +29 -0
- data/spec/configuration/compressor/lzma_spec.rb +29 -0
- data/spec/configuration/compressor/pbzip2_spec.rb +32 -0
- data/spec/configuration/database/base_spec.rb +17 -0
- data/spec/configuration/database/mongodb_spec.rb +56 -0
- data/spec/configuration/database/mysql_spec.rb +53 -0
- data/spec/configuration/database/postgresql_spec.rb +53 -0
- data/spec/configuration/database/redis_spec.rb +50 -0
- data/spec/configuration/database/riak_spec.rb +35 -0
- data/spec/configuration/encryptor/gpg_spec.rb +26 -0
- data/spec/configuration/encryptor/open_ssl_spec.rb +35 -0
- data/spec/configuration/notifier/base_spec.rb +32 -0
- data/spec/configuration/notifier/campfire_spec.rb +32 -0
- data/spec/configuration/notifier/hipchat_spec.rb +44 -0
- data/spec/configuration/notifier/mail_spec.rb +71 -0
- data/spec/configuration/notifier/presently_spec.rb +35 -0
- data/spec/configuration/notifier/prowl_spec.rb +29 -0
- data/spec/configuration/notifier/twitter_spec.rb +35 -0
- data/spec/configuration/storage/cloudfiles_spec.rb +41 -0
- data/spec/configuration/storage/dropbox_spec.rb +38 -0
- data/spec/configuration/storage/ftp_spec.rb +44 -0
- data/spec/configuration/storage/local_spec.rb +29 -0
- data/spec/configuration/storage/ninefold_spec.rb +32 -0
- data/spec/configuration/storage/rsync_spec.rb +41 -0
- data/spec/configuration/storage/s3_spec.rb +38 -0
- data/spec/configuration/storage/scp_spec.rb +41 -0
- data/spec/configuration/storage/sftp_spec.rb +41 -0
- data/spec/configuration/syncer/cloud_files_spec.rb +44 -0
- data/spec/configuration/syncer/rsync/base_spec.rb +33 -0
- data/spec/configuration/syncer/rsync/local_spec.rb +10 -0
- data/spec/configuration/syncer/rsync/pull_spec.rb +10 -0
- data/spec/configuration/syncer/rsync/push_spec.rb +43 -0
- data/spec/configuration/syncer/s3_spec.rb +38 -0
- data/spec/database/base_spec.rb +54 -0
- data/spec/database/mongodb_spec.rb +428 -0
- data/spec/database/mysql_spec.rb +335 -0
- data/spec/database/postgresql_spec.rb +278 -0
- data/spec/database/redis_spec.rb +260 -0
- data/spec/database/riak_spec.rb +108 -0
- data/spec/dependency_spec.rb +49 -0
- data/spec/encryptor/base_spec.rb +30 -0
- data/spec/encryptor/gpg_spec.rb +134 -0
- data/spec/encryptor/open_ssl_spec.rb +129 -0
- data/spec/errors_spec.rb +306 -0
- data/spec/logger_spec.rb +363 -0
- data/spec/model_spec.rb +649 -0
- data/spec/notifier/base_spec.rb +89 -0
- data/spec/notifier/campfire_spec.rb +199 -0
- data/spec/notifier/hipchat_spec.rb +188 -0
- data/spec/notifier/mail_spec.rb +280 -0
- data/spec/notifier/presently_spec.rb +181 -0
- data/spec/notifier/prowl_spec.rb +117 -0
- data/spec/notifier/twitter_spec.rb +132 -0
- data/spec/package_spec.rb +61 -0
- data/spec/packager_spec.rb +225 -0
- data/spec/pipeline_spec.rb +257 -0
- data/spec/spec_helper.rb +59 -0
- data/spec/splitter_spec.rb +120 -0
- data/spec/storage/base_spec.rb +160 -0
- data/spec/storage/cloudfiles_spec.rb +230 -0
- data/spec/storage/cycler_spec.rb +239 -0
- data/spec/storage/dropbox_spec.rb +370 -0
- data/spec/storage/ftp_spec.rb +247 -0
- data/spec/storage/local_spec.rb +235 -0
- data/spec/storage/ninefold_spec.rb +319 -0
- data/spec/storage/rsync_spec.rb +345 -0
- data/spec/storage/s3_spec.rb +221 -0
- data/spec/storage/scp_spec.rb +209 -0
- data/spec/storage/sftp_spec.rb +220 -0
- data/spec/syncer/base_spec.rb +22 -0
- data/spec/syncer/cloud_files_spec.rb +192 -0
- data/spec/syncer/rsync/base_spec.rb +118 -0
- data/spec/syncer/rsync/local_spec.rb +121 -0
- data/spec/syncer/rsync/pull_spec.rb +90 -0
- data/spec/syncer/rsync/push_spec.rb +327 -0
- data/spec/syncer/s3_spec.rb +192 -0
- data/spec/version_spec.rb +21 -0
- data/templates/cli/utility/archive +25 -0
- data/templates/cli/utility/compressor/bzip2 +7 -0
- data/templates/cli/utility/compressor/gzip +7 -0
- data/templates/cli/utility/compressor/lzma +7 -0
- data/templates/cli/utility/compressor/pbzip2 +7 -0
- data/templates/cli/utility/config +31 -0
- data/templates/cli/utility/database/mongodb +18 -0
- data/templates/cli/utility/database/mysql +21 -0
- data/templates/cli/utility/database/postgresql +17 -0
- data/templates/cli/utility/database/redis +16 -0
- data/templates/cli/utility/database/riak +11 -0
- data/templates/cli/utility/encryptor/gpg +12 -0
- data/templates/cli/utility/encryptor/openssl +9 -0
- data/templates/cli/utility/model.erb +23 -0
- data/templates/cli/utility/notifier/campfire +12 -0
- data/templates/cli/utility/notifier/hipchat +15 -0
- data/templates/cli/utility/notifier/mail +22 -0
- data/templates/cli/utility/notifier/presently +13 -0
- data/templates/cli/utility/notifier/prowl +11 -0
- data/templates/cli/utility/notifier/twitter +13 -0
- data/templates/cli/utility/splitter +7 -0
- data/templates/cli/utility/storage/cloud_files +22 -0
- data/templates/cli/utility/storage/dropbox +20 -0
- data/templates/cli/utility/storage/ftp +12 -0
- data/templates/cli/utility/storage/local +7 -0
- data/templates/cli/utility/storage/ninefold +9 -0
- data/templates/cli/utility/storage/rsync +11 -0
- data/templates/cli/utility/storage/s3 +19 -0
- data/templates/cli/utility/storage/scp +11 -0
- data/templates/cli/utility/storage/sftp +11 -0
- data/templates/cli/utility/syncer/cloud_files +48 -0
- data/templates/cli/utility/syncer/rsync_local +12 -0
- data/templates/cli/utility/syncer/rsync_pull +17 -0
- data/templates/cli/utility/syncer/rsync_push +17 -0
- data/templates/cli/utility/syncer/s3 +45 -0
- data/templates/general/links +11 -0
- data/templates/general/version.erb +2 -0
- data/templates/notifier/mail/failure.erb +9 -0
- data/templates/notifier/mail/success.erb +7 -0
- data/templates/notifier/mail/warning.erb +9 -0
- data/templates/storage/dropbox/authorization_url.erb +6 -0
- data/templates/storage/dropbox/authorized.erb +4 -0
- data/templates/storage/dropbox/cache_file_written.erb +10 -0
- metadata +311 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require File.expand_path('../../spec_helper.rb', __FILE__)
|
|
3
|
+
|
|
4
|
+
class Parallel; end
|
|
5
|
+
|
|
6
|
+
describe Backup::Syncer::CloudFiles do
|
|
7
|
+
describe '#perform!' do
|
|
8
|
+
let(:syncer) { Backup::Syncer::CloudFiles.new }
|
|
9
|
+
let(:connection) { stub('connection',
|
|
10
|
+
:directories => stub('directories', :get => container)) }
|
|
11
|
+
let(:container) { stub('container', :files => files) }
|
|
12
|
+
let(:files) { [] }
|
|
13
|
+
let(:content) { stub('content') }
|
|
14
|
+
|
|
15
|
+
before :each do
|
|
16
|
+
Fog::Storage.stubs(:new).returns connection
|
|
17
|
+
File.stubs(:open).yields content
|
|
18
|
+
File.stubs(:exist?).returns true
|
|
19
|
+
files.stubs(:create).returns true
|
|
20
|
+
|
|
21
|
+
syncer.directories << 'tmp'
|
|
22
|
+
syncer.path = 'storage'
|
|
23
|
+
Backup::Syncer::S3::SyncContext.any_instance.
|
|
24
|
+
stubs(:`).returns 'MD5(tmp/foo)= 123abcdef'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "respects the concurrency_type setting with threads" do
|
|
28
|
+
syncer.concurrency_type = :threads
|
|
29
|
+
|
|
30
|
+
Parallel.expects(:each).with(anything, {:in_threads => 2}, anything)
|
|
31
|
+
|
|
32
|
+
syncer.perform!
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "respects the parallel thread count" do
|
|
36
|
+
syncer.concurrency_type = :threads
|
|
37
|
+
syncer.concurrency_level = 10
|
|
38
|
+
|
|
39
|
+
Parallel.expects(:each).with(anything, {:in_threads => 10}, anything)
|
|
40
|
+
|
|
41
|
+
syncer.perform!
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "respects the concurrency_type setting with processors" do
|
|
45
|
+
syncer.concurrency_type = :processes
|
|
46
|
+
|
|
47
|
+
Parallel.expects(:each).with(anything, {:in_processes => 2}, anything)
|
|
48
|
+
|
|
49
|
+
syncer.perform!
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "respects the parallel thread count" do
|
|
53
|
+
syncer.concurrency_type = :processes
|
|
54
|
+
syncer.concurrency_level = 10
|
|
55
|
+
|
|
56
|
+
Parallel.expects(:each).with(anything, {:in_processes => 10}, anything)
|
|
57
|
+
|
|
58
|
+
syncer.perform!
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context 'file exists locally' do
|
|
62
|
+
it "uploads a file if it does not exist remotely" do
|
|
63
|
+
files.expects(:create).with(:key => 'storage/tmp/foo', :body => content)
|
|
64
|
+
|
|
65
|
+
syncer.perform!
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "uploads a file if it exists remotely with a different MD5" do
|
|
69
|
+
files << stub('file', :key => 'storage/tmp/foo', :etag => 'abcdef123')
|
|
70
|
+
|
|
71
|
+
files.expects(:create).with(:key => 'storage/tmp/foo', :body => content)
|
|
72
|
+
|
|
73
|
+
syncer.perform!
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "does nothing if the file exists remotely with the same MD5" do
|
|
77
|
+
files << stub('file', :key => 'storage/tmp/foo', :etag => '123abcdef')
|
|
78
|
+
|
|
79
|
+
files.expects(:create).never
|
|
80
|
+
|
|
81
|
+
syncer.perform!
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "skips the file if it no longer exists locally" do
|
|
85
|
+
File.stubs(:exist?).returns false
|
|
86
|
+
|
|
87
|
+
files.expects(:create).never
|
|
88
|
+
|
|
89
|
+
syncer.perform!
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "respects the given path" do
|
|
93
|
+
syncer.path = 'box'
|
|
94
|
+
|
|
95
|
+
files.expects(:create).with(:key => 'box/tmp/foo', :body => content)
|
|
96
|
+
|
|
97
|
+
syncer.perform!
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "uploads the content of the local file" do
|
|
101
|
+
files.expects(:create).with(:key => 'storage/tmp/foo', :body => content)
|
|
102
|
+
|
|
103
|
+
syncer.perform!
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "creates the connection with the provided credentials" do
|
|
107
|
+
syncer.api_key = 'my-key'
|
|
108
|
+
syncer.username = 'my-name'
|
|
109
|
+
syncer.auth_url = 'my-auth'
|
|
110
|
+
syncer.servicenet = 'my-servicenet'
|
|
111
|
+
|
|
112
|
+
Fog::Storage.expects(:new).with(
|
|
113
|
+
:provider => 'Rackspace',
|
|
114
|
+
:rackspace_api_key => 'my-key',
|
|
115
|
+
:rackspace_username => 'my-name',
|
|
116
|
+
:rackspace_auth_url => 'my-auth',
|
|
117
|
+
:rackspace_servicenet => 'my-servicenet'
|
|
118
|
+
).returns connection
|
|
119
|
+
|
|
120
|
+
syncer.perform!
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "uses the container with the given name" do
|
|
124
|
+
syncer.container = 'leaky'
|
|
125
|
+
|
|
126
|
+
connection.directories.expects(:get).with('leaky').returns(container)
|
|
127
|
+
|
|
128
|
+
syncer.perform!
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "creates the container if one does not exist" do
|
|
132
|
+
syncer.container = 'leaky'
|
|
133
|
+
connection.directories.stubs(:get).returns nil
|
|
134
|
+
|
|
135
|
+
connection.directories.expects(:create).
|
|
136
|
+
with(:key => 'leaky').returns(container)
|
|
137
|
+
|
|
138
|
+
syncer.perform!
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "iterates over each directory" do
|
|
142
|
+
syncer.directories << 'files'
|
|
143
|
+
|
|
144
|
+
Backup::Syncer::CloudFiles::SyncContext.any_instance.expects(:`).
|
|
145
|
+
with('find tmp -print0 | xargs -0 openssl md5 2> /dev/null').
|
|
146
|
+
returns 'MD5(tmp/foo)= 123abcdef'
|
|
147
|
+
Backup::Syncer::CloudFiles::SyncContext.any_instance.expects(:`).
|
|
148
|
+
with('find files -print0 | xargs -0 openssl md5 2> /dev/null').
|
|
149
|
+
returns 'MD5(tmp/foo)= 123abcdef'
|
|
150
|
+
|
|
151
|
+
syncer.perform!
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
context 'file does not exist locally' do
|
|
156
|
+
let(:file) { stub('file', :key => 'storage/tmp/foo',
|
|
157
|
+
:etag => '123abcdef') }
|
|
158
|
+
|
|
159
|
+
before :each do
|
|
160
|
+
Backup::Syncer::CloudFiles::SyncContext.any_instance.
|
|
161
|
+
stubs(:`).returns ''
|
|
162
|
+
files << file
|
|
163
|
+
File.stubs(:exist?).returns false
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "removes the remote file when mirroring is turned on" do
|
|
167
|
+
syncer.mirror = true
|
|
168
|
+
|
|
169
|
+
file.expects(:destroy).once
|
|
170
|
+
|
|
171
|
+
syncer.perform!
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it "leaves the remote file when mirroring is turned off" do
|
|
175
|
+
syncer.mirror = false
|
|
176
|
+
|
|
177
|
+
file.expects(:destroy).never
|
|
178
|
+
|
|
179
|
+
syncer.perform!
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it "does not remove files not under one of the specified directories" do
|
|
183
|
+
file.stubs(:key).returns 'unsynced/tmp/foo'
|
|
184
|
+
syncer.mirror = true
|
|
185
|
+
|
|
186
|
+
file.expects(:destroy).never
|
|
187
|
+
|
|
188
|
+
syncer.perform!
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../../spec_helper.rb', __FILE__)
|
|
4
|
+
|
|
5
|
+
describe Backup::Syncer::RSync::Base do
|
|
6
|
+
let(:syncer) { Backup::Syncer::RSync::Base.new }
|
|
7
|
+
|
|
8
|
+
describe '#initialize' do
|
|
9
|
+
|
|
10
|
+
it 'should use default values' do
|
|
11
|
+
syncer.path.should == 'backups'
|
|
12
|
+
syncer.directories.should == []
|
|
13
|
+
syncer.mirror.should == false
|
|
14
|
+
syncer.additional_options.should == []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'when setting configuration defaults' do
|
|
18
|
+
after { Backup::Configuration::Syncer::RSync::Base.clear_defaults! }
|
|
19
|
+
|
|
20
|
+
it 'should use the configured defaults' do
|
|
21
|
+
Backup::Configuration::Syncer::RSync::Base.defaults do |rsync|
|
|
22
|
+
rsync.path = 'some_path'
|
|
23
|
+
#rsync.directories = 'cannot_have_a_default_value'
|
|
24
|
+
rsync.mirror = 'some_mirror'
|
|
25
|
+
rsync.additional_options = 'some_additional_options'
|
|
26
|
+
end
|
|
27
|
+
syncer = Backup::Syncer::RSync::Base.new
|
|
28
|
+
syncer.path.should == 'some_path'
|
|
29
|
+
syncer.directories.should == []
|
|
30
|
+
syncer.mirror.should == 'some_mirror'
|
|
31
|
+
syncer.additional_options.should == 'some_additional_options'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end # describe '#initialize'
|
|
36
|
+
|
|
37
|
+
describe '#directories' do
|
|
38
|
+
before do
|
|
39
|
+
syncer.directories = ['/some/directory', '/another/directory']
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'when no block is given' do
|
|
43
|
+
it 'should return @directories' do
|
|
44
|
+
syncer.directories.should ==
|
|
45
|
+
['/some/directory', '/another/directory']
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'when a block is given' do
|
|
50
|
+
it 'should evalute the block, allowing #add to add directories' do
|
|
51
|
+
syncer.directories do
|
|
52
|
+
add '/new/path'
|
|
53
|
+
add '/another/new/path'
|
|
54
|
+
end
|
|
55
|
+
syncer.directories.should == [
|
|
56
|
+
'/some/directory',
|
|
57
|
+
'/another/directory',
|
|
58
|
+
'/new/path',
|
|
59
|
+
'/another/new/path'
|
|
60
|
+
]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end # describe '#directories'
|
|
64
|
+
|
|
65
|
+
describe '#add' do
|
|
66
|
+
before do
|
|
67
|
+
syncer.directories = ['/some/directory', '/another/directory']
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'should add the given path to @directories' do
|
|
71
|
+
syncer.add '/my/path'
|
|
72
|
+
syncer.directories.should ==
|
|
73
|
+
['/some/directory', '/another/directory', '/my/path']
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
describe '#directory_options' do
|
|
78
|
+
before do
|
|
79
|
+
syncer.directories = ['/some/directory', '/another/directory']
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'should return the directories for use in the command line' do
|
|
83
|
+
syncer.send(:directories_option).should ==
|
|
84
|
+
"'/some/directory' '/another/directory'"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'should expand relative paths' do
|
|
88
|
+
syncer.directories += ['relative/path', '~/home/path']
|
|
89
|
+
syncer.send(:directories_option).should ==
|
|
90
|
+
"'/some/directory' '/another/directory' " +
|
|
91
|
+
"'#{ File.expand_path('relative/path') }' " +
|
|
92
|
+
"'#{ File.expand_path('~/home/path') }'"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe '#mirror_option' do
|
|
97
|
+
context 'when @mirror is true' do
|
|
98
|
+
before { syncer.mirror = true }
|
|
99
|
+
it 'should return the command line flag for mirroring' do
|
|
100
|
+
syncer.send(:mirror_option).should == '--delete'
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context 'when @mirror is false' do
|
|
105
|
+
before { syncer.mirror = false }
|
|
106
|
+
it 'should return nil' do
|
|
107
|
+
syncer.send(:mirror_option).should be_nil
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
describe '#archive_option' do
|
|
113
|
+
it 'should return the command line flag for archiving' do
|
|
114
|
+
syncer.send(:archive_option).should == '--archive'
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../../spec_helper.rb', __FILE__)
|
|
4
|
+
|
|
5
|
+
describe Backup::Syncer::RSync::Local do
|
|
6
|
+
let(:syncer) do
|
|
7
|
+
Backup::Syncer::RSync::Local.new do |rsync|
|
|
8
|
+
rsync.path = "~/my_backups"
|
|
9
|
+
|
|
10
|
+
rsync.directories do |directory|
|
|
11
|
+
directory.add "/some/directory"
|
|
12
|
+
directory.add "~/home/directory"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
rsync.mirror = true
|
|
16
|
+
rsync.additional_options = ['--opt-a', '--opt-b']
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should be a subclass of RSync::Base' do
|
|
21
|
+
Backup::Syncer::RSync::Local.superclass.should == Backup::Syncer::RSync::Base
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe '#initialize' do
|
|
25
|
+
it 'should have defined the configuration properly' do
|
|
26
|
+
syncer.path.should == '~/my_backups'
|
|
27
|
+
syncer.directories.should == ["/some/directory", "~/home/directory"]
|
|
28
|
+
syncer.mirror.should == true
|
|
29
|
+
syncer.additional_options.should == ['--opt-a', '--opt-b']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'when setting configuration defaults' do
|
|
33
|
+
after { Backup::Configuration::Syncer::RSync::Local.clear_defaults! }
|
|
34
|
+
|
|
35
|
+
it 'should override the configured defaults' do
|
|
36
|
+
Backup::Configuration::Syncer::RSync::Local.defaults do |rsync|
|
|
37
|
+
rsync.path = 'old_path'
|
|
38
|
+
#rsync.directories = 'cannot_have_a_default_value'
|
|
39
|
+
rsync.mirror = 'old_mirror'
|
|
40
|
+
rsync.additional_options = 'old_additional_options'
|
|
41
|
+
end
|
|
42
|
+
syncer = Backup::Syncer::RSync::Local.new do |rsync|
|
|
43
|
+
rsync.path = 'new_path'
|
|
44
|
+
rsync.directories = 'new_directories'
|
|
45
|
+
rsync.mirror = 'new_mirror'
|
|
46
|
+
rsync.additional_options = 'new_additional_options'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
syncer.path.should == 'new_path'
|
|
50
|
+
syncer.directories.should == 'new_directories'
|
|
51
|
+
syncer.mirror.should == 'new_mirror'
|
|
52
|
+
syncer.additional_options.should == 'new_additional_options'
|
|
53
|
+
end
|
|
54
|
+
end # context 'when setting configuration defaults'
|
|
55
|
+
end # describe '#initialize'
|
|
56
|
+
|
|
57
|
+
describe '#perform!' do
|
|
58
|
+
let(:s) { sequence '' }
|
|
59
|
+
|
|
60
|
+
before do
|
|
61
|
+
syncer.expects(:utility).with(:rsync).returns('rsync')
|
|
62
|
+
syncer.expects(:options).returns('options_output')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should sync two directories' do
|
|
66
|
+
Backup::Logger.expects(:message).in_sequence(s).with(
|
|
67
|
+
"Syncer::RSync::Local started syncing the following directories:\n" +
|
|
68
|
+
" /some/directory\n" +
|
|
69
|
+
" ~/home/directory"
|
|
70
|
+
)
|
|
71
|
+
syncer.expects(:run).in_sequence(s).with(
|
|
72
|
+
"rsync options_output '/some/directory' " +
|
|
73
|
+
"'#{ File.expand_path('~/home/directory') }' " +
|
|
74
|
+
"'#{ File.expand_path('~/my_backups') }'"
|
|
75
|
+
).returns('messages from stdout')
|
|
76
|
+
Backup::Logger.expects(:silent).in_sequence(s).with('messages from stdout')
|
|
77
|
+
|
|
78
|
+
syncer.perform!
|
|
79
|
+
end
|
|
80
|
+
end # describe '#perform!'
|
|
81
|
+
|
|
82
|
+
describe '#dest_path' do
|
|
83
|
+
it 'should return @path expanded' do
|
|
84
|
+
syncer.send(:dest_path).should == File.expand_path('~/my_backups')
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'should set @dest_path' do
|
|
88
|
+
syncer.send(:dest_path)
|
|
89
|
+
syncer.instance_variable_get(:@dest_path).should ==
|
|
90
|
+
File.expand_path('~/my_backups')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'should return @dest_path if already set' do
|
|
94
|
+
syncer.instance_variable_set(:@dest_path, 'foo')
|
|
95
|
+
syncer.send(:dest_path).should == 'foo'
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe '#options' do
|
|
100
|
+
context 'when @mirror is true' do
|
|
101
|
+
it 'should return the options with mirroring enabled' do
|
|
102
|
+
syncer.send(:options).should == '--archive --delete --opt-a --opt-b'
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context 'when @mirror is false' do
|
|
107
|
+
before { syncer.mirror = false }
|
|
108
|
+
it 'should return the options without mirroring enabled' do
|
|
109
|
+
syncer.send(:options).should == '--archive --opt-a --opt-b'
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context 'when no additional options are given' do
|
|
114
|
+
before { syncer.additional_options = [] }
|
|
115
|
+
it 'should return the options without additional options' do
|
|
116
|
+
syncer.send(:options).should == '--archive --delete'
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../../spec_helper.rb', __FILE__)
|
|
4
|
+
|
|
5
|
+
describe Backup::Syncer::RSync::Pull do
|
|
6
|
+
let(:syncer) do
|
|
7
|
+
Backup::Syncer::RSync::Pull.new do |rsync|
|
|
8
|
+
rsync.username = 'my_username'
|
|
9
|
+
rsync.password = 'my_password'
|
|
10
|
+
rsync.ip = '123.45.678.90'
|
|
11
|
+
rsync.port = 22
|
|
12
|
+
rsync.compress = true
|
|
13
|
+
rsync.path = "~/my_backups"
|
|
14
|
+
|
|
15
|
+
rsync.directories do |directory|
|
|
16
|
+
directory.add "/some/directory"
|
|
17
|
+
directory.add "~/home/directory"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
rsync.mirror = true
|
|
21
|
+
rsync.additional_options = ['--opt-a', '--opt-b']
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should be a subclass of RSync::Push' do
|
|
26
|
+
Backup::Syncer::RSync::Pull.superclass.should == Backup::Syncer::RSync::Push
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe '#perform!' do
|
|
30
|
+
let(:s) { sequence '' }
|
|
31
|
+
|
|
32
|
+
it 'should perform the RSync::Pull operation on two directories' do
|
|
33
|
+
syncer.expects(:utility).twice.with(:rsync).returns('rsync')
|
|
34
|
+
syncer.expects(:options).twice.returns('options_output')
|
|
35
|
+
|
|
36
|
+
syncer.expects(:write_password_file!).in_sequence(s)
|
|
37
|
+
|
|
38
|
+
# first directory
|
|
39
|
+
Backup::Logger.expects(:message).in_sequence(s).with(
|
|
40
|
+
"Syncer::RSync::Pull started syncing '/some/directory'."
|
|
41
|
+
)
|
|
42
|
+
syncer.expects(:run).in_sequence(s).with(
|
|
43
|
+
"rsync options_output 'my_username@123.45.678.90:/some/directory' " +
|
|
44
|
+
"'#{ File.expand_path('~/my_backups') }'"
|
|
45
|
+
).returns('messages from stdout')
|
|
46
|
+
Backup::Logger.expects(:silent).in_sequence(s).with('messages from stdout')
|
|
47
|
+
|
|
48
|
+
# second directory
|
|
49
|
+
Backup::Logger.expects(:message).in_sequence(s).with(
|
|
50
|
+
"Syncer::RSync::Pull started syncing '~/home/directory'."
|
|
51
|
+
)
|
|
52
|
+
syncer.expects(:run).in_sequence(s).with(
|
|
53
|
+
"rsync options_output 'my_username@123.45.678.90:home/directory' " +
|
|
54
|
+
"'#{ File.expand_path('~/my_backups') }'"
|
|
55
|
+
).returns('messages from stdout')
|
|
56
|
+
Backup::Logger.expects(:silent).in_sequence(s).with('messages from stdout')
|
|
57
|
+
|
|
58
|
+
syncer.expects(:remove_password_file!).in_sequence(s)
|
|
59
|
+
|
|
60
|
+
syncer.perform!
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should ensure passoword file removal' do
|
|
64
|
+
syncer.expects(:write_password_file!).raises('error message')
|
|
65
|
+
syncer.expects(:remove_password_file!)
|
|
66
|
+
|
|
67
|
+
expect do
|
|
68
|
+
syncer.perform!
|
|
69
|
+
end.to raise_error(RuntimeError, 'error message')
|
|
70
|
+
end
|
|
71
|
+
end # describe '#perform!'
|
|
72
|
+
|
|
73
|
+
describe '#dest_path' do
|
|
74
|
+
it 'should return @path expanded' do
|
|
75
|
+
syncer.send(:dest_path).should == File.expand_path('~/my_backups')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it 'should set @dest_path' do
|
|
79
|
+
syncer.send(:dest_path)
|
|
80
|
+
syncer.instance_variable_get(:@dest_path).should ==
|
|
81
|
+
File.expand_path('~/my_backups')
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'should return @dest_path if already set' do
|
|
85
|
+
syncer.instance_variable_set(:@dest_path, 'foo')
|
|
86
|
+
syncer.send(:dest_path).should == 'foo'
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|