backup 3.0.3.build.0 → 3.0.3

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 (126) hide show
  1. data/.gitignore +2 -0
  2. data/.infinity_test +7 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +17 -0
  5. data/Gemfile.lock +88 -0
  6. data/LICENSE.md +24 -0
  7. data/README.md +236 -0
  8. data/backup.gemspec +41 -0
  9. data/bin/backup +191 -12
  10. data/lib/backup.rb +162 -0
  11. data/lib/backup/archive.rb +54 -0
  12. data/lib/backup/cli.rb +50 -0
  13. data/lib/backup/compressor/base.rb +17 -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/gzip.rb +23 -0
  18. data/lib/backup/configuration/database/base.rb +18 -0
  19. data/lib/backup/configuration/database/mongodb.rb +37 -0
  20. data/lib/backup/configuration/database/mysql.rb +37 -0
  21. data/lib/backup/configuration/database/postgresql.rb +37 -0
  22. data/lib/backup/configuration/database/redis.rb +35 -0
  23. data/lib/backup/configuration/encryptor/base.rb +10 -0
  24. data/lib/backup/configuration/encryptor/gpg.rb +17 -0
  25. data/lib/backup/configuration/encryptor/open_ssl.rb +26 -0
  26. data/lib/backup/configuration/helpers.rb +54 -0
  27. data/lib/backup/configuration/notifier/base.rb +39 -0
  28. data/lib/backup/configuration/notifier/mail.rb +52 -0
  29. data/lib/backup/configuration/storage/base.rb +18 -0
  30. data/lib/backup/configuration/storage/cloudfiles.rb +21 -0
  31. data/lib/backup/configuration/storage/dropbox.rb +25 -0
  32. data/lib/backup/configuration/storage/ftp.rb +25 -0
  33. data/lib/backup/configuration/storage/rsync.rb +25 -0
  34. data/lib/backup/configuration/storage/s3.rb +25 -0
  35. data/lib/backup/configuration/storage/scp.rb +25 -0
  36. data/lib/backup/configuration/storage/sftp.rb +25 -0
  37. data/lib/backup/configuration/syncer/rsync.rb +45 -0
  38. data/lib/backup/database/base.rb +33 -0
  39. data/lib/backup/database/mongodb.rb +137 -0
  40. data/lib/backup/database/mysql.rb +104 -0
  41. data/lib/backup/database/postgresql.rb +111 -0
  42. data/lib/backup/database/redis.rb +105 -0
  43. data/lib/backup/encryptor/base.rb +17 -0
  44. data/lib/backup/encryptor/gpg.rb +78 -0
  45. data/lib/backup/encryptor/open_ssl.rb +67 -0
  46. data/lib/backup/finder.rb +39 -0
  47. data/lib/backup/logger.rb +86 -0
  48. data/lib/backup/model.rb +272 -0
  49. data/lib/backup/notifier/base.rb +29 -0
  50. data/lib/backup/notifier/binder.rb +32 -0
  51. data/lib/backup/notifier/mail.rb +141 -0
  52. data/lib/backup/notifier/templates/notify_failure.erb +31 -0
  53. data/lib/backup/notifier/templates/notify_success.erb +16 -0
  54. data/lib/backup/storage/base.rb +67 -0
  55. data/lib/backup/storage/cloudfiles.rb +95 -0
  56. data/lib/backup/storage/dropbox.rb +82 -0
  57. data/lib/backup/storage/ftp.rb +114 -0
  58. data/lib/backup/storage/object.rb +45 -0
  59. data/lib/backup/storage/rsync.rb +99 -0
  60. data/lib/backup/storage/s3.rb +108 -0
  61. data/lib/backup/storage/scp.rb +105 -0
  62. data/lib/backup/storage/sftp.rb +106 -0
  63. data/lib/backup/syncer/rsync.rb +119 -0
  64. data/lib/backup/version.rb +72 -0
  65. data/lib/templates/archive +4 -0
  66. data/lib/templates/compressor/gzip +4 -0
  67. data/lib/templates/database/mongodb +10 -0
  68. data/lib/templates/database/mysql +11 -0
  69. data/lib/templates/database/postgresql +11 -0
  70. data/lib/templates/database/redis +10 -0
  71. data/lib/templates/encryptor/gpg +9 -0
  72. data/lib/templates/encryptor/openssl +5 -0
  73. data/lib/templates/notifier/mail +14 -0
  74. data/lib/templates/readme +15 -0
  75. data/lib/templates/storage/cloudfiles +7 -0
  76. data/lib/templates/storage/dropbox +8 -0
  77. data/lib/templates/storage/ftp +8 -0
  78. data/lib/templates/storage/rsync +7 -0
  79. data/lib/templates/storage/s3 +8 -0
  80. data/lib/templates/storage/scp +8 -0
  81. data/lib/templates/storage/sftp +8 -0
  82. data/lib/templates/syncer/rsync +14 -0
  83. data/spec/archive_spec.rb +53 -0
  84. data/spec/backup_spec.rb +11 -0
  85. data/spec/compressor/gzip_spec.rb +59 -0
  86. data/spec/configuration/base_spec.rb +35 -0
  87. data/spec/configuration/compressor/gzip_spec.rb +28 -0
  88. data/spec/configuration/database/base_spec.rb +16 -0
  89. data/spec/configuration/database/mongodb_spec.rb +30 -0
  90. data/spec/configuration/database/mysql_spec.rb +32 -0
  91. data/spec/configuration/database/postgresql_spec.rb +32 -0
  92. data/spec/configuration/database/redis_spec.rb +30 -0
  93. data/spec/configuration/encryptor/gpg_spec.rb +25 -0
  94. data/spec/configuration/encryptor/open_ssl_spec.rb +31 -0
  95. data/spec/configuration/notifier/mail_spec.rb +32 -0
  96. data/spec/configuration/storage/cloudfiles_spec.rb +34 -0
  97. data/spec/configuration/storage/dropbox_spec.rb +40 -0
  98. data/spec/configuration/storage/ftp_spec.rb +40 -0
  99. data/spec/configuration/storage/rsync_spec.rb +37 -0
  100. data/spec/configuration/storage/s3_spec.rb +37 -0
  101. data/spec/configuration/storage/scp_spec.rb +40 -0
  102. data/spec/configuration/storage/sftp_spec.rb +40 -0
  103. data/spec/configuration/syncer/rsync_spec.rb +46 -0
  104. data/spec/database/base_spec.rb +30 -0
  105. data/spec/database/mongodb_spec.rb +144 -0
  106. data/spec/database/mysql_spec.rb +150 -0
  107. data/spec/database/postgresql_spec.rb +164 -0
  108. data/spec/database/redis_spec.rb +122 -0
  109. data/spec/encryptor/gpg_spec.rb +57 -0
  110. data/spec/encryptor/open_ssl_spec.rb +102 -0
  111. data/spec/logger_spec.rb +46 -0
  112. data/spec/model_spec.rb +236 -0
  113. data/spec/notifier/mail_spec.rb +97 -0
  114. data/spec/spec_helper.rb +21 -0
  115. data/spec/storage/base_spec.rb +33 -0
  116. data/spec/storage/cloudfiles_spec.rb +102 -0
  117. data/spec/storage/dropbox_spec.rb +89 -0
  118. data/spec/storage/ftp_spec.rb +133 -0
  119. data/spec/storage/object_spec.rb +74 -0
  120. data/spec/storage/rsync_spec.rb +115 -0
  121. data/spec/storage/s3_spec.rb +110 -0
  122. data/spec/storage/scp_spec.rb +129 -0
  123. data/spec/storage/sftp_spec.rb +125 -0
  124. data/spec/syncer/rsync_spec.rb +156 -0
  125. data/spec/version_spec.rb +32 -0
  126. metadata +195 -6
@@ -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
+ # Files/Folders to Sync
23
+ attr_accessor :folders
24
+
25
+ ##
26
+ # Path to store the synced files/folders to
27
+ attr_accessor :path
28
+
29
+ ##
30
+ # Flag for mirroring the files/folders
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 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,137 @@
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
+ # Creates a new instance of the MongoDB database object
33
+ def initialize(&block)
34
+ load_defaults!
35
+
36
+ @only_collections ||= Array.new
37
+ @additional_options ||= Array.new
38
+ @ipv6 ||= false
39
+
40
+ instance_eval(&block)
41
+ prepare!
42
+ end
43
+
44
+ ##
45
+ # Builds the MongoDB credentials syntax to authenticate the user
46
+ # to perform the database dumping process
47
+ def credential_options
48
+ %w[username password].map do |option|
49
+ next if send(option).nil? or send(option).empty?
50
+ "--#{option}='#{send(option)}'"
51
+ end.compact.join("\s")
52
+ end
53
+
54
+ ##
55
+ # Builds the MongoDB connectivity options syntax to connect the user
56
+ # to perform the database dumping process
57
+ def connectivity_options
58
+ %w[host port].map do |option|
59
+ next if send(option).nil? or (send(option).respond_to?(:empty?) and send(option).empty?)
60
+ "--#{option}='#{send(option)}'"
61
+ end.compact.join("\s")
62
+ end
63
+
64
+ ##
65
+ # Builds a MongoDB compatible string for the
66
+ # additional options specified by the user
67
+ def additional_options
68
+ @additional_options.join("\s")
69
+ end
70
+
71
+ ##
72
+ # Returns an array of collections to dump
73
+ def collections_to_dump
74
+ @only_collections
75
+ end
76
+
77
+ ##
78
+ # Returns the MongoDB database selector syntax
79
+ def database
80
+ "--db='#{ name }'"
81
+ end
82
+
83
+ ##
84
+ # Returns the mongodump syntax for enabling ipv6
85
+ def ipv6
86
+ @ipv6.eql?(true) ? '--ipv6' : ''
87
+ end
88
+
89
+ ##
90
+ # Returns the MongoDB syntax for determining where to output all the database dumps,
91
+ # e.g. ~/Backup/.tmp/MongoDB/<databases here>/<database collections>
92
+ def dump_directory
93
+ "--out='#{ dump_path }'"
94
+ end
95
+
96
+ ##
97
+ # Builds the full mongodump string based on all attributes
98
+ def mongodump
99
+ "#{ utility(:mongodump) } #{ database } #{ credential_options } " +
100
+ "#{ connectivity_options } #{ ipv6 } #{ additional_options } #{ dump_directory }"
101
+ end
102
+
103
+ ##
104
+ # Performs the mongodump command and outputs the data to the
105
+ # specified path based on the 'trigger'. If the user hasn't specified any
106
+ # specific collections to dump, it'll dump everything. If the user has specified
107
+ # collections to dump, it'll loop through the array of collections and invoke the
108
+ # 'mongodump' command once per collection
109
+ def perform!
110
+ log!
111
+
112
+ if collections_to_dump.is_a?(Array) and not collections_to_dump.empty?
113
+ specific_collection_dump!
114
+ else
115
+ dump!
116
+ end
117
+ end
118
+
119
+ ##
120
+ # Builds and runs the mongodump command
121
+ def dump!
122
+ run(mongodump)
123
+ end
124
+
125
+ ##
126
+ # For each collection in the @only_collections array, it'll
127
+ # build the whole 'mongodump' command, append the '--collection' option,
128
+ # and run the command built command
129
+ def specific_collection_dump!
130
+ collections_to_dump.each do |collection|
131
+ run("#{mongodump} --collection='#{collection}'")
132
+ end
133
+ end
134
+
135
+ end
136
+ end
137
+ 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
@@ -0,0 +1,111 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Database
5
+ class PostgreSQL < 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 "pg_dump" options
29
+ attr_accessor :additional_options
30
+
31
+ ##
32
+ # Creates a new instance of the PostgreSQL adapter object
33
+ # Sets the PGPASSWORD environment variable to the password
34
+ # so it doesn't prompt and hang in the process
35
+ def initialize(&block)
36
+ load_defaults!
37
+
38
+ @skip_tables ||= Array.new
39
+ @only_tables ||= Array.new
40
+ @additional_options ||= Array.new
41
+
42
+ instance_eval(&block)
43
+ prepare!
44
+ ENV['PGPASSWORD'] = password
45
+ end
46
+
47
+ ##
48
+ # Builds the PostgreSQL syntax for specifying which tables to skip
49
+ # during the dumping of the database
50
+ def tables_to_skip
51
+ skip_tables.map do |table|
52
+ "--exclude-table='#{table}'"
53
+ end.join("\s")
54
+ end
55
+
56
+ ##
57
+ # Builds the PostgreSQL syntax for specifying which tables to dump
58
+ # during the dumping of the database
59
+ def tables_to_dump
60
+ only_tables.map do |table|
61
+ "--table='#{table}'"
62
+ end.join("\s")
63
+ end
64
+
65
+ ##
66
+ # Builds the credentials PostgreSQL syntax to authenticate the user
67
+ # to perform the database dumping process
68
+ def credential_options
69
+ return '' unless username.is_a?(String) and not username.empty?
70
+ "--username='#{username}'"
71
+ end
72
+
73
+ ##
74
+ # Builds the PostgreSQL connectivity options syntax to connect the user
75
+ # to perform the database dumping process, socket gets gsub'd to host since
76
+ # that's the option PostgreSQL takes for socket connections as well. In case
77
+ # both the host and the socket are specified, the socket will take priority over the host
78
+ def connectivity_options
79
+ %w[host port socket].map do |option|
80
+ next if send(option).nil? or (send(option).respond_to?(:empty?) and send(option).empty?)
81
+ "--#{option}='#{send(option)}'".gsub('--socket=', '--host=')
82
+ end.compact.join("\s")
83
+ end
84
+
85
+ ##
86
+ # Builds a PostgreSQL compatible string for the additional options
87
+ # specified by the user
88
+ def options
89
+ additional_options.join("\s")
90
+ end
91
+
92
+ ##
93
+ # Builds the full pgdump string based on all attributes
94
+ def pgdump
95
+ "#{ utility(:pg_dump) } #{ credential_options } #{ connectivity_options } " +
96
+ "#{ options } #{ tables_to_dump } #{ tables_to_skip } #{ name }"
97
+ end
98
+
99
+ ##
100
+ # Performs the pgdump command and outputs the
101
+ # data to the specified path based on the 'trigger'
102
+ # and resets the 'PGPASSWORD' environment variable to nil
103
+ def perform!
104
+ log!
105
+ run("#{pgdump} > '#{File.join(dump_path, name)}.sql'")
106
+ ENV['PGPASSWORD'] = nil
107
+ end
108
+
109
+ end
110
+ end
111
+ end