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.
Files changed (244) hide show
  1. data/.gitignore +7 -0
  2. data/.travis.yml +10 -0
  3. data/Gemfile +28 -0
  4. data/Gemfile.lock +130 -0
  5. data/Guardfile +21 -0
  6. data/LICENSE.md +24 -0
  7. data/README.md +476 -0
  8. data/backup_checksum.gemspec +32 -0
  9. data/bin/backup +11 -0
  10. data/lib/backup.rb +217 -0
  11. data/lib/backup/archive.rb +117 -0
  12. data/lib/backup/binder.rb +22 -0
  13. data/lib/backup/checksum/base.rb +44 -0
  14. data/lib/backup/checksum/shasum.rb +16 -0
  15. data/lib/backup/cleaner.rb +121 -0
  16. data/lib/backup/cli/helpers.rb +88 -0
  17. data/lib/backup/cli/utility.rb +247 -0
  18. data/lib/backup/compressor/base.rb +29 -0
  19. data/lib/backup/compressor/bzip2.rb +50 -0
  20. data/lib/backup/compressor/gzip.rb +47 -0
  21. data/lib/backup/compressor/lzma.rb +50 -0
  22. data/lib/backup/compressor/pbzip2.rb +56 -0
  23. data/lib/backup/config.rb +173 -0
  24. data/lib/backup/configuration/base.rb +15 -0
  25. data/lib/backup/configuration/checksum/base.rb +9 -0
  26. data/lib/backup/configuration/checksum/shasum.rb +9 -0
  27. data/lib/backup/configuration/compressor/base.rb +9 -0
  28. data/lib/backup/configuration/compressor/bzip2.rb +23 -0
  29. data/lib/backup/configuration/compressor/gzip.rb +23 -0
  30. data/lib/backup/configuration/compressor/lzma.rb +23 -0
  31. data/lib/backup/configuration/compressor/pbzip2.rb +28 -0
  32. data/lib/backup/configuration/database/base.rb +19 -0
  33. data/lib/backup/configuration/database/mongodb.rb +49 -0
  34. data/lib/backup/configuration/database/mysql.rb +42 -0
  35. data/lib/backup/configuration/database/postgresql.rb +41 -0
  36. data/lib/backup/configuration/database/redis.rb +39 -0
  37. data/lib/backup/configuration/database/riak.rb +29 -0
  38. data/lib/backup/configuration/encryptor/base.rb +9 -0
  39. data/lib/backup/configuration/encryptor/gpg.rb +17 -0
  40. data/lib/backup/configuration/encryptor/open_ssl.rb +32 -0
  41. data/lib/backup/configuration/helpers.rb +52 -0
  42. data/lib/backup/configuration/notifier/base.rb +28 -0
  43. data/lib/backup/configuration/notifier/campfire.rb +25 -0
  44. data/lib/backup/configuration/notifier/hipchat.rb +41 -0
  45. data/lib/backup/configuration/notifier/mail.rb +112 -0
  46. data/lib/backup/configuration/notifier/presently.rb +25 -0
  47. data/lib/backup/configuration/notifier/prowl.rb +23 -0
  48. data/lib/backup/configuration/notifier/twitter.rb +21 -0
  49. data/lib/backup/configuration/storage/base.rb +18 -0
  50. data/lib/backup/configuration/storage/cloudfiles.rb +25 -0
  51. data/lib/backup/configuration/storage/dropbox.rb +58 -0
  52. data/lib/backup/configuration/storage/ftp.rb +29 -0
  53. data/lib/backup/configuration/storage/local.rb +17 -0
  54. data/lib/backup/configuration/storage/ninefold.rb +20 -0
  55. data/lib/backup/configuration/storage/rsync.rb +29 -0
  56. data/lib/backup/configuration/storage/s3.rb +25 -0
  57. data/lib/backup/configuration/storage/scp.rb +25 -0
  58. data/lib/backup/configuration/storage/sftp.rb +25 -0
  59. data/lib/backup/configuration/syncer/base.rb +10 -0
  60. data/lib/backup/configuration/syncer/cloud.rb +23 -0
  61. data/lib/backup/configuration/syncer/cloud_files.rb +30 -0
  62. data/lib/backup/configuration/syncer/rsync/base.rb +28 -0
  63. data/lib/backup/configuration/syncer/rsync/local.rb +11 -0
  64. data/lib/backup/configuration/syncer/rsync/pull.rb +11 -0
  65. data/lib/backup/configuration/syncer/rsync/push.rb +31 -0
  66. data/lib/backup/configuration/syncer/s3.rb +23 -0
  67. data/lib/backup/database/base.rb +59 -0
  68. data/lib/backup/database/mongodb.rb +232 -0
  69. data/lib/backup/database/mysql.rb +163 -0
  70. data/lib/backup/database/postgresql.rb +146 -0
  71. data/lib/backup/database/redis.rb +139 -0
  72. data/lib/backup/database/riak.rb +69 -0
  73. data/lib/backup/dependency.rb +114 -0
  74. data/lib/backup/encryptor/base.rb +29 -0
  75. data/lib/backup/encryptor/gpg.rb +80 -0
  76. data/lib/backup/encryptor/open_ssl.rb +72 -0
  77. data/lib/backup/errors.rb +124 -0
  78. data/lib/backup/logger.rb +152 -0
  79. data/lib/backup/model.rb +386 -0
  80. data/lib/backup/notifier/base.rb +81 -0
  81. data/lib/backup/notifier/campfire.rb +168 -0
  82. data/lib/backup/notifier/hipchat.rb +99 -0
  83. data/lib/backup/notifier/mail.rb +206 -0
  84. data/lib/backup/notifier/presently.rb +88 -0
  85. data/lib/backup/notifier/prowl.rb +65 -0
  86. data/lib/backup/notifier/twitter.rb +70 -0
  87. data/lib/backup/package.rb +51 -0
  88. data/lib/backup/packager.rb +108 -0
  89. data/lib/backup/pipeline.rb +107 -0
  90. data/lib/backup/splitter.rb +75 -0
  91. data/lib/backup/storage/base.rb +119 -0
  92. data/lib/backup/storage/cloudfiles.rb +87 -0
  93. data/lib/backup/storage/cycler.rb +117 -0
  94. data/lib/backup/storage/dropbox.rb +181 -0
  95. data/lib/backup/storage/ftp.rb +119 -0
  96. data/lib/backup/storage/local.rb +82 -0
  97. data/lib/backup/storage/ninefold.rb +116 -0
  98. data/lib/backup/storage/rsync.rb +149 -0
  99. data/lib/backup/storage/s3.rb +94 -0
  100. data/lib/backup/storage/scp.rb +99 -0
  101. data/lib/backup/storage/sftp.rb +108 -0
  102. data/lib/backup/syncer/base.rb +42 -0
  103. data/lib/backup/syncer/cloud.rb +190 -0
  104. data/lib/backup/syncer/cloud_files.rb +56 -0
  105. data/lib/backup/syncer/rsync/base.rb +52 -0
  106. data/lib/backup/syncer/rsync/local.rb +53 -0
  107. data/lib/backup/syncer/rsync/pull.rb +38 -0
  108. data/lib/backup/syncer/rsync/push.rb +113 -0
  109. data/lib/backup/syncer/s3.rb +47 -0
  110. data/lib/backup/template.rb +46 -0
  111. data/lib/backup/version.rb +43 -0
  112. data/spec/archive_spec.rb +335 -0
  113. data/spec/cleaner_spec.rb +304 -0
  114. data/spec/cli/helpers_spec.rb +176 -0
  115. data/spec/cli/utility_spec.rb +363 -0
  116. data/spec/compressor/base_spec.rb +31 -0
  117. data/spec/compressor/bzip2_spec.rb +83 -0
  118. data/spec/compressor/gzip_spec.rb +83 -0
  119. data/spec/compressor/lzma_spec.rb +83 -0
  120. data/spec/compressor/pbzip2_spec.rb +124 -0
  121. data/spec/config_spec.rb +321 -0
  122. data/spec/configuration/base_spec.rb +35 -0
  123. data/spec/configuration/compressor/bzip2_spec.rb +29 -0
  124. data/spec/configuration/compressor/gzip_spec.rb +29 -0
  125. data/spec/configuration/compressor/lzma_spec.rb +29 -0
  126. data/spec/configuration/compressor/pbzip2_spec.rb +32 -0
  127. data/spec/configuration/database/base_spec.rb +17 -0
  128. data/spec/configuration/database/mongodb_spec.rb +56 -0
  129. data/spec/configuration/database/mysql_spec.rb +53 -0
  130. data/spec/configuration/database/postgresql_spec.rb +53 -0
  131. data/spec/configuration/database/redis_spec.rb +50 -0
  132. data/spec/configuration/database/riak_spec.rb +35 -0
  133. data/spec/configuration/encryptor/gpg_spec.rb +26 -0
  134. data/spec/configuration/encryptor/open_ssl_spec.rb +35 -0
  135. data/spec/configuration/notifier/base_spec.rb +32 -0
  136. data/spec/configuration/notifier/campfire_spec.rb +32 -0
  137. data/spec/configuration/notifier/hipchat_spec.rb +44 -0
  138. data/spec/configuration/notifier/mail_spec.rb +71 -0
  139. data/spec/configuration/notifier/presently_spec.rb +35 -0
  140. data/spec/configuration/notifier/prowl_spec.rb +29 -0
  141. data/spec/configuration/notifier/twitter_spec.rb +35 -0
  142. data/spec/configuration/storage/cloudfiles_spec.rb +41 -0
  143. data/spec/configuration/storage/dropbox_spec.rb +38 -0
  144. data/spec/configuration/storage/ftp_spec.rb +44 -0
  145. data/spec/configuration/storage/local_spec.rb +29 -0
  146. data/spec/configuration/storage/ninefold_spec.rb +32 -0
  147. data/spec/configuration/storage/rsync_spec.rb +41 -0
  148. data/spec/configuration/storage/s3_spec.rb +38 -0
  149. data/spec/configuration/storage/scp_spec.rb +41 -0
  150. data/spec/configuration/storage/sftp_spec.rb +41 -0
  151. data/spec/configuration/syncer/cloud_files_spec.rb +44 -0
  152. data/spec/configuration/syncer/rsync/base_spec.rb +33 -0
  153. data/spec/configuration/syncer/rsync/local_spec.rb +10 -0
  154. data/spec/configuration/syncer/rsync/pull_spec.rb +10 -0
  155. data/spec/configuration/syncer/rsync/push_spec.rb +43 -0
  156. data/spec/configuration/syncer/s3_spec.rb +38 -0
  157. data/spec/database/base_spec.rb +54 -0
  158. data/spec/database/mongodb_spec.rb +428 -0
  159. data/spec/database/mysql_spec.rb +335 -0
  160. data/spec/database/postgresql_spec.rb +278 -0
  161. data/spec/database/redis_spec.rb +260 -0
  162. data/spec/database/riak_spec.rb +108 -0
  163. data/spec/dependency_spec.rb +49 -0
  164. data/spec/encryptor/base_spec.rb +30 -0
  165. data/spec/encryptor/gpg_spec.rb +134 -0
  166. data/spec/encryptor/open_ssl_spec.rb +129 -0
  167. data/spec/errors_spec.rb +306 -0
  168. data/spec/logger_spec.rb +363 -0
  169. data/spec/model_spec.rb +649 -0
  170. data/spec/notifier/base_spec.rb +89 -0
  171. data/spec/notifier/campfire_spec.rb +199 -0
  172. data/spec/notifier/hipchat_spec.rb +188 -0
  173. data/spec/notifier/mail_spec.rb +280 -0
  174. data/spec/notifier/presently_spec.rb +181 -0
  175. data/spec/notifier/prowl_spec.rb +117 -0
  176. data/spec/notifier/twitter_spec.rb +132 -0
  177. data/spec/package_spec.rb +61 -0
  178. data/spec/packager_spec.rb +225 -0
  179. data/spec/pipeline_spec.rb +257 -0
  180. data/spec/spec_helper.rb +59 -0
  181. data/spec/splitter_spec.rb +120 -0
  182. data/spec/storage/base_spec.rb +160 -0
  183. data/spec/storage/cloudfiles_spec.rb +230 -0
  184. data/spec/storage/cycler_spec.rb +239 -0
  185. data/spec/storage/dropbox_spec.rb +370 -0
  186. data/spec/storage/ftp_spec.rb +247 -0
  187. data/spec/storage/local_spec.rb +235 -0
  188. data/spec/storage/ninefold_spec.rb +319 -0
  189. data/spec/storage/rsync_spec.rb +345 -0
  190. data/spec/storage/s3_spec.rb +221 -0
  191. data/spec/storage/scp_spec.rb +209 -0
  192. data/spec/storage/sftp_spec.rb +220 -0
  193. data/spec/syncer/base_spec.rb +22 -0
  194. data/spec/syncer/cloud_files_spec.rb +192 -0
  195. data/spec/syncer/rsync/base_spec.rb +118 -0
  196. data/spec/syncer/rsync/local_spec.rb +121 -0
  197. data/spec/syncer/rsync/pull_spec.rb +90 -0
  198. data/spec/syncer/rsync/push_spec.rb +327 -0
  199. data/spec/syncer/s3_spec.rb +192 -0
  200. data/spec/version_spec.rb +21 -0
  201. data/templates/cli/utility/archive +25 -0
  202. data/templates/cli/utility/compressor/bzip2 +7 -0
  203. data/templates/cli/utility/compressor/gzip +7 -0
  204. data/templates/cli/utility/compressor/lzma +7 -0
  205. data/templates/cli/utility/compressor/pbzip2 +7 -0
  206. data/templates/cli/utility/config +31 -0
  207. data/templates/cli/utility/database/mongodb +18 -0
  208. data/templates/cli/utility/database/mysql +21 -0
  209. data/templates/cli/utility/database/postgresql +17 -0
  210. data/templates/cli/utility/database/redis +16 -0
  211. data/templates/cli/utility/database/riak +11 -0
  212. data/templates/cli/utility/encryptor/gpg +12 -0
  213. data/templates/cli/utility/encryptor/openssl +9 -0
  214. data/templates/cli/utility/model.erb +23 -0
  215. data/templates/cli/utility/notifier/campfire +12 -0
  216. data/templates/cli/utility/notifier/hipchat +15 -0
  217. data/templates/cli/utility/notifier/mail +22 -0
  218. data/templates/cli/utility/notifier/presently +13 -0
  219. data/templates/cli/utility/notifier/prowl +11 -0
  220. data/templates/cli/utility/notifier/twitter +13 -0
  221. data/templates/cli/utility/splitter +7 -0
  222. data/templates/cli/utility/storage/cloud_files +22 -0
  223. data/templates/cli/utility/storage/dropbox +20 -0
  224. data/templates/cli/utility/storage/ftp +12 -0
  225. data/templates/cli/utility/storage/local +7 -0
  226. data/templates/cli/utility/storage/ninefold +9 -0
  227. data/templates/cli/utility/storage/rsync +11 -0
  228. data/templates/cli/utility/storage/s3 +19 -0
  229. data/templates/cli/utility/storage/scp +11 -0
  230. data/templates/cli/utility/storage/sftp +11 -0
  231. data/templates/cli/utility/syncer/cloud_files +48 -0
  232. data/templates/cli/utility/syncer/rsync_local +12 -0
  233. data/templates/cli/utility/syncer/rsync_pull +17 -0
  234. data/templates/cli/utility/syncer/rsync_push +17 -0
  235. data/templates/cli/utility/syncer/s3 +45 -0
  236. data/templates/general/links +11 -0
  237. data/templates/general/version.erb +2 -0
  238. data/templates/notifier/mail/failure.erb +9 -0
  239. data/templates/notifier/mail/success.erb +7 -0
  240. data/templates/notifier/mail/warning.erb +9 -0
  241. data/templates/storage/dropbox/authorization_url.erb +6 -0
  242. data/templates/storage/dropbox/authorized.erb +4 -0
  243. data/templates/storage/dropbox/cache_file_written.erb +10 -0
  244. 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,10 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
6
+ class Base < Configuration::Base; end
7
+ end
8
+ end
9
+ end
10
+
@@ -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,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
6
+ module RSync
7
+ class Local < Base; end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
6
+ module RSync
7
+ class Pull < Push; end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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