backup 3.0.2 → 3.0.3.build.0
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.
- data/bin/backup +12 -190
- metadata +7 -191
- data/.gitignore +0 -2
- data/.infinity_test +0 -7
- data/.rspec +0 -3
- data/Gemfile +0 -17
- data/Gemfile.lock +0 -88
- data/LICENSE.md +0 -24
- data/README.md +0 -236
- data/backup.gemspec +0 -41
- data/lib/backup.rb +0 -148
- data/lib/backup/archive.rb +0 -54
- data/lib/backup/cli.rb +0 -50
- data/lib/backup/compressor/base.rb +0 -17
- data/lib/backup/compressor/gzip.rb +0 -61
- data/lib/backup/configuration/base.rb +0 -15
- data/lib/backup/configuration/compressor/base.rb +0 -10
- data/lib/backup/configuration/compressor/gzip.rb +0 -23
- data/lib/backup/configuration/database/base.rb +0 -18
- data/lib/backup/configuration/database/mongodb.rb +0 -37
- data/lib/backup/configuration/database/mysql.rb +0 -37
- data/lib/backup/configuration/database/postgresql.rb +0 -37
- data/lib/backup/configuration/database/redis.rb +0 -35
- data/lib/backup/configuration/encryptor/base.rb +0 -10
- data/lib/backup/configuration/encryptor/gpg.rb +0 -17
- data/lib/backup/configuration/encryptor/open_ssl.rb +0 -26
- data/lib/backup/configuration/helpers.rb +0 -54
- data/lib/backup/configuration/notifier/base.rb +0 -39
- data/lib/backup/configuration/notifier/mail.rb +0 -52
- data/lib/backup/configuration/storage/base.rb +0 -18
- data/lib/backup/configuration/storage/cloudfiles.rb +0 -21
- data/lib/backup/configuration/storage/dropbox.rb +0 -25
- data/lib/backup/configuration/storage/ftp.rb +0 -25
- data/lib/backup/configuration/storage/rsync.rb +0 -25
- data/lib/backup/configuration/storage/s3.rb +0 -25
- data/lib/backup/configuration/storage/scp.rb +0 -25
- data/lib/backup/configuration/storage/sftp.rb +0 -25
- data/lib/backup/database/base.rb +0 -33
- data/lib/backup/database/mongodb.rb +0 -137
- data/lib/backup/database/mysql.rb +0 -104
- data/lib/backup/database/postgresql.rb +0 -111
- data/lib/backup/database/redis.rb +0 -105
- data/lib/backup/encryptor/base.rb +0 -17
- data/lib/backup/encryptor/gpg.rb +0 -78
- data/lib/backup/encryptor/open_ssl.rb +0 -67
- data/lib/backup/finder.rb +0 -39
- data/lib/backup/logger.rb +0 -80
- data/lib/backup/model.rb +0 -249
- data/lib/backup/notifier/base.rb +0 -29
- data/lib/backup/notifier/binder.rb +0 -32
- data/lib/backup/notifier/mail.rb +0 -141
- data/lib/backup/notifier/templates/notify_failure.erb +0 -31
- data/lib/backup/notifier/templates/notify_success.erb +0 -16
- data/lib/backup/storage/base.rb +0 -67
- data/lib/backup/storage/cloudfiles.rb +0 -95
- data/lib/backup/storage/dropbox.rb +0 -82
- data/lib/backup/storage/ftp.rb +0 -114
- data/lib/backup/storage/object.rb +0 -45
- data/lib/backup/storage/rsync.rb +0 -100
- data/lib/backup/storage/s3.rb +0 -108
- data/lib/backup/storage/scp.rb +0 -105
- data/lib/backup/storage/sftp.rb +0 -106
- data/lib/backup/version.rb +0 -72
- data/lib/templates/archive +0 -4
- data/lib/templates/compressor/gzip +0 -4
- data/lib/templates/database/mongodb +0 -10
- data/lib/templates/database/mysql +0 -11
- data/lib/templates/database/postgresql +0 -11
- data/lib/templates/database/redis +0 -10
- data/lib/templates/encryptor/gpg +0 -9
- data/lib/templates/encryptor/openssl +0 -5
- data/lib/templates/notifier/mail +0 -14
- data/lib/templates/readme +0 -15
- data/lib/templates/storage/cloudfiles +0 -7
- data/lib/templates/storage/dropbox +0 -8
- data/lib/templates/storage/ftp +0 -8
- data/lib/templates/storage/rsync +0 -7
- data/lib/templates/storage/s3 +0 -8
- data/lib/templates/storage/scp +0 -8
- data/lib/templates/storage/sftp +0 -8
- data/spec/archive_spec.rb +0 -53
- data/spec/backup_spec.rb +0 -11
- data/spec/compressor/gzip_spec.rb +0 -59
- data/spec/configuration/base_spec.rb +0 -35
- data/spec/configuration/compressor/gzip_spec.rb +0 -28
- data/spec/configuration/database/base_spec.rb +0 -16
- data/spec/configuration/database/mongodb_spec.rb +0 -30
- data/spec/configuration/database/mysql_spec.rb +0 -32
- data/spec/configuration/database/postgresql_spec.rb +0 -32
- data/spec/configuration/database/redis_spec.rb +0 -30
- data/spec/configuration/encryptor/gpg_spec.rb +0 -25
- data/spec/configuration/encryptor/open_ssl_spec.rb +0 -31
- data/spec/configuration/notifier/mail_spec.rb +0 -32
- data/spec/configuration/storage/cloudfiles_spec.rb +0 -34
- data/spec/configuration/storage/dropbox_spec.rb +0 -40
- data/spec/configuration/storage/ftp_spec.rb +0 -40
- data/spec/configuration/storage/rsync_spec.rb +0 -37
- data/spec/configuration/storage/s3_spec.rb +0 -37
- data/spec/configuration/storage/scp_spec.rb +0 -40
- data/spec/configuration/storage/sftp_spec.rb +0 -40
- data/spec/database/base_spec.rb +0 -30
- data/spec/database/mongodb_spec.rb +0 -144
- data/spec/database/mysql_spec.rb +0 -150
- data/spec/database/postgresql_spec.rb +0 -164
- data/spec/database/redis_spec.rb +0 -122
- data/spec/encryptor/gpg_spec.rb +0 -57
- data/spec/encryptor/open_ssl_spec.rb +0 -102
- data/spec/logger_spec.rb +0 -37
- data/spec/model_spec.rb +0 -236
- data/spec/notifier/mail_spec.rb +0 -97
- data/spec/spec_helper.rb +0 -21
- data/spec/storage/base_spec.rb +0 -33
- data/spec/storage/cloudfiles_spec.rb +0 -102
- data/spec/storage/dropbox_spec.rb +0 -89
- data/spec/storage/ftp_spec.rb +0 -133
- data/spec/storage/object_spec.rb +0 -74
- data/spec/storage/rsync_spec.rb +0 -115
- data/spec/storage/s3_spec.rb +0 -110
- data/spec/storage/scp_spec.rb +0 -129
- data/spec/storage/sftp_spec.rb +0 -125
- data/spec/version_spec.rb +0 -32
|
@@ -1,104 +0,0 @@
|
|
|
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
|
|
@@ -1,111 +0,0 @@
|
|
|
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
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Database
|
|
5
|
-
class Redis < Base
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
# Name of and path to the database that needs to get dumped
|
|
9
|
-
attr_accessor :name, :path
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
# Credentials for the specified database
|
|
13
|
-
attr_accessor :password
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
# Determines whether Backup should invoke the SAVE command through
|
|
17
|
-
# the 'redis-cli' utility to persist the most recent data before
|
|
18
|
-
# copying over the dump file
|
|
19
|
-
attr_accessor :invoke_save
|
|
20
|
-
|
|
21
|
-
##
|
|
22
|
-
# Connectivity options
|
|
23
|
-
attr_accessor :host, :port, :socket
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
# Additional "redis-cli" options
|
|
27
|
-
attr_accessor :additional_options
|
|
28
|
-
|
|
29
|
-
##
|
|
30
|
-
# Creates a new instance of the Redis database object
|
|
31
|
-
def initialize(&block)
|
|
32
|
-
load_defaults!
|
|
33
|
-
|
|
34
|
-
@additional_options ||= Array.new
|
|
35
|
-
|
|
36
|
-
instance_eval(&block)
|
|
37
|
-
prepare!
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
##
|
|
41
|
-
# Builds the Redis credentials syntax to authenticate the user
|
|
42
|
-
# to perform the database dumping process
|
|
43
|
-
def credential_options
|
|
44
|
-
return "-a '#{password}'" if password; String.new
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
##
|
|
48
|
-
# Builds the Redis connectivity options syntax to connect the user
|
|
49
|
-
# to perform the database dumping process
|
|
50
|
-
def connectivity_options
|
|
51
|
-
%w[host port socket].map do |option|
|
|
52
|
-
next if send(option).nil?; "-#{option[0,1]} '#{send(option)}'"
|
|
53
|
-
end.compact.join("\s")
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
##
|
|
57
|
-
# Builds a Redis compatible string for the
|
|
58
|
-
# additional options specified by the user
|
|
59
|
-
def additional_options
|
|
60
|
-
@additional_options.join("\s")
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
##
|
|
64
|
-
# Returns the Redis database file name
|
|
65
|
-
def database
|
|
66
|
-
"#{ name }.rdb"
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
##
|
|
70
|
-
# Performs the Redis backup by using the 'cp' unix utility
|
|
71
|
-
# to copy the persisted Redis dump file to the Backup archive.
|
|
72
|
-
# Additionally, when 'invoke_save' is set to true, it'll tell
|
|
73
|
-
# the Redis server to persist the current state to the dump file
|
|
74
|
-
# before copying the dump to get the most recent updates in to the backup
|
|
75
|
-
def perform!
|
|
76
|
-
log!
|
|
77
|
-
|
|
78
|
-
invoke_save! if invoke_save
|
|
79
|
-
copy!
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
##
|
|
83
|
-
# Tells Redis to persist the current state of the
|
|
84
|
-
# in-memory database to the persisted dump file
|
|
85
|
-
def invoke_save!
|
|
86
|
-
response = run("#{ utility('redis-cli') } #{ credential_options } #{ connectivity_options } #{ additional_options } SAVE")
|
|
87
|
-
unless response =~ /OK/
|
|
88
|
-
Logger.error "Could not invoke the Redis SAVE command. The #{ database } file might not be contain the most recent data."
|
|
89
|
-
Logger.error "Please check if the server is running, the credentials (if any) are correct, and the host/port/socket are correct."
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
##
|
|
94
|
-
# Performs the copy command to copy over the Redis dump file to the Backup archive
|
|
95
|
-
def copy!
|
|
96
|
-
unless File.exist?(File.join(path, database))
|
|
97
|
-
Logger.error "Redis database dump not found in '#{ File.join(path, database) }'"
|
|
98
|
-
exit
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
run("#{ utility(:cp) } '#{ File.join(path, database) }' '#{ File.join(dump_path, database) }'")
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Encryptor
|
|
5
|
-
class Base
|
|
6
|
-
include Backup::CLI
|
|
7
|
-
include Backup::Configuration::Helpers
|
|
8
|
-
|
|
9
|
-
##
|
|
10
|
-
# Logs a message to the console and log file to inform
|
|
11
|
-
# the client that Backup is encrypting the archive
|
|
12
|
-
def log!
|
|
13
|
-
Logger.message "#{ self.class } started encrypting the archive."
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
data/lib/backup/encryptor/gpg.rb
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
# Require the tempfile Ruby library when Backup::Encryptor::GPG is loaded
|
|
5
|
-
require 'tempfile'
|
|
6
|
-
|
|
7
|
-
module Backup
|
|
8
|
-
module Encryptor
|
|
9
|
-
class GPG < Base
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
# The GPG Public key that'll be used to encrypt the backup
|
|
13
|
-
attr_accessor :key
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
# Contains the GPG encryption key id which'll be extracted from the public key file
|
|
17
|
-
attr_accessor :encryption_key_id
|
|
18
|
-
|
|
19
|
-
##
|
|
20
|
-
# Contains the temporary file with the public key
|
|
21
|
-
attr_accessor :tmp_file
|
|
22
|
-
|
|
23
|
-
##
|
|
24
|
-
# Creates a new instance of Backup::Encryptor::GPG and
|
|
25
|
-
# sets the key to the provided GPG key. To enhance the DSL
|
|
26
|
-
# the user may use tabs and spaces to indent the multi-line key string
|
|
27
|
-
# since we gsub() every preceding 'space' and 'tab' on each line
|
|
28
|
-
def initialize(&block)
|
|
29
|
-
load_defaults!
|
|
30
|
-
|
|
31
|
-
instance_eval(&block) if block_given?
|
|
32
|
-
|
|
33
|
-
@key = key.gsub(/^(\s|\t)+/, '')
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
##
|
|
37
|
-
# Performs the encrypting of the backup file and will
|
|
38
|
-
# remove the unencrypted backup file, as well as the temp file
|
|
39
|
-
def perform!
|
|
40
|
-
log!
|
|
41
|
-
write_tmp_file!
|
|
42
|
-
extract_encryption_key_id!
|
|
43
|
-
|
|
44
|
-
run("#{ utility(:gpg) } #{ options } -o '#{ Backup::Model.file }.gpg' '#{ Backup::Model.file }'")
|
|
45
|
-
|
|
46
|
-
rm(Backup::Model.file)
|
|
47
|
-
tmp_file.unlink
|
|
48
|
-
|
|
49
|
-
Backup::Model.extension += '.gpg'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
private
|
|
53
|
-
|
|
54
|
-
##
|
|
55
|
-
# GPG options
|
|
56
|
-
# Sets the gpg mode to 'encrypt' and passes in the encryption_key_id
|
|
57
|
-
def options
|
|
58
|
-
"-e --trust-model always -r '#{ encryption_key_id }'"
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
##
|
|
62
|
-
# Creates a new temp file and writes the provided public gpg key to it
|
|
63
|
-
def write_tmp_file!
|
|
64
|
-
@tmp_file = Tempfile.new('backup.pub')
|
|
65
|
-
@tmp_file.write(key)
|
|
66
|
-
@tmp_file.close
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
##
|
|
70
|
-
# Extracts the 'encryption key id' from the '@tmp_file'
|
|
71
|
-
# and stores it in '@encryption_key_id'
|
|
72
|
-
def extract_encryption_key_id!
|
|
73
|
-
@encryption_key_id = run("#{ utility(:gpg) } --import '#{tmp_file.path}' 2>&1").match(/<(.+)>/)[1]
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Backup
|
|
4
|
-
module Encryptor
|
|
5
|
-
class OpenSSL < Base
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
# The password that'll be used to encrypt the backup. This
|
|
9
|
-
# password will be required to decrypt the backup later on.
|
|
10
|
-
attr_accessor :password
|
|
11
|
-
|
|
12
|
-
##
|
|
13
|
-
# Determines whether the 'base64' should be used or not
|
|
14
|
-
attr_writer :base64
|
|
15
|
-
|
|
16
|
-
##
|
|
17
|
-
# Determines whether the 'salt' flag should be used
|
|
18
|
-
attr_writer :salt
|
|
19
|
-
|
|
20
|
-
##
|
|
21
|
-
# Creates a new instance of Backup::Encryptor::OpenSSL and
|
|
22
|
-
# sets the password attribute to what was provided
|
|
23
|
-
def initialize(&block)
|
|
24
|
-
load_defaults!
|
|
25
|
-
|
|
26
|
-
@base64 ||= false
|
|
27
|
-
@salt ||= false
|
|
28
|
-
|
|
29
|
-
instance_eval(&block) if block_given?
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
##
|
|
33
|
-
# Performs the encryption of the backup file
|
|
34
|
-
def perform!
|
|
35
|
-
log!
|
|
36
|
-
run("#{ utility(:openssl) } #{ options } -in '#{ Backup::Model.file }' -out '#{ Backup::Model.file }.enc' -k '#{ password }'")
|
|
37
|
-
rm(Backup::Model.file)
|
|
38
|
-
Backup::Model.extension += '.enc'
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
##
|
|
44
|
-
# Backup::Encryptor::OpenSSL uses the 256bit AES encryption cipher.
|
|
45
|
-
# 256bit AES is what the US Government uses to encrypt information at the "Top Secret" level.
|
|
46
|
-
def options
|
|
47
|
-
(['aes-256-cbc'] + base64 + salt).join("\s")
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
##
|
|
51
|
-
# Returns '-a' if @base64 is set to 'true'.
|
|
52
|
-
# This option will make the encrypted output base64 encoded,
|
|
53
|
-
# this makes the encrypted file readable using text editors
|
|
54
|
-
def base64
|
|
55
|
-
return ['-base64'] if @base64; []
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
##
|
|
59
|
-
# Returns '-salt' if @salt is set to 'true'.
|
|
60
|
-
# This options adds strength to the encryption
|
|
61
|
-
def salt
|
|
62
|
-
return ['-salt'] if @salt; []
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|