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,29 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Storage
|
|
6
|
+
class RSync < Base
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Server credentials
|
|
11
|
+
attr_accessor :username, :password
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Server IP Address and SSH port
|
|
15
|
+
attr_accessor :ip, :port
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Path to store backups to
|
|
19
|
+
attr_accessor :path
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
# Flag to use local backups
|
|
23
|
+
attr_accessor :local
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Storage
|
|
6
|
+
class S3 < Base
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Amazon Simple Storage Service (S3) Credentials
|
|
11
|
+
attr_accessor :access_key_id, :secret_access_key
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Amazon S3 bucket name and path
|
|
15
|
+
attr_accessor :bucket, :path
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Region of the specified S3 bucket
|
|
19
|
+
attr_accessor :region
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Storage
|
|
6
|
+
class SCP < Base
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Server credentials
|
|
11
|
+
attr_accessor :username, :password
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Server IP Address and SCP port
|
|
15
|
+
attr_accessor :ip, :port
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Path to store backups to
|
|
19
|
+
attr_accessor :path
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Storage
|
|
6
|
+
class SFTP < Base
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Server credentials
|
|
11
|
+
attr_accessor :username, :password
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Server IP Address and SFTP port
|
|
15
|
+
attr_accessor :ip, :port
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Path to store backups to
|
|
19
|
+
attr_accessor :path
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Syncer
|
|
6
|
+
class Cloud < Base
|
|
7
|
+
class << self
|
|
8
|
+
##
|
|
9
|
+
# Amazon S3 bucket name and path to sync to
|
|
10
|
+
attr_accessor :bucket, :path
|
|
11
|
+
|
|
12
|
+
##
|
|
13
|
+
# Directories to sync
|
|
14
|
+
attr_accessor :directories
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# Flag to enable mirroring
|
|
18
|
+
attr_accessor :mirror
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Syncer
|
|
6
|
+
class CloudFiles < Cloud
|
|
7
|
+
class << self
|
|
8
|
+
##
|
|
9
|
+
# Rackspace CloudFiles Credentials
|
|
10
|
+
attr_accessor :api_key, :username
|
|
11
|
+
|
|
12
|
+
##
|
|
13
|
+
# Rackspace CloudFiles Container
|
|
14
|
+
attr_accessor :container
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
# Rackspace AuthURL allows you to connect to a different Rackspace datacenter
|
|
18
|
+
# - https://auth.api.rackspacecloud.com (Default: US)
|
|
19
|
+
# - https://lon.auth.api.rackspacecloud.com (UK)
|
|
20
|
+
attr_accessor :auth_url
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# Improve performance and avoid data transfer costs by setting @servicenet to `true`
|
|
24
|
+
# This only works if Backup runs on a Rackspace server
|
|
25
|
+
attr_accessor :servicenet
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Configuration
|
|
5
|
+
module Syncer
|
|
6
|
+
module RSync
|
|
7
|
+
class Base < Syncer::Base
|
|
8
|
+
class << self
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# Path to store the synced files/directories to
|
|
12
|
+
attr_accessor :path
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
# Flag for mirroring the files/directories
|
|
16
|
+
attr_accessor :mirror
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Additional options for the rsync cli
|
|
20
|
+
attr_accessor :additional_options
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Database
|
|
5
|
+
class Base
|
|
6
|
+
include Backup::CLI::Helpers
|
|
7
|
+
include Backup::Configuration::Helpers
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Allows the user to specify the path to a "dump" utility
|
|
11
|
+
# in case it cannot be auto-detected by Backup
|
|
12
|
+
# [DEPRECATED] - use each subclass' <utility_name>_utility method
|
|
13
|
+
attr_accessor :utility_path
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Creates a new instance of the MongoDB database object
|
|
17
|
+
# * Called using super(model) from subclasses *
|
|
18
|
+
def initialize(model)
|
|
19
|
+
@model = model
|
|
20
|
+
load_defaults!
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Super method for all child (database) objects. Every database object's #perform!
|
|
25
|
+
# method should call #super before anything else to prepare
|
|
26
|
+
def perform!
|
|
27
|
+
prepare!
|
|
28
|
+
log!
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Defines the @dump_path and ensures it exists by creating it
|
|
35
|
+
def prepare!
|
|
36
|
+
@dump_path = File.join(
|
|
37
|
+
Config.tmp_path,
|
|
38
|
+
@model.trigger,
|
|
39
|
+
'databases',
|
|
40
|
+
self.class.name.split('::').last
|
|
41
|
+
)
|
|
42
|
+
FileUtils.mkdir_p(@dump_path)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
##
|
|
46
|
+
# Return the database name, with Backup namespace removed
|
|
47
|
+
def database_name
|
|
48
|
+
self.class.to_s.sub('Backup::', '')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
##
|
|
52
|
+
# Logs a message to the console and log file to inform
|
|
53
|
+
# the client that Backup is dumping the database
|
|
54
|
+
def log!
|
|
55
|
+
Logger.message "#{ database_name } started dumping and archiving '#{ name }'."
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Backup
|
|
4
|
+
module Database
|
|
5
|
+
class MongoDB < Base
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# Name of the database that needs to get dumped
|
|
9
|
+
attr_accessor :name
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# Credentials for the specified database
|
|
13
|
+
attr_accessor :username, :password
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Connectivity options
|
|
17
|
+
attr_accessor :host, :port
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# IPv6 support (disabled by default)
|
|
21
|
+
attr_accessor :ipv6
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Collections to dump, collections that aren't specified won't get dumped
|
|
25
|
+
attr_accessor :only_collections
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# Additional "mongodump" options
|
|
29
|
+
attr_accessor :additional_options
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
# Path to the mongodump utility (optional)
|
|
33
|
+
attr_accessor :mongodump_utility
|
|
34
|
+
|
|
35
|
+
##
|
|
36
|
+
# Path to the mongo utility (optional)
|
|
37
|
+
attr_accessor :mongo_utility
|
|
38
|
+
|
|
39
|
+
##
|
|
40
|
+
# 'lock' dump meaning wrapping mongodump with fsync & lock
|
|
41
|
+
attr_accessor :lock
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
# Creates a new instance of the MongoDB database object
|
|
45
|
+
def initialize(model, &block)
|
|
46
|
+
super(model)
|
|
47
|
+
|
|
48
|
+
@only_collections ||= Array.new
|
|
49
|
+
@additional_options ||= Array.new
|
|
50
|
+
@ipv6 ||= false
|
|
51
|
+
@lock ||= false
|
|
52
|
+
|
|
53
|
+
instance_eval(&block) if block_given?
|
|
54
|
+
|
|
55
|
+
if @utility_path
|
|
56
|
+
Logger.warn "[DEPRECATED] " +
|
|
57
|
+
"Database::MongoDB#utility_path has been deprecated.\n" +
|
|
58
|
+
" Use Database::MongoDB#mongodump_utility instead."
|
|
59
|
+
@mongodump_utility ||= @utility_path
|
|
60
|
+
end
|
|
61
|
+
@mongodump_utility ||= utility(:mongodump)
|
|
62
|
+
@mongo_utility ||= utility(:mongo)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
##
|
|
66
|
+
# Performs the mongodump command and outputs the data to the
|
|
67
|
+
# specified path based on the 'trigger'. If the user hasn't specified any
|
|
68
|
+
# specific collections to dump, it'll dump everything. If the user has specified
|
|
69
|
+
# collections to dump, it'll loop through the array of collections and invoke the
|
|
70
|
+
# 'mongodump' command once per collection
|
|
71
|
+
def perform!
|
|
72
|
+
super
|
|
73
|
+
|
|
74
|
+
lock_database if @lock
|
|
75
|
+
@only_collections.empty? ? dump! : specific_collection_dump!
|
|
76
|
+
|
|
77
|
+
rescue => err
|
|
78
|
+
raise Errors::Database::MongoDBError.wrap(err, 'Database Dump Failed!')
|
|
79
|
+
ensure
|
|
80
|
+
unlock_database if @lock
|
|
81
|
+
package! unless err
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
##
|
|
87
|
+
# Builds and runs the mongodump command
|
|
88
|
+
def dump!
|
|
89
|
+
run(mongodump)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# For each collection in the @only_collections array, it'll
|
|
94
|
+
# build the whole 'mongodump' command, append the '--collection' option,
|
|
95
|
+
# and run the command built command
|
|
96
|
+
def specific_collection_dump!
|
|
97
|
+
@only_collections.each do |collection|
|
|
98
|
+
run("#{mongodump} --collection='#{collection}'")
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
##
|
|
103
|
+
# Builds the full mongodump string based on all attributes
|
|
104
|
+
def mongodump
|
|
105
|
+
"#{ mongodump_utility } #{ database } #{ credential_options } " +
|
|
106
|
+
"#{ connectivity_options } #{ ipv6_option } #{ user_options } #{ dump_directory }"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
##
|
|
110
|
+
# If a compressor is configured, packages the dump_path into a
|
|
111
|
+
# single compressed tar archive, then removes the dump_path.
|
|
112
|
+
# e.g.
|
|
113
|
+
# if the database was dumped to:
|
|
114
|
+
# ~/Backup/.tmp/databases/MongoDB/
|
|
115
|
+
# then it will be packaged into:
|
|
116
|
+
# ~/Backup/.tmp/databases/MongoDB-<timestamp>.tar.gz
|
|
117
|
+
def package!
|
|
118
|
+
return unless @model.compressor
|
|
119
|
+
|
|
120
|
+
pipeline = Pipeline.new
|
|
121
|
+
base_dir = File.dirname(@dump_path)
|
|
122
|
+
dump_dir = File.basename(@dump_path)
|
|
123
|
+
timestamp = Time.now.to_i.to_s[-5, 5]
|
|
124
|
+
outfile = @dump_path + '-' + timestamp + '.tar'
|
|
125
|
+
|
|
126
|
+
Logger.message(
|
|
127
|
+
"#{ database_name } started compressing and packaging:\n" +
|
|
128
|
+
" '#{ @dump_path }'"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
pipeline << "#{ utility(:tar) } -cf - -C '#{ base_dir }' '#{ dump_dir }'"
|
|
132
|
+
@model.compressor.compress_with do |command, ext|
|
|
133
|
+
pipeline << command
|
|
134
|
+
outfile << ext
|
|
135
|
+
end
|
|
136
|
+
pipeline << "cat > #{ outfile }"
|
|
137
|
+
|
|
138
|
+
pipeline.run
|
|
139
|
+
if pipeline.success?
|
|
140
|
+
Logger.message(
|
|
141
|
+
"#{ database_name } completed compressing and packaging:\n" +
|
|
142
|
+
" '#{ outfile }'"
|
|
143
|
+
)
|
|
144
|
+
FileUtils.rm_rf(@dump_path)
|
|
145
|
+
else
|
|
146
|
+
raise Errors::Database::PipelineError,
|
|
147
|
+
"#{ database_name } Failed to create compressed dump package:\n" +
|
|
148
|
+
"'#{ outfile }'\n" +
|
|
149
|
+
pipeline.error_messages
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
##
|
|
154
|
+
# Returns the MongoDB database selector syntax
|
|
155
|
+
def database
|
|
156
|
+
"--db='#{ name }'" if name
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# Builds the MongoDB credentials syntax to authenticate the user
|
|
161
|
+
# to perform the database dumping process
|
|
162
|
+
def credential_options
|
|
163
|
+
%w[username password].map do |option|
|
|
164
|
+
next if send(option).to_s.empty?
|
|
165
|
+
"--#{option}='#{send(option)}'"
|
|
166
|
+
end.compact.join(' ')
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
##
|
|
170
|
+
# Builds the MongoDB connectivity options syntax to connect the user
|
|
171
|
+
# to perform the database dumping process
|
|
172
|
+
def connectivity_options
|
|
173
|
+
%w[host port].map do |option|
|
|
174
|
+
next if send(option).to_s.empty?
|
|
175
|
+
"--#{option}='#{send(option)}'"
|
|
176
|
+
end.compact.join(' ')
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
##
|
|
180
|
+
# Returns the mongodump syntax for enabling ipv6
|
|
181
|
+
def ipv6_option
|
|
182
|
+
@ipv6 ? '--ipv6' : ''
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
##
|
|
186
|
+
# Builds a MongoDB compatible string for the
|
|
187
|
+
# additional options specified by the user
|
|
188
|
+
def user_options
|
|
189
|
+
@additional_options.join(' ')
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
##
|
|
193
|
+
# Returns the MongoDB syntax for determining where to output all the database dumps,
|
|
194
|
+
# e.g. ~/Backup/.tmp/databases/MongoDB/<databases here>/<database collections>
|
|
195
|
+
def dump_directory
|
|
196
|
+
"--out='#{ @dump_path }'"
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
##
|
|
200
|
+
# Locks and FSyncs the database to bring it up to sync
|
|
201
|
+
# and ensure no 'write operations' are performed during the
|
|
202
|
+
# dump process
|
|
203
|
+
def lock_database
|
|
204
|
+
lock_command = <<-EOS.gsub(/^ +/, ' ')
|
|
205
|
+
echo 'use admin
|
|
206
|
+
db.runCommand({"fsync" : 1, "lock" : 1})' | #{ "#{ mongo_utility } #{ mongo_uri }" }
|
|
207
|
+
EOS
|
|
208
|
+
|
|
209
|
+
run(lock_command)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
##
|
|
213
|
+
# Unlocks the (locked) database
|
|
214
|
+
def unlock_database
|
|
215
|
+
unlock_command = <<-EOS.gsub(/^ +/, ' ')
|
|
216
|
+
echo 'use admin
|
|
217
|
+
db.$cmd.sys.unlock.findOne()' | #{ "#{ mongo_utility } #{ mongo_uri }" }
|
|
218
|
+
EOS
|
|
219
|
+
|
|
220
|
+
run(unlock_command)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
##
|
|
224
|
+
# Builds a Mongo URI based on the provided attributes
|
|
225
|
+
def mongo_uri
|
|
226
|
+
["#{ host }:#{ port }#{ ('/' + name) if name }",
|
|
227
|
+
credential_options, ipv6_option].join(' ').strip
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|