namxam-backup 2.4.5

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 (61) hide show
  1. data/CHANGELOG +131 -0
  2. data/LICENSE +20 -0
  3. data/README.md +122 -0
  4. data/bin/backup +108 -0
  5. data/generators/backup/backup_generator.rb +69 -0
  6. data/generators/backup/templates/backup.rake +56 -0
  7. data/generators/backup/templates/backup.rb +253 -0
  8. data/generators/backup/templates/create_backup_tables.rb +18 -0
  9. data/generators/backup_update/backup_update_generator.rb +50 -0
  10. data/generators/backup_update/templates/migrations/update_backup_tables.rb +27 -0
  11. data/lib/backup.rb +132 -0
  12. data/lib/backup/adapters/archive.rb +34 -0
  13. data/lib/backup/adapters/base.rb +167 -0
  14. data/lib/backup/adapters/custom.rb +41 -0
  15. data/lib/backup/adapters/mongo_db.rb +139 -0
  16. data/lib/backup/adapters/mysql.rb +60 -0
  17. data/lib/backup/adapters/postgresql.rb +56 -0
  18. data/lib/backup/adapters/sqlite.rb +25 -0
  19. data/lib/backup/command_helper.rb +14 -0
  20. data/lib/backup/configuration/adapter.rb +21 -0
  21. data/lib/backup/configuration/adapter_options.rb +8 -0
  22. data/lib/backup/configuration/attributes.rb +19 -0
  23. data/lib/backup/configuration/base.rb +75 -0
  24. data/lib/backup/configuration/helpers.rb +24 -0
  25. data/lib/backup/configuration/mail.rb +20 -0
  26. data/lib/backup/configuration/smtp.rb +8 -0
  27. data/lib/backup/configuration/storage.rb +8 -0
  28. data/lib/backup/connection/cloudfiles.rb +75 -0
  29. data/lib/backup/connection/dropbox.rb +62 -0
  30. data/lib/backup/connection/s3.rb +88 -0
  31. data/lib/backup/core_ext/object.rb +5 -0
  32. data/lib/backup/environment/base.rb +12 -0
  33. data/lib/backup/environment/rails_configuration.rb +15 -0
  34. data/lib/backup/environment/unix_configuration.rb +109 -0
  35. data/lib/backup/mail/base.rb +97 -0
  36. data/lib/backup/mail/mail.txt +7 -0
  37. data/lib/backup/record/base.rb +65 -0
  38. data/lib/backup/record/cloudfiles.rb +28 -0
  39. data/lib/backup/record/dropbox.rb +27 -0
  40. data/lib/backup/record/ftp.rb +39 -0
  41. data/lib/backup/record/local.rb +26 -0
  42. data/lib/backup/record/s3.rb +25 -0
  43. data/lib/backup/record/scp.rb +33 -0
  44. data/lib/backup/record/sftp.rb +38 -0
  45. data/lib/backup/storage/base.rb +10 -0
  46. data/lib/backup/storage/cloudfiles.rb +16 -0
  47. data/lib/backup/storage/dropbox.rb +12 -0
  48. data/lib/backup/storage/ftp.rb +38 -0
  49. data/lib/backup/storage/local.rb +22 -0
  50. data/lib/backup/storage/s3.rb +15 -0
  51. data/lib/backup/storage/scp.rb +30 -0
  52. data/lib/backup/storage/sftp.rb +31 -0
  53. data/lib/backup/version.rb +3 -0
  54. data/lib/generators/backup/USAGE +10 -0
  55. data/lib/generators/backup/backup_generator.rb +47 -0
  56. data/lib/generators/backup/templates/backup.rake +56 -0
  57. data/lib/generators/backup/templates/backup.rb +236 -0
  58. data/lib/generators/backup/templates/create_backup_tables.rb +18 -0
  59. data/setup/backup.rb +255 -0
  60. data/setup/backup.sqlite3 +0 -0
  61. metadata +278 -0
@@ -0,0 +1,56 @@
1
+ namespace :backup do
2
+
3
+ task :boot => :environment do
4
+ Backup::System.boot!
5
+ end
6
+
7
+ desc "Run Backup Procedure."
8
+ task :run => :boot do
9
+ puts "Running: #{ENV['trigger']}."
10
+ Backup::Setup.new(ENV['trigger'], @backup_procedures).initialize_adapter
11
+ end
12
+
13
+ desc "Finds backup records by trigger"
14
+ task :find => :boot do
15
+ puts "Finding backup records with trigger: #{ENV['trigger']}."
16
+ backup = Backup::Setup.new(ENV['trigger'], @backup_procedures)
17
+ records = backup.procedure.record_class.all( :conditions => {:trigger => ENV['trigger']} )
18
+
19
+ if ENV['table'].eql?("true")
20
+ puts Hirb::Helpers::AutoTable.render(records)
21
+ else
22
+ records.each do |record|
23
+ puts record.to_yaml
24
+ end
25
+ end
26
+ end
27
+
28
+ desc "Truncates all records for the specified \"trigger\", excluding the physical files on s3 or the remote server."
29
+ task :truncate => :boot do
30
+ puts "Truncating backup records with trigger: #{ENV['trigger']}."
31
+ Backup::Record::Base.destroy_all :trigger => ENV['trigger']
32
+ end
33
+
34
+ desc "Truncates everything."
35
+ task :truncate_all => :boot do
36
+ puts "Truncating all backup records."
37
+ Backup::Record::Base.destroy_all
38
+ end
39
+
40
+ desc "Destroys all records for the specified \"trigger\", including the physical files on s3 or the remote server."
41
+ task :destroy => :boot do
42
+ puts "Destroying backup records with trigger: #{ENV['trigger']}."
43
+ backup = Backup::Setup.new(ENV['trigger'], @backup_procedures)
44
+ backup.procedure.record_class.destroy_all_backups( backup.procedure, ENV['trigger'] )
45
+ end
46
+
47
+ desc "Destroys all records for the specified \"trigger\", including the physical files on s3 or the remote server."
48
+ task :destroy_all => :boot do
49
+ puts "Destroying all backup records."
50
+ backup = Backup::Setup.new(false, @backup_procedures)
51
+ backup.procedures.each do |backup_procedure|
52
+ backup_procedure.record_class.destroy_all_backups( backup_procedure, backup_procedure.trigger )
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,253 @@
1
+ # Backup Configuration File
2
+ #
3
+ # Use the "backup" block to add backup settings to the configuration file.
4
+ # The argument before the "do" in (backup "argument" do) is called a "trigger".
5
+ # This acts as the identifier for the configuration.
6
+ #
7
+ # In the example below we have a "mysql-backup-s3" trigger for the backup setting.
8
+ # All the configuration is done inside this block. To initialize the backup process for this block,
9
+ # you invoke it using the following rake task:
10
+ #
11
+ # rake backup:run trigger="mysql-backup-s3"
12
+ #
13
+ # You can add as many backup block settings as you want, just be sure every trigger is unique and you can run
14
+ # each of them separately.
15
+ #
16
+ # ADAPTERS
17
+ # - MySQL
18
+ # - PostgreSQL
19
+ # - SQLite
20
+ # - Archive
21
+ # - Custom
22
+ #
23
+ # STORAGE METHODS
24
+ # - S3 (Amazon)
25
+ # - CF (Rackspace Cloud Files)
26
+ # - Dropbox (Dropbox Web Service)
27
+ # - SCP (Remote Server)
28
+ # - FTP (Remote Server)
29
+ # - SFTP (Remote Server)
30
+ # - LOCAL (Local Server)
31
+ #
32
+ # GLOBAL OPTIONS
33
+ # - Keep Backups (keep_backups)
34
+ # - Encrypt With Pasword (encrypt_with_password)
35
+ # - Encrypt With GPG Public Key (encrypt_with_gpg_public_key)
36
+ # - Notify (notify)
37
+ #
38
+ # This is the "decrypt" command for all encrypted backups:
39
+ # sudo backup --decrypt /path/to/encrypted/file
40
+ #
41
+ # Each Backup Setting can contain:
42
+ # - 1 Adapter
43
+ # - 1 Storage Method
44
+ # - Multiple Global Options
45
+ #
46
+ # The combination of these, however, do not matter! So experiment with it.
47
+ #
48
+ # You can also let Backup notify you by email on successfully created backups.
49
+ # - Just uncomment the block of code below (notifier_settings) and fill in your credentials.
50
+ # - Then for set "notify" to "true" in each (backup) block you wish to be notified of.
51
+ #
52
+ # For more information on "Backup", please refer to the wiki on github
53
+ # http://wiki.github.com/meskyanichi/backup/configuration-file
54
+
55
+
56
+ # Notifier
57
+ # Uncomment this if you want to enable notification by email on successful backup runs
58
+ # You will also have to set "notify true" inside each backup block below to enable it for that particular backup
59
+ # notifier_settings do
60
+ #
61
+ # to "example1@gmail.com"
62
+ # from "example2@gmail.com"
63
+ #
64
+ # smtp do
65
+ # host "smtp.gmail.com"
66
+ # port "587"
67
+ # username "example1@gmail.com"
68
+ # password "example1password"
69
+ # authentication "plain"
70
+ # domain "localhost.localdomain"
71
+ # tls true
72
+ # end
73
+ #
74
+ # end
75
+
76
+
77
+ # Initialize with:
78
+ # rake backup:run trigger='mysql-backup-s3'
79
+ backup 'mysql-backup-s3' do
80
+
81
+ adapter :mysql do
82
+ user 'user'
83
+ password 'password'
84
+ database 'database'
85
+
86
+ # skip_tables ['table1', 'table2', 'table3']
87
+ #
88
+ # options do
89
+ # host '123.45.678.90'
90
+ # port '80'
91
+ # socket '/tmp/socket.sock'
92
+ # end
93
+ # additional_options '--single-transaction --quick'
94
+ end
95
+
96
+ storage :s3 do
97
+ access_key_id 'access_key_id'
98
+ secret_access_key 'secret_access_key'
99
+ bucket '/bucket/backups/mysql/'
100
+ use_ssl true
101
+ end
102
+
103
+ keep_backups 25
104
+ encrypt_with_password 'password'
105
+ notify false
106
+
107
+ end
108
+
109
+ # Initialize with:
110
+ # rake backup:run trigger='mysql-backup-cloudfiles'
111
+ backup 'mysql-backup-cloudfiles' do
112
+
113
+ adapter :mysql do
114
+ user 'user'
115
+ password 'password'
116
+ database 'database'
117
+ end
118
+
119
+ storage :cloudfiles do
120
+ username 'username'
121
+ api_key 'api_key'
122
+ container 'mysql_backup'
123
+ end
124
+
125
+ encrypt_with_gpg_public_key <<-KEY
126
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
127
+ Version: GnuPG v1.4.7 (Darwin)
128
+
129
+ Your very long public key goes here
130
+ -----END PGP PUBLIC KEY BLOCK-----
131
+ KEY
132
+
133
+ end
134
+
135
+ # Initialize with:
136
+ # rake backup:run trigger='postgresql-backup-s3'
137
+ backup 'postgresql-backup-scp' do
138
+
139
+ adapter :postgresql do
140
+ user 'user'
141
+ database 'database'
142
+
143
+ # skip_tables ['table1', 'table2', 'table3']
144
+
145
+ # options do
146
+ # host '123.45.678.90'
147
+ # port '80'
148
+ # socket '/tmp/socket.sock'
149
+ # end
150
+ # additional_options '--clean --blobs'
151
+ end
152
+
153
+ storage :scp do
154
+ ip 'example.com'
155
+ user 'user'
156
+ password 'password'
157
+ path '/var/backups/postgresql/'
158
+ end
159
+
160
+ keep_backups :all
161
+ encrypt_with_password false
162
+ notify false
163
+
164
+ end
165
+
166
+
167
+ # Initialize with:
168
+ # rake backup:run trigger='archive-backup-ftp'
169
+ backup 'archive-backup-ftp' do
170
+
171
+ adapter :archive do
172
+ files ["#{RAILS_ROOT}/log", "#{RAILS_ROOT}/db"]
173
+ end
174
+
175
+ storage :ftp do
176
+ ip 'example.com'
177
+ user 'user'
178
+ password 'password'
179
+ path '/var/backups/archive/'
180
+ end
181
+
182
+ keep_backups 10
183
+ encrypt_with_password false
184
+ notify false
185
+
186
+ end
187
+
188
+
189
+ # Initialize with:
190
+ # rake backup:run trigger='custom-backup-sftp'
191
+ backup 'custom-backup-sftp' do
192
+
193
+ adapter :custom do
194
+ commands \
195
+ [ "mysqldump [options] [database] > :tmp_path/my_mysql_dump.sql",
196
+ "pg_dump [options] [database] > :tmp_path/my_postgresql_dump.sql",
197
+ "any_other_db_format [options] [database] > :tmp_path/my_any_other_db_format.sql" ]
198
+ end
199
+
200
+ storage :sftp do
201
+ ip 'example.com'
202
+ user 'user'
203
+ password 'password'
204
+ path '/var/backups/custom/'
205
+ end
206
+
207
+ keep_backups :all
208
+ encrypt_with_password 'password'
209
+ notify false
210
+
211
+ end
212
+
213
+
214
+ # Initializ with:
215
+ # rake backup:run trigger='sqlite-backup-local'
216
+ backup 'sqlite-backup-local' do
217
+
218
+ adapter :sqlite do
219
+ database "#{RAILS_ROOT}/db/production.sqlite3"
220
+ end
221
+
222
+ storage :local do
223
+ path "/path/to/storage/location/"
224
+ end
225
+
226
+ keep_backups :all
227
+ encrypt_with_password false
228
+ notify false
229
+
230
+ end
231
+
232
+
233
+ # Initialize with
234
+ # rake backup:run trigger='postgresql-backup-dropbox'
235
+ backup 'postgresql-backup-dropbox' do
236
+
237
+ adapter :postgresql do
238
+ user 'devmen'
239
+ database 'domowoi_test'
240
+ end
241
+
242
+ storage :dropbox do
243
+ api_key 'your_api_key'
244
+ secret_access_key 'your_api_secret'
245
+ username 'user@example.org'
246
+ password 'super_s3cret'
247
+ path 'backups'
248
+ end
249
+
250
+ keep_backups :all
251
+ encrypt_with_password false
252
+ notify false
253
+ end
@@ -0,0 +1,18 @@
1
+ class CreateBackupTables < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :backup do |t|
4
+ t.string :trigger
5
+ t.string :adapter
6
+ t.string :filename
7
+ t.string :md5sum
8
+ t.string :path
9
+ t.string :bucket
10
+ t.string :type
11
+ t.timestamps
12
+ end
13
+ end
14
+
15
+ def self.down
16
+ drop_table :backup
17
+ end
18
+ end
@@ -0,0 +1,50 @@
1
+ class BackupUpdateGenerator < Rails::Generator::Base
2
+
3
+ # This method gets initialized when the generator gets run.
4
+ # It will receive an array of arguments inside @args
5
+ def initialize(runtime_args, runtime_options = {})
6
+ super
7
+ end
8
+
9
+ # Processes the file generation/templating
10
+ # This will automatically be run after the initialize method
11
+ def manifest
12
+ record do |m|
13
+
14
+ # Generates the database update migration file
15
+ m.migration_template "migrations/update_backup_tables.rb",
16
+ "db/migrate",
17
+ :migration_file_name => "update_backup_tables"
18
+
19
+ # Outputs the generators message to the terminal
20
+ puts message
21
+ end
22
+ end
23
+
24
+ def message
25
+ <<-MESSAGE
26
+
27
+
28
+
29
+ ==============================================================
30
+ Backup's update files have been generated!
31
+ ==============================================================
32
+
33
+ Please follow these instructions Backup:
34
+
35
+ 1: Please migrate the database to finish the update!
36
+
37
+ rake db:migrate
38
+
39
+
40
+ For More Information:
41
+ http://github.com/meskyanichi/backup
42
+
43
+ ==============================================================
44
+
45
+
46
+
47
+ MESSAGE
48
+ end
49
+
50
+ end
@@ -0,0 +1,27 @@
1
+ class UpdateBackupTables < ActiveRecord::Migration
2
+ def self.up
3
+ change_table :backup do |t|
4
+ t.rename :storage, :type # will use STI from now
5
+ t.string :md5sum
6
+ end
7
+
8
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='Backup::Record::FTP' WHERE type='ftp'"
9
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='Backup::Record::Local' WHERE type='local'"
10
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='Backup::Record::S3' WHERE type='s3'"
11
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='Backup::Record::SCP' WHERE type='scp'"
12
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='Backup::Record::SFTP' WHERE type='sftp'"
13
+ end
14
+
15
+ def self.down
16
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='ftp' WHERE type='Backup::Record::FTP'"
17
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='local' WHERE type='Backup::Record::Local'"
18
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='s3' WHERE type='Backup::Record::S3'"
19
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='scp' WHERE type='Backup::Record::SCP'"
20
+ ActiveRecord::Base.connection.execute "UPDATE backup SET type='sftp' WHERE type='Backup::Record::SFTP'"
21
+
22
+ change_table :backup do |t|
23
+ t.rename :type, :storage
24
+ t.remove :md5sum
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,132 @@
1
+ BACKUP_SYSTEM = Proc.new do
2
+ # Load Gems
3
+ require 'hirb'
4
+
5
+ # Load Extensions
6
+ require 'backup/core_ext/object'
7
+
8
+ # Load Environments
9
+ require 'backup/environment/base'
10
+ require 'backup/environment/unix_configuration'
11
+ require 'backup/environment/rails_configuration'
12
+
13
+ # Load Configuration
14
+ require 'backup/configuration/attributes'
15
+ require 'backup/configuration/base'
16
+ require 'backup/configuration/adapter'
17
+ require 'backup/configuration/adapter_options'
18
+ require 'backup/configuration/storage'
19
+ require 'backup/configuration/mail'
20
+ require 'backup/configuration/smtp'
21
+ require 'backup/configuration/helpers'
22
+
23
+ require 'backup/command_helper'
24
+
25
+ # Include the Configuration and Environment Helpers
26
+ include Backup::Configuration::Helpers
27
+ include Backup::Environment::Base
28
+
29
+ # Load either UNIX or RAILS environment configuration
30
+ case current_environment
31
+ when :unix then include Backup::Environment::UnixConfiguration
32
+ when :rails then include Backup::Environment::RailsConfiguration
33
+ end
34
+
35
+ # Load configuration
36
+ if File.exist?(File.join(BACKUP_PATH, 'config', 'backup.rb'))
37
+ require File.join(BACKUP_PATH, 'config', 'backup.rb')
38
+ end
39
+
40
+ # Load Mail Notifier
41
+ require 'backup/mail/base'
42
+
43
+ # Set Mail Configuration (extracted from the backup.rb configuration file) inside the Mail Class
44
+ Backup::Mail::Base.setup(@mail_configuration)
45
+ end
46
+
47
+ # Backup Module
48
+ module Backup
49
+
50
+ class System
51
+ def self.boot!
52
+ BACKUP_SYSTEM.call
53
+ true
54
+ end
55
+ end
56
+
57
+ module Adapters
58
+ autoload :Base, 'backup/adapters/base'
59
+ autoload :MySQL, 'backup/adapters/mysql'
60
+ autoload :MongoDB, 'backup/adapters/mongo_db'
61
+ autoload :SQLite, 'backup/adapters/sqlite'
62
+ autoload :PostgreSQL, 'backup/adapters/postgresql'
63
+ autoload :Archive, 'backup/adapters/archive'
64
+ autoload :Custom, 'backup/adapters/custom'
65
+ end
66
+
67
+ module Storage
68
+ autoload :Base, 'backup/storage/base'
69
+ autoload :CloudFiles, 'backup/storage/cloudfiles'
70
+ autoload :S3, 'backup/storage/s3'
71
+ autoload :SCP, 'backup/storage/scp'
72
+ autoload :FTP, 'backup/storage/ftp'
73
+ autoload :SFTP, 'backup/storage/sftp'
74
+ autoload :Local, 'backup/storage/local'
75
+ autoload :Dropbox, 'backup/storage/dropbox'
76
+ end
77
+
78
+ module Record
79
+ autoload :Base, 'backup/record/base'
80
+ autoload :CloudFiles, 'backup/record/cloudfiles'
81
+ autoload :S3, 'backup/record/s3'
82
+ autoload :SCP, 'backup/record/scp'
83
+ autoload :FTP, 'backup/record/ftp'
84
+ autoload :SFTP, 'backup/record/sftp'
85
+ autoload :Local, 'backup/record/local'
86
+ autoload :Dropbox, 'backup/record/dropbox'
87
+ end
88
+
89
+ class Setup
90
+
91
+ attr_accessor :trigger, :procedures, :procedure
92
+
93
+ # Sets the Trigger and All Available Procedures.
94
+ # Will not find a specific procedure if the "trigger" argument is set to false.
95
+ def initialize(trigger, procedures)
96
+ self.trigger = trigger
97
+ self.procedures = procedures
98
+ self.procedure = find_triggered_procedure unless trigger.eql?(false)
99
+ end
100
+
101
+ # Initializes one of the few adapters and start the backup process
102
+ def initialize_adapter
103
+ case procedure.adapter_name.to_sym
104
+ when :mongo then Backup::Adapters::MongoDB.new trigger, procedure
105
+ when :mysql then Backup::Adapters::MySQL.new trigger, procedure
106
+ when :sqlite then Backup::Adapters::SQLite.new trigger, procedure
107
+ when :postgresql then Backup::Adapters::PostgreSQL.new trigger, procedure
108
+ when :archive then Backup::Adapters::Archive.new trigger, procedure
109
+ when :custom then Backup::Adapters::Custom.new trigger, procedure
110
+ else
111
+ puts "Unknown Adapter: \"#{procedure.adapter_name}\"."
112
+ exit
113
+ end
114
+ end
115
+
116
+ # Scans through all the backup settings and returns the backup setting
117
+ # that was specified in the "trigger" argument.
118
+ # If an non-existing trigger is specified, it will raise an error and display
119
+ # all the available triggers.
120
+ def find_triggered_procedure
121
+ procedures.each do |procedure|
122
+ if procedure.trigger.eql?(trigger)
123
+ return procedure
124
+ end
125
+ end
126
+ available_triggers = procedures.map {|procedure| "- #{procedure.trigger}\n" }
127
+ puts "Could not find a backup procedure with the trigger \"#{trigger}\". \nHere's a list of available triggers:\n#{available_triggers}"
128
+ exit
129
+ end
130
+
131
+ end
132
+ end