alg-backup 3.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. data/.gitignore +2 -0
  2. data/.infinity_test +7 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +25 -0
  5. data/Gemfile.lock +101 -0
  6. data/LICENSE.md +24 -0
  7. data/README.md +276 -0
  8. data/backup.gemspec +39 -0
  9. data/bin/backup +260 -0
  10. data/lib/backup.rb +168 -0
  11. data/lib/backup/archive.rb +73 -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/notifier/twitter.rb +21 -0
  30. data/lib/backup/configuration/storage/base.rb +18 -0
  31. data/lib/backup/configuration/storage/cloudfiles.rb +21 -0
  32. data/lib/backup/configuration/storage/dropbox.rb +29 -0
  33. data/lib/backup/configuration/storage/ftp.rb +25 -0
  34. data/lib/backup/configuration/storage/rsync.rb +25 -0
  35. data/lib/backup/configuration/storage/s3.rb +25 -0
  36. data/lib/backup/configuration/storage/scp.rb +25 -0
  37. data/lib/backup/configuration/storage/sftp.rb +25 -0
  38. data/lib/backup/configuration/syncer/rsync.rb +45 -0
  39. data/lib/backup/configuration/syncer/s3.rb +33 -0
  40. data/lib/backup/database/base.rb +33 -0
  41. data/lib/backup/database/mongodb.rb +137 -0
  42. data/lib/backup/database/mysql.rb +104 -0
  43. data/lib/backup/database/postgresql.rb +111 -0
  44. data/lib/backup/database/redis.rb +105 -0
  45. data/lib/backup/dependency.rb +84 -0
  46. data/lib/backup/encryptor/base.rb +17 -0
  47. data/lib/backup/encryptor/gpg.rb +78 -0
  48. data/lib/backup/encryptor/open_ssl.rb +67 -0
  49. data/lib/backup/finder.rb +39 -0
  50. data/lib/backup/logger.rb +86 -0
  51. data/lib/backup/model.rb +272 -0
  52. data/lib/backup/notifier/base.rb +29 -0
  53. data/lib/backup/notifier/binder.rb +32 -0
  54. data/lib/backup/notifier/mail.rb +141 -0
  55. data/lib/backup/notifier/templates/notify_failure.erb +31 -0
  56. data/lib/backup/notifier/templates/notify_success.erb +16 -0
  57. data/lib/backup/notifier/twitter.rb +87 -0
  58. data/lib/backup/storage/base.rb +67 -0
  59. data/lib/backup/storage/cloudfiles.rb +95 -0
  60. data/lib/backup/storage/dropbox.rb +87 -0
  61. data/lib/backup/storage/ftp.rb +114 -0
  62. data/lib/backup/storage/object.rb +45 -0
  63. data/lib/backup/storage/rsync.rb +99 -0
  64. data/lib/backup/storage/s3.rb +108 -0
  65. data/lib/backup/storage/scp.rb +106 -0
  66. data/lib/backup/storage/sftp.rb +106 -0
  67. data/lib/backup/syncer/base.rb +10 -0
  68. data/lib/backup/syncer/rsync.rb +117 -0
  69. data/lib/backup/syncer/s3.rb +116 -0
  70. data/lib/backup/version.rb +43 -0
  71. data/lib/templates/archive +4 -0
  72. data/lib/templates/compressor/gzip +4 -0
  73. data/lib/templates/database/mongodb +10 -0
  74. data/lib/templates/database/mysql +11 -0
  75. data/lib/templates/database/postgresql +11 -0
  76. data/lib/templates/database/redis +10 -0
  77. data/lib/templates/encryptor/gpg +9 -0
  78. data/lib/templates/encryptor/openssl +5 -0
  79. data/lib/templates/notifier/mail +14 -0
  80. data/lib/templates/notifier/twitter +9 -0
  81. data/lib/templates/readme +15 -0
  82. data/lib/templates/storage/cloudfiles +7 -0
  83. data/lib/templates/storage/dropbox +9 -0
  84. data/lib/templates/storage/ftp +8 -0
  85. data/lib/templates/storage/rsync +7 -0
  86. data/lib/templates/storage/s3 +8 -0
  87. data/lib/templates/storage/scp +8 -0
  88. data/lib/templates/storage/sftp +8 -0
  89. data/lib/templates/syncer/rsync +14 -0
  90. data/lib/templates/syncer/s3 +12 -0
  91. data/spec/archive_spec.rb +90 -0
  92. data/spec/backup_spec.rb +11 -0
  93. data/spec/compressor/gzip_spec.rb +59 -0
  94. data/spec/configuration/base_spec.rb +35 -0
  95. data/spec/configuration/compressor/gzip_spec.rb +28 -0
  96. data/spec/configuration/database/base_spec.rb +16 -0
  97. data/spec/configuration/database/mongodb_spec.rb +30 -0
  98. data/spec/configuration/database/mysql_spec.rb +32 -0
  99. data/spec/configuration/database/postgresql_spec.rb +32 -0
  100. data/spec/configuration/database/redis_spec.rb +30 -0
  101. data/spec/configuration/encryptor/gpg_spec.rb +25 -0
  102. data/spec/configuration/encryptor/open_ssl_spec.rb +31 -0
  103. data/spec/configuration/notifier/mail_spec.rb +32 -0
  104. data/spec/configuration/storage/cloudfiles_spec.rb +34 -0
  105. data/spec/configuration/storage/dropbox_spec.rb +43 -0
  106. data/spec/configuration/storage/ftp_spec.rb +40 -0
  107. data/spec/configuration/storage/rsync_spec.rb +37 -0
  108. data/spec/configuration/storage/s3_spec.rb +37 -0
  109. data/spec/configuration/storage/scp_spec.rb +40 -0
  110. data/spec/configuration/storage/sftp_spec.rb +40 -0
  111. data/spec/configuration/syncer/rsync_spec.rb +46 -0
  112. data/spec/configuration/syncer/s3_spec.rb +43 -0
  113. data/spec/database/base_spec.rb +30 -0
  114. data/spec/database/mongodb_spec.rb +144 -0
  115. data/spec/database/mysql_spec.rb +150 -0
  116. data/spec/database/postgresql_spec.rb +164 -0
  117. data/spec/database/redis_spec.rb +122 -0
  118. data/spec/encryptor/gpg_spec.rb +57 -0
  119. data/spec/encryptor/open_ssl_spec.rb +102 -0
  120. data/spec/logger_spec.rb +46 -0
  121. data/spec/model_spec.rb +236 -0
  122. data/spec/notifier/mail_spec.rb +97 -0
  123. data/spec/notifier/twitter_spec.rb +86 -0
  124. data/spec/spec_helper.rb +21 -0
  125. data/spec/storage/base_spec.rb +33 -0
  126. data/spec/storage/cloudfiles_spec.rb +102 -0
  127. data/spec/storage/dropbox_spec.rb +105 -0
  128. data/spec/storage/ftp_spec.rb +133 -0
  129. data/spec/storage/object_spec.rb +74 -0
  130. data/spec/storage/rsync_spec.rb +115 -0
  131. data/spec/storage/s3_spec.rb +110 -0
  132. data/spec/storage/scp_spec.rb +129 -0
  133. data/spec/storage/sftp_spec.rb +125 -0
  134. data/spec/syncer/rsync_spec.rb +156 -0
  135. data/spec/syncer/s3_spec.rb +139 -0
  136. data/spec/version_spec.rb +21 -0
  137. metadata +217 -0
@@ -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
@@ -0,0 +1,105 @@
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
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+
5
+ ##
6
+ # A little self-contained gem manager for Backup.
7
+ # Rather than specifying hard dependencies in the gemspec, forcing users
8
+ # to install gems they do not want/need, Backup will notify them when a gem
9
+ # has not been installed, or when the gem's version is incorrect, and provide the
10
+ # command to install the gem. These dependencies are dynamically loaded in the Gemfile
11
+ class Dependency
12
+ extend Backup::CLI
13
+
14
+ ##
15
+ # Returns a hash of dependencies that Backup requires
16
+ # in order to run every available feature
17
+ def self.all
18
+ {
19
+ 'fog' => {
20
+ :require => 'fog',
21
+ :version => '~> 0.7.0',
22
+ :for => 'Amazon S3, Rackspace Cloud Files (S3, CloudFiles Storages)'
23
+ },
24
+
25
+ 'dropbox' => {
26
+ :require => 'dropbox',
27
+ :version => '~> 1.2.3',
28
+ :for => 'Dropbox Web Service (Dropbox Storage)'
29
+ },
30
+
31
+ 'net-sftp' => {
32
+ :require => 'net/sftp',
33
+ :version => '~> 2.0.5',
34
+ :for => 'SFTP Protocol (SFTP Storage)'
35
+ },
36
+
37
+ 'net-scp' => {
38
+ :require => 'net/scp',
39
+ :version => '~> 1.0.4',
40
+ :for => 'SCP Protocol (SCP Storage)'
41
+ },
42
+
43
+ 'net-ssh' => {
44
+ :require => 'net/ssh',
45
+ :version => '~> 2.1.3',
46
+ :for => 'SSH Protocol (SSH Storage)'
47
+ },
48
+
49
+ 'mail' => {
50
+ :require => 'mail',
51
+ :version => '~> 2.2.15',
52
+ :for => 'Sending Emails (Mail Notifier)'
53
+ },
54
+
55
+ 'twitter' => {
56
+ :require => 'twitter',
57
+ :version => '~> 1.1.2',
58
+ :for => 'Send Twitter Updates (Twitter Notifier)'
59
+ }
60
+ }
61
+ end
62
+
63
+ ##
64
+ # Attempts to load the specified gem (by name and version).
65
+ # If the gem with the correct version cannot be found, it'll display a message
66
+ # to the user with instructions on how to install the required gem
67
+ def self.load(name)
68
+ begin
69
+ gem(name, all[name][:version])
70
+ require(all[name][:require])
71
+ rescue LoadError
72
+ Backup::Logger.error("Dependency missing. Please install #{name} version #{all[name][:version]} and try again.")
73
+ puts "\n\s\sgem install #{name} -v '#{all[name][:version]}'\n\n"
74
+ puts "Dependency required for:"
75
+ puts "\n\s\s#{all[name][:for]}"
76
+ puts "\nTrying to install the #{name} gem for you.. please wait."
77
+ puts "Once installed, retry the backup procedure.\n\n"
78
+ puts run("#{ utility(:gem) } install #{name} -v '#{all[name][:version]}'")
79
+ exit
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,17 @@
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
@@ -0,0 +1,78 @@
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