namxam-backup 2.4.5

Sign up to get free protection for your applications and to get access to all the features.
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