interu-backup 3.0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +31 -0
  3. data/Gemfile.lock +117 -0
  4. data/Guardfile +17 -0
  5. data/LICENSE.md +24 -0
  6. data/README.md +332 -0
  7. data/backup.gemspec +31 -0
  8. data/bin/backup +267 -0
  9. data/lib/backup.rb +181 -0
  10. data/lib/backup/archive.rb +73 -0
  11. data/lib/backup/cli.rb +82 -0
  12. data/lib/backup/compressor/base.rb +17 -0
  13. data/lib/backup/compressor/bzip2.rb +64 -0
  14. data/lib/backup/compressor/gzip.rb +61 -0
  15. data/lib/backup/configuration/base.rb +15 -0
  16. data/lib/backup/configuration/compressor/base.rb +10 -0
  17. data/lib/backup/configuration/compressor/bzip2.rb +23 -0
  18. data/lib/backup/configuration/compressor/gzip.rb +23 -0
  19. data/lib/backup/configuration/database/base.rb +18 -0
  20. data/lib/backup/configuration/database/mongodb.rb +41 -0
  21. data/lib/backup/configuration/database/mysql.rb +37 -0
  22. data/lib/backup/configuration/database/postgresql.rb +37 -0
  23. data/lib/backup/configuration/database/redis.rb +35 -0
  24. data/lib/backup/configuration/encryptor/base.rb +10 -0
  25. data/lib/backup/configuration/encryptor/gpg.rb +17 -0
  26. data/lib/backup/configuration/encryptor/open_ssl.rb +26 -0
  27. data/lib/backup/configuration/helpers.rb +54 -0
  28. data/lib/backup/configuration/notifier/base.rb +39 -0
  29. data/lib/backup/configuration/notifier/campfire.rb +25 -0
  30. data/lib/backup/configuration/notifier/mail.rb +52 -0
  31. data/lib/backup/configuration/notifier/presently.rb +25 -0
  32. data/lib/backup/configuration/notifier/twitter.rb +21 -0
  33. data/lib/backup/configuration/storage/base.rb +18 -0
  34. data/lib/backup/configuration/storage/cloudfiles.rb +21 -0
  35. data/lib/backup/configuration/storage/dropbox.rb +29 -0
  36. data/lib/backup/configuration/storage/ftp.rb +25 -0
  37. data/lib/backup/configuration/storage/rsync.rb +25 -0
  38. data/lib/backup/configuration/storage/s3.rb +25 -0
  39. data/lib/backup/configuration/storage/scp.rb +25 -0
  40. data/lib/backup/configuration/storage/sftp.rb +25 -0
  41. data/lib/backup/configuration/syncer/rsync.rb +45 -0
  42. data/lib/backup/configuration/syncer/s3.rb +33 -0
  43. data/lib/backup/database/base.rb +33 -0
  44. data/lib/backup/database/mongodb.rb +179 -0
  45. data/lib/backup/database/mysql.rb +104 -0
  46. data/lib/backup/database/postgresql.rb +111 -0
  47. data/lib/backup/database/redis.rb +105 -0
  48. data/lib/backup/dependency.rb +96 -0
  49. data/lib/backup/encryptor/base.rb +17 -0
  50. data/lib/backup/encryptor/gpg.rb +78 -0
  51. data/lib/backup/encryptor/open_ssl.rb +67 -0
  52. data/lib/backup/exception/command_not_found.rb +8 -0
  53. data/lib/backup/finder.rb +39 -0
  54. data/lib/backup/logger.rb +102 -0
  55. data/lib/backup/model.rb +272 -0
  56. data/lib/backup/notifier/base.rb +29 -0
  57. data/lib/backup/notifier/binder.rb +32 -0
  58. data/lib/backup/notifier/campfire.rb +194 -0
  59. data/lib/backup/notifier/mail.rb +141 -0
  60. data/lib/backup/notifier/presently.rb +105 -0
  61. data/lib/backup/notifier/templates/notify_failure.erb +33 -0
  62. data/lib/backup/notifier/templates/notify_success.erb +16 -0
  63. data/lib/backup/notifier/twitter.rb +87 -0
  64. data/lib/backup/storage/base.rb +67 -0
  65. data/lib/backup/storage/cloudfiles.rb +95 -0
  66. data/lib/backup/storage/dropbox.rb +91 -0
  67. data/lib/backup/storage/ftp.rb +114 -0
  68. data/lib/backup/storage/object.rb +45 -0
  69. data/lib/backup/storage/rsync.rb +129 -0
  70. data/lib/backup/storage/s3.rb +180 -0
  71. data/lib/backup/storage/scp.rb +106 -0
  72. data/lib/backup/storage/sftp.rb +106 -0
  73. data/lib/backup/syncer/base.rb +10 -0
  74. data/lib/backup/syncer/rsync.rb +152 -0
  75. data/lib/backup/syncer/s3.rb +118 -0
  76. data/lib/backup/version.rb +43 -0
  77. data/lib/templates/archive +7 -0
  78. data/lib/templates/compressor/bzip2 +7 -0
  79. data/lib/templates/compressor/gzip +7 -0
  80. data/lib/templates/database/mongodb +14 -0
  81. data/lib/templates/database/mysql +14 -0
  82. data/lib/templates/database/postgresql +14 -0
  83. data/lib/templates/database/redis +13 -0
  84. data/lib/templates/encryptor/gpg +12 -0
  85. data/lib/templates/encryptor/openssl +8 -0
  86. data/lib/templates/notifier/campfire +11 -0
  87. data/lib/templates/notifier/mail +17 -0
  88. data/lib/templates/notifier/presently +12 -0
  89. data/lib/templates/notifier/twitter +12 -0
  90. data/lib/templates/readme +15 -0
  91. data/lib/templates/storage/cloudfiles +10 -0
  92. data/lib/templates/storage/dropbox +12 -0
  93. data/lib/templates/storage/ftp +11 -0
  94. data/lib/templates/storage/rsync +10 -0
  95. data/lib/templates/storage/s3 +21 -0
  96. data/lib/templates/storage/scp +11 -0
  97. data/lib/templates/storage/sftp +11 -0
  98. data/lib/templates/syncer/rsync +17 -0
  99. data/lib/templates/syncer/s3 +15 -0
  100. data/spec/archive_spec.rb +90 -0
  101. data/spec/backup_spec.rb +11 -0
  102. data/spec/compressor/bzip2_spec.rb +59 -0
  103. data/spec/compressor/gzip_spec.rb +59 -0
  104. data/spec/configuration/base_spec.rb +35 -0
  105. data/spec/configuration/compressor/gzip_spec.rb +28 -0
  106. data/spec/configuration/database/base_spec.rb +16 -0
  107. data/spec/configuration/database/mongodb_spec.rb +30 -0
  108. data/spec/configuration/database/mysql_spec.rb +32 -0
  109. data/spec/configuration/database/postgresql_spec.rb +32 -0
  110. data/spec/configuration/database/redis_spec.rb +30 -0
  111. data/spec/configuration/encryptor/gpg_spec.rb +25 -0
  112. data/spec/configuration/encryptor/open_ssl_spec.rb +31 -0
  113. data/spec/configuration/notifier/campfire_spec.rb +20 -0
  114. data/spec/configuration/notifier/mail_spec.rb +32 -0
  115. data/spec/configuration/notifier/twitter_spec.rb +22 -0
  116. data/spec/configuration/storage/cloudfiles_spec.rb +34 -0
  117. data/spec/configuration/storage/dropbox_spec.rb +43 -0
  118. data/spec/configuration/storage/ftp_spec.rb +40 -0
  119. data/spec/configuration/storage/rsync_spec.rb +37 -0
  120. data/spec/configuration/storage/s3_spec.rb +37 -0
  121. data/spec/configuration/storage/scp_spec.rb +40 -0
  122. data/spec/configuration/storage/sftp_spec.rb +40 -0
  123. data/spec/configuration/syncer/rsync_spec.rb +46 -0
  124. data/spec/configuration/syncer/s3_spec.rb +43 -0
  125. data/spec/database/base_spec.rb +30 -0
  126. data/spec/database/mongodb_spec.rb +181 -0
  127. data/spec/database/mysql_spec.rb +150 -0
  128. data/spec/database/postgresql_spec.rb +164 -0
  129. data/spec/database/redis_spec.rb +122 -0
  130. data/spec/encryptor/gpg_spec.rb +57 -0
  131. data/spec/encryptor/open_ssl_spec.rb +102 -0
  132. data/spec/logger_spec.rb +58 -0
  133. data/spec/model_spec.rb +236 -0
  134. data/spec/notifier/campfire_spec.rb +96 -0
  135. data/spec/notifier/mail_spec.rb +97 -0
  136. data/spec/notifier/presently_spec.rb +99 -0
  137. data/spec/notifier/twitter_spec.rb +86 -0
  138. data/spec/spec_helper.rb +25 -0
  139. data/spec/storage/base_spec.rb +33 -0
  140. data/spec/storage/cloudfiles_spec.rb +102 -0
  141. data/spec/storage/dropbox_spec.rb +105 -0
  142. data/spec/storage/ftp_spec.rb +133 -0
  143. data/spec/storage/object_spec.rb +74 -0
  144. data/spec/storage/rsync_spec.rb +131 -0
  145. data/spec/storage/s3_spec.rb +110 -0
  146. data/spec/storage/scp_spec.rb +129 -0
  147. data/spec/storage/sftp_spec.rb +125 -0
  148. data/spec/syncer/rsync_spec.rb +195 -0
  149. data/spec/syncer/s3_spec.rb +139 -0
  150. data/spec/version_spec.rb +21 -0
  151. metadata +231 -0
@@ -0,0 +1,25 @@
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
+ 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 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,45 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
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
16
+
17
+ ##
18
+ # The SSH port to connect to
19
+ attr_accessor :port
20
+
21
+ ##
22
+ # Directories to sync
23
+ attr_accessor :directories
24
+
25
+ ##
26
+ # Path to store the synced files/directories to
27
+ attr_accessor :path
28
+
29
+ ##
30
+ # Flag for mirroring the files/directories
31
+ attr_accessor :mirror
32
+
33
+ ##
34
+ # Flag for compressing (only compresses for the transfer)
35
+ attr_accessor :compress
36
+
37
+ ##
38
+ # Additional options for the rsync cli
39
+ attr_accessor :additional_options
40
+
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
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 to sync to
15
+ attr_accessor :bucket, :path
16
+
17
+ ##
18
+ # Directories to sync
19
+ attr_accessor :directories
20
+
21
+ ##
22
+ # Flag to enable mirroring
23
+ attr_accessor :mirror
24
+
25
+ ##
26
+ # Additional options for the s3sync cli
27
+ attr_accessor :additional_options
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Database
5
+ class Base
6
+ include Backup::CLI
7
+ include Backup::Configuration::Helpers
8
+
9
+ ##
10
+ # Contains the path to where the database should be dumped
11
+ attr_accessor :dump_path
12
+
13
+ ##
14
+ # Allows the user to specify the path to a "dump" utility
15
+ # in case it cannot be auto-detected by Backup
16
+ attr_accessor :utility_path
17
+
18
+ ##
19
+ # Defines the @dump_path and ensures it exists by creating it
20
+ def prepare!
21
+ @dump_path = File.join(TMP_PATH, TRIGGER, self.class.name.split('::').last)
22
+ mkdir(dump_path)
23
+ end
24
+
25
+ ##
26
+ # Logs a message to the console and log file to inform
27
+ # the client that Backup is dumping the database
28
+ def log!
29
+ Logger.message("#{ self.class } started dumping and archiving \"#{ name }\".")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,179 @@
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
+ # 'lock' dump meaning wrapping mongodump with fsync & lock
33
+ attr_accessor :lock
34
+
35
+ ##
36
+ # Creates a new instance of the MongoDB database object
37
+ def initialize(&block)
38
+ load_defaults!
39
+
40
+ @only_collections ||= Array.new
41
+ @additional_options ||= Array.new
42
+ @ipv6 ||= false
43
+ @lock ||= false
44
+
45
+ instance_eval(&block)
46
+ prepare!
47
+ end
48
+
49
+ ##
50
+ # Builds the MongoDB credentials syntax to authenticate the user
51
+ # to perform the database dumping process
52
+ def credential_options
53
+ %w[username password].map do |option|
54
+ next if send(option).nil? or send(option).empty?
55
+ "--#{option}='#{send(option)}'"
56
+ end.compact.join("\s")
57
+ end
58
+
59
+ ##
60
+ # Builds the MongoDB connectivity options syntax to connect the user
61
+ # to perform the database dumping process
62
+ def connectivity_options
63
+ %w[host port].map do |option|
64
+ next if send(option).nil? or (send(option).respond_to?(:empty?) and send(option).empty?)
65
+ "--#{option}='#{send(option)}'"
66
+ end.compact.join("\s")
67
+ end
68
+
69
+ ##
70
+ # Builds a MongoDB compatible string for the
71
+ # additional options specified by the user
72
+ def additional_options
73
+ @additional_options.join("\s")
74
+ end
75
+
76
+ ##
77
+ # Returns an array of collections to dump
78
+ def collections_to_dump
79
+ @only_collections
80
+ end
81
+
82
+ ##
83
+ # Returns the MongoDB database selector syntax
84
+ def database
85
+ "--db='#{ name }'"
86
+ end
87
+
88
+ ##
89
+ # Returns the mongodump syntax for enabling ipv6
90
+ def ipv6
91
+ @ipv6.eql?(true) ? '--ipv6' : ''
92
+ end
93
+
94
+ ##
95
+ # Returns the MongoDB syntax for determining where to output all the database dumps,
96
+ # e.g. ~/Backup/.tmp/MongoDB/<databases here>/<database collections>
97
+ def dump_directory
98
+ "--out='#{ dump_path }'"
99
+ end
100
+
101
+ ##
102
+ # Builds the full mongodump string based on all attributes
103
+ def mongodump
104
+ "#{ utility(:mongodump) } #{ database } #{ credential_options } " +
105
+ "#{ connectivity_options } #{ ipv6 } #{ additional_options } #{ dump_directory }"
106
+ end
107
+
108
+ ##
109
+ # Performs the mongodump command and outputs the data to the
110
+ # specified path based on the 'trigger'. If the user hasn't specified any
111
+ # specific collections to dump, it'll dump everything. If the user has specified
112
+ # collections to dump, it'll loop through the array of collections and invoke the
113
+ # 'mongodump' command once per collection
114
+ def perform!
115
+ log!
116
+
117
+ begin
118
+ lock_database if @lock.eql?(true)
119
+ if collections_to_dump.is_a?(Array) and not collections_to_dump.empty?
120
+ specific_collection_dump!
121
+ else
122
+ dump!
123
+ end
124
+ unlock_database if @lock.eql?(true)
125
+ rescue => exception
126
+ unlock_database if @lock.eql?(true)
127
+ raise exception
128
+ end
129
+ end
130
+
131
+ ##
132
+ # Builds and runs the mongodump command
133
+ def dump!
134
+ run(mongodump)
135
+ end
136
+
137
+ ##
138
+ # For each collection in the @only_collections array, it'll
139
+ # build the whole 'mongodump' command, append the '--collection' option,
140
+ # and run the command built command
141
+ def specific_collection_dump!
142
+ collections_to_dump.each do |collection|
143
+ run("#{mongodump} --collection='#{collection}'")
144
+ end
145
+ end
146
+
147
+ ##
148
+ # Builds the full mongo string based on all attributes
149
+ def mongo_shell
150
+ [utility(:mongo), database, credential_options, connectivity_options, ipv6].join(' ')
151
+ end
152
+
153
+ ##
154
+ # Locks and FSyncs the database to bring it up to sync
155
+ # and ensure no 'write operations' are performed during the
156
+ # dump process
157
+ def lock_database
158
+ lock_command = <<-EOS
159
+ echo 'use admin
160
+ db.runCommand({"fsync" : 1, "lock" : 1})' | #{mongo_shell}
161
+ EOS
162
+
163
+ run(lock_command)
164
+ end
165
+
166
+ ##
167
+ # Unlocks the (locked) database
168
+ def unlock_database
169
+ unlock_command = <<-EOS
170
+ echo 'use admin
171
+ db.$cmd.sys.unlock.findOne()' | #{mongo_shell}
172
+ EOS
173
+
174
+ run(unlock_command)
175
+ end
176
+
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,104 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Database
5
+ class MySQL < 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, :socket
18
+
19
+ ##
20
+ # Tables to skip while dumping the database
21
+ attr_accessor :skip_tables
22
+
23
+ ##
24
+ # Tables to dump, tables that aren't specified won't get dumped
25
+ attr_accessor :only_tables
26
+
27
+ ##
28
+ # Additional "mysqldump" options
29
+ attr_accessor :additional_options
30
+
31
+ ##
32
+ # Creates a new instance of the MySQL adapter object
33
+ def initialize(&block)
34
+ load_defaults!
35
+
36
+ @skip_tables ||= Array.new
37
+ @only_tables ||= Array.new
38
+ @additional_options ||= Array.new
39
+
40
+ instance_eval(&block)
41
+ prepare!
42
+ end
43
+
44
+ ##
45
+ # Builds the MySQL syntax for specifying which tables to skip
46
+ # during the dumping of the database
47
+ def tables_to_skip
48
+ skip_tables.map do |table|
49
+ "--ignore-table='#{name}.#{table}'"
50
+ end.join("\s")
51
+ end
52
+
53
+ ##
54
+ # Builds the MySQL syntax for specifying which tables to dump
55
+ # during the dumping of the database
56
+ def tables_to_dump
57
+ only_tables.join("\s")
58
+ end
59
+
60
+ ##
61
+ # Builds the credentials MySQL syntax to authenticate the user
62
+ # to perform the database dumping process
63
+ def credential_options
64
+ %w[username password].map do |option|
65
+ next if send(option).nil? or send(option).empty?
66
+ "--#{option}='#{send(option)}'".gsub('--username', '--user')
67
+ end.compact.join("\s")
68
+ end
69
+
70
+ ##
71
+ # Builds the MySQL connectivity options syntax to connect the user
72
+ # to perform the database dumping process
73
+ def connectivity_options
74
+ %w[host port socket].map do |option|
75
+ next if send(option).nil? or (send(option).respond_to?(:empty?) and send(option).empty?)
76
+ "--#{option}='#{send(option)}'"
77
+ end.compact.join("\s")
78
+ end
79
+
80
+ ##
81
+ # Builds a MySQL compatible string for the additional options
82
+ # specified by the user
83
+ def options
84
+ additional_options.join("\s")
85
+ end
86
+
87
+ ##
88
+ # Builds the full mysqldump string based on all attributes
89
+ def mysqldump
90
+ "#{ utility(:mysqldump) } #{ credential_options } #{ connectivity_options } " +
91
+ "#{ options } #{ name } #{ tables_to_dump } #{ tables_to_skip }"
92
+ end
93
+
94
+ ##
95
+ # Performs the mysqldump command and outputs the
96
+ # data to the specified path based on the 'trigger'
97
+ def perform!
98
+ log!
99
+ run("#{mysqldump} > '#{File.join(dump_path, name)}.sql'")
100
+ end
101
+
102
+ end
103
+ end
104
+ end