backup 4.4.1 → 5.0.0.beta.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.
- checksums.yaml +4 -4
- data/LICENSE +19 -0
- data/README.md +13 -9
- data/bin/docker_test +24 -0
- data/lib/backup/archive.rb +31 -32
- data/lib/backup/binder.rb +2 -6
- data/lib/backup/cleaner.rb +14 -18
- data/lib/backup/cli.rb +104 -108
- data/lib/backup/cloud_io/base.rb +4 -7
- data/lib/backup/cloud_io/cloud_files.rb +60 -62
- data/lib/backup/cloud_io/s3.rb +69 -76
- data/lib/backup/compressor/base.rb +4 -7
- data/lib/backup/compressor/bzip2.rb +3 -7
- data/lib/backup/compressor/custom.rb +2 -6
- data/lib/backup/compressor/gzip.rb +16 -17
- data/lib/backup/config/dsl.rb +16 -17
- data/lib/backup/config/helpers.rb +10 -16
- data/lib/backup/config.rb +17 -18
- data/lib/backup/database/base.rb +22 -21
- data/lib/backup/database/mongodb.rb +36 -37
- data/lib/backup/database/mysql.rb +40 -41
- data/lib/backup/database/openldap.rb +8 -10
- data/lib/backup/database/postgresql.rb +29 -30
- data/lib/backup/database/redis.rb +27 -30
- data/lib/backup/database/riak.rb +15 -18
- data/lib/backup/database/sqlite.rb +4 -6
- data/lib/backup/encryptor/base.rb +2 -4
- data/lib/backup/encryptor/gpg.rb +49 -59
- data/lib/backup/encryptor/open_ssl.rb +11 -14
- data/lib/backup/errors.rb +7 -12
- data/lib/backup/logger/console.rb +5 -8
- data/lib/backup/logger/fog_adapter.rb +2 -6
- data/lib/backup/logger/logfile.rb +10 -12
- data/lib/backup/logger/syslog.rb +2 -4
- data/lib/backup/logger.rb +16 -18
- data/lib/backup/model.rb +33 -40
- data/lib/backup/notifier/base.rb +24 -26
- data/lib/backup/notifier/campfire.rb +9 -11
- data/lib/backup/notifier/command.rb +0 -3
- data/lib/backup/notifier/datadog.rb +9 -12
- data/lib/backup/notifier/flowdock.rb +13 -17
- data/lib/backup/notifier/hipchat.rb +11 -13
- data/lib/backup/notifier/http_post.rb +11 -14
- data/lib/backup/notifier/mail.rb +42 -59
- data/lib/backup/notifier/nagios.rb +5 -9
- data/lib/backup/notifier/pagerduty.rb +10 -12
- data/lib/backup/notifier/prowl.rb +15 -15
- data/lib/backup/notifier/pushover.rb +7 -10
- data/lib/backup/notifier/ses.rb +34 -16
- data/lib/backup/notifier/slack.rb +39 -40
- data/lib/backup/notifier/twitter.rb +2 -5
- data/lib/backup/notifier/zabbix.rb +11 -14
- data/lib/backup/package.rb +5 -9
- data/lib/backup/packager.rb +16 -17
- data/lib/backup/pipeline.rb +17 -21
- data/lib/backup/splitter.rb +8 -11
- data/lib/backup/storage/base.rb +5 -8
- data/lib/backup/storage/cloud_files.rb +21 -23
- data/lib/backup/storage/cycler.rb +10 -15
- data/lib/backup/storage/dropbox.rb +15 -21
- data/lib/backup/storage/ftp.rb +14 -10
- data/lib/backup/storage/local.rb +5 -8
- data/lib/backup/storage/qiniu.rb +8 -8
- data/lib/backup/storage/rsync.rb +24 -26
- data/lib/backup/storage/s3.rb +27 -28
- data/lib/backup/storage/scp.rb +10 -12
- data/lib/backup/storage/sftp.rb +10 -12
- data/lib/backup/syncer/base.rb +5 -8
- data/lib/backup/syncer/cloud/base.rb +27 -30
- data/lib/backup/syncer/cloud/cloud_files.rb +16 -18
- data/lib/backup/syncer/cloud/local_file.rb +5 -8
- data/lib/backup/syncer/cloud/s3.rb +23 -24
- data/lib/backup/syncer/rsync/base.rb +6 -10
- data/lib/backup/syncer/rsync/local.rb +1 -5
- data/lib/backup/syncer/rsync/pull.rb +6 -10
- data/lib/backup/syncer/rsync/push.rb +18 -22
- data/lib/backup/template.rb +9 -14
- data/lib/backup/utilities.rb +78 -69
- data/lib/backup/version.rb +1 -3
- data/lib/backup.rb +74 -78
- metadata +107 -676
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Database
|
5
3
|
class MySQL < Base
|
@@ -78,71 +76,73 @@ module Backup
|
|
78
76
|
super
|
79
77
|
|
80
78
|
pipeline = Pipeline.new
|
81
|
-
dump_ext = sql_backup? ?
|
79
|
+
dump_ext = sql_backup? ? "sql" : "tar"
|
82
80
|
|
83
81
|
pipeline << sudo_option(sql_backup? ? mysqldump : innobackupex)
|
84
82
|
|
85
|
-
model.compressor
|
86
|
-
|
87
|
-
|
88
|
-
|
83
|
+
if model.compressor
|
84
|
+
model.compressor.compress_with do |command, ext|
|
85
|
+
pipeline << command
|
86
|
+
dump_ext << ext
|
87
|
+
end
|
88
|
+
end
|
89
89
|
|
90
|
-
pipeline << "#{
|
91
|
-
|
90
|
+
pipeline << "#{utility(:cat)} > " \
|
91
|
+
"'#{File.join(dump_path, dump_filename)}.#{dump_ext}'"
|
92
92
|
|
93
93
|
pipeline.run
|
94
94
|
if pipeline.success?
|
95
95
|
log!(:finished)
|
96
96
|
else
|
97
|
-
raise Error, "Dump Failed!\n
|
97
|
+
raise Error, "Dump Failed!\n#{pipeline.error_messages}"
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
101
|
private
|
102
102
|
|
103
103
|
def mysqldump
|
104
|
-
"#{
|
105
|
-
|
106
|
-
|
104
|
+
"#{utility(:mysqldump)} #{user_options} #{credential_options} " \
|
105
|
+
"#{connectivity_options} #{name_option} " \
|
106
|
+
"#{tables_to_dump} #{tables_to_skip}"
|
107
107
|
end
|
108
108
|
|
109
109
|
def credential_options
|
110
110
|
opts = []
|
111
|
-
opts << "--user=#{
|
112
|
-
opts << "--password=#{
|
113
|
-
opts.join(
|
111
|
+
opts << "--user=#{Shellwords.escape(username)}" if username
|
112
|
+
opts << "--password=#{Shellwords.escape(password)}" if password
|
113
|
+
opts.join(" ")
|
114
114
|
end
|
115
115
|
|
116
116
|
def connectivity_options
|
117
|
-
return "--socket='#{
|
117
|
+
return "--socket='#{socket}'" if socket
|
118
118
|
|
119
119
|
opts = []
|
120
|
-
opts << "--host='#{
|
121
|
-
opts << "--port='#{
|
122
|
-
opts.join(
|
120
|
+
opts << "--host='#{host}'" if host
|
121
|
+
opts << "--port='#{port}'" if port
|
122
|
+
opts.join(" ")
|
123
123
|
end
|
124
124
|
|
125
125
|
def user_options
|
126
|
-
Array(additional_options).join(
|
126
|
+
Array(additional_options).join(" ")
|
127
127
|
end
|
128
128
|
|
129
129
|
def user_prepare_options
|
130
|
-
Array(prepare_options).join(
|
130
|
+
Array(prepare_options).join(" ")
|
131
131
|
end
|
132
132
|
|
133
133
|
def name_option
|
134
|
-
dump_all? ?
|
134
|
+
dump_all? ? "--all-databases" : name
|
135
135
|
end
|
136
136
|
|
137
137
|
def tables_to_dump
|
138
|
-
Array(only_tables).join(
|
138
|
+
Array(only_tables).join(" ") unless dump_all?
|
139
139
|
end
|
140
140
|
|
141
141
|
def tables_to_skip
|
142
142
|
Array(skip_tables).map do |table|
|
143
|
-
table =
|
144
|
-
"--ignore-table='#{
|
145
|
-
end.join(
|
143
|
+
table = dump_all? || table["."] ? table : "#{name}.#{table}"
|
144
|
+
"--ignore-table='#{table}'"
|
145
|
+
end.join(" ")
|
146
146
|
end
|
147
147
|
|
148
148
|
def dump_all?
|
@@ -155,28 +155,28 @@ module Backup
|
|
155
155
|
|
156
156
|
def innobackupex
|
157
157
|
# Creation phase
|
158
|
-
"#{
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
158
|
+
"#{utility(:innobackupex)} #{credential_options} " \
|
159
|
+
"#{connectivity_options} #{user_options} " \
|
160
|
+
"--no-timestamp #{temp_dir} #{quiet_option} && " +
|
161
|
+
innobackupex_prepare +
|
162
|
+
# Move files to tar-ed stream on stdout
|
163
|
+
"#{utility(:tar)} --remove-files -cf - " \
|
164
|
+
"-C #{File.dirname(temp_dir)} #{File.basename(temp_dir)}"
|
165
165
|
end
|
166
166
|
|
167
167
|
def innobackupex_prepare
|
168
168
|
return "" unless @prepare_backup
|
169
169
|
# Log applying phase (prepare for restore)
|
170
|
-
"#{
|
171
|
-
|
170
|
+
"#{utility(:innobackupex)} --apply-log #{temp_dir} " \
|
171
|
+
"#{user_prepare_options} #{quiet_option} && "
|
172
172
|
end
|
173
173
|
|
174
174
|
def sudo_option(command_block)
|
175
175
|
return command_block unless sudo_user
|
176
176
|
|
177
|
-
"sudo -s -u #{
|
178
|
-
|
179
|
-
|
177
|
+
"sudo -s -u #{sudo_user} -- <<END_OF_SUDO\n" \
|
178
|
+
"#{command_block}\n" \
|
179
|
+
"END_OF_SUDO\n"
|
180
180
|
end
|
181
181
|
|
182
182
|
def quiet_option
|
@@ -184,9 +184,8 @@ module Backup
|
|
184
184
|
end
|
185
185
|
|
186
186
|
def temp_dir
|
187
|
-
File.join(dump_path, dump_filename
|
187
|
+
File.join(dump_path, "#{dump_filename}.bkpdir")
|
188
188
|
end
|
189
|
-
|
190
189
|
end
|
191
190
|
end
|
192
191
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Database
|
5
3
|
class OpenLDAP < Base
|
@@ -33,11 +31,11 @@ module Backup
|
|
33
31
|
super
|
34
32
|
instance_eval(&block) if block_given?
|
35
33
|
|
36
|
-
@name ||=
|
34
|
+
@name ||= "ldap_backup"
|
37
35
|
@use_sudo ||= false
|
38
|
-
@slapcat_args ||=
|
36
|
+
@slapcat_args ||= []
|
39
37
|
@slapcat_utility ||= utility(:slapcat)
|
40
|
-
@slapcat_conf ||=
|
38
|
+
@slapcat_conf ||= "/etc/ldap/slapd.d"
|
41
39
|
end
|
42
40
|
|
43
41
|
##
|
@@ -47,7 +45,7 @@ module Backup
|
|
47
45
|
super
|
48
46
|
|
49
47
|
pipeline = Pipeline.new
|
50
|
-
dump_ext =
|
48
|
+
dump_ext = "ldif"
|
51
49
|
|
52
50
|
pipeline << slapcat
|
53
51
|
if @model.compressor
|
@@ -57,8 +55,8 @@ module Backup
|
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
60
|
-
pipeline << "#{
|
61
|
-
"'#{
|
58
|
+
pipeline << "#{utility(:cat)} > " \
|
59
|
+
"'#{File.join(dump_path, dump_filename)}.#{dump_ext}'"
|
62
60
|
|
63
61
|
pipeline.run
|
64
62
|
if pipeline.success?
|
@@ -73,7 +71,7 @@ module Backup
|
|
73
71
|
##
|
74
72
|
# Builds the full slapcat string based on all attributes
|
75
73
|
def slapcat
|
76
|
-
command = "#{
|
74
|
+
command = "#{slapcat_utility} #{slapcat_conf_option} #{slapcat_conf} #{user_options}"
|
77
75
|
command.prepend("sudo ") if use_sudo
|
78
76
|
command
|
79
77
|
end
|
@@ -88,7 +86,7 @@ module Backup
|
|
88
86
|
# Builds a compatible string for the additional options
|
89
87
|
# specified by the user
|
90
88
|
def user_options
|
91
|
-
slapcat_args.join(
|
89
|
+
slapcat_args.join(" ")
|
92
90
|
end
|
93
91
|
end
|
94
92
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Database
|
5
3
|
class PostgreSQL < Base
|
@@ -53,17 +51,19 @@ module Backup
|
|
53
51
|
super
|
54
52
|
|
55
53
|
pipeline = Pipeline.new
|
56
|
-
dump_ext =
|
54
|
+
dump_ext = "sql"
|
57
55
|
|
58
56
|
pipeline << (dump_all? ? pgdumpall : pgdump)
|
59
57
|
|
60
|
-
model.compressor
|
61
|
-
|
62
|
-
|
63
|
-
|
58
|
+
if model.compressor
|
59
|
+
model.compressor.compress_with do |command, ext|
|
60
|
+
pipeline << command
|
61
|
+
dump_ext << ext
|
62
|
+
end
|
63
|
+
end
|
64
64
|
|
65
|
-
pipeline << "#{
|
66
|
-
|
65
|
+
pipeline << "#{utility(:cat)} > " \
|
66
|
+
"'#{File.join(dump_path, dump_filename)}.#{dump_ext}'"
|
67
67
|
|
68
68
|
pipeline.run
|
69
69
|
if pipeline.success?
|
@@ -74,60 +74,59 @@ module Backup
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def pgdump
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
password_option.to_s +
|
78
|
+
sudo_option.to_s +
|
79
|
+
"#{utility(:pg_dump)} #{username_option} #{connectivity_options} " \
|
80
|
+
"#{user_options} #{tables_to_dump} #{tables_to_skip} #{name}"
|
81
81
|
end
|
82
82
|
|
83
83
|
def pgdumpall
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
password_option.to_s +
|
85
|
+
sudo_option.to_s +
|
86
|
+
"#{utility(:pg_dumpall)} #{username_option} " \
|
87
|
+
"#{connectivity_options} #{user_options}"
|
88
88
|
end
|
89
89
|
|
90
90
|
def password_option
|
91
|
-
"PGPASSWORD=#{
|
91
|
+
"PGPASSWORD=#{Shellwords.escape(password)} " if password
|
92
92
|
end
|
93
93
|
|
94
94
|
def sudo_option
|
95
|
-
"#{
|
95
|
+
"#{utility(:sudo)} -n -H -u #{sudo_user} " if sudo_user
|
96
96
|
end
|
97
97
|
|
98
98
|
def username_option
|
99
|
-
"--username=#{
|
99
|
+
"--username=#{Shellwords.escape(username)}" if username
|
100
100
|
end
|
101
101
|
|
102
102
|
def connectivity_options
|
103
|
-
return "--host='#{
|
103
|
+
return "--host='#{socket}'" if socket
|
104
104
|
|
105
105
|
opts = []
|
106
|
-
opts << "--host='#{
|
107
|
-
opts << "--port='#{
|
108
|
-
opts.join(
|
106
|
+
opts << "--host='#{host}'" if host
|
107
|
+
opts << "--port='#{port}'" if port
|
108
|
+
opts.join(" ")
|
109
109
|
end
|
110
110
|
|
111
111
|
def user_options
|
112
|
-
Array(additional_options).join(
|
112
|
+
Array(additional_options).join(" ")
|
113
113
|
end
|
114
114
|
|
115
115
|
def tables_to_dump
|
116
116
|
Array(only_tables).map do |table|
|
117
|
-
"--table='#{
|
118
|
-
end.join(
|
117
|
+
"--table='#{table}'"
|
118
|
+
end.join(" ")
|
119
119
|
end
|
120
120
|
|
121
121
|
def tables_to_skip
|
122
122
|
Array(skip_tables).map do |table|
|
123
|
-
"--exclude-table='#{
|
124
|
-
end.join(
|
123
|
+
"--exclude-table='#{table}'"
|
124
|
+
end.join(" ")
|
125
125
|
end
|
126
126
|
|
127
127
|
def dump_all?
|
128
128
|
name == :all
|
129
129
|
end
|
130
|
-
|
131
130
|
end
|
132
131
|
end
|
133
132
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Database
|
5
3
|
class Redis < Base
|
@@ -59,12 +57,10 @@ module Backup
|
|
59
57
|
|
60
58
|
@mode ||= :copy
|
61
59
|
|
62
|
-
unless MODES.include?(mode)
|
63
|
-
raise Error, "'#{ mode }' is not a valid mode"
|
64
|
-
end
|
60
|
+
raise Error, "'#{mode}' is not a valid mode" unless MODES.include?(mode)
|
65
61
|
|
66
62
|
if mode == :copy && rdb_path.nil?
|
67
|
-
raise Error,
|
63
|
+
raise Error, "`rdb_path` must be set when `mode` is :copy"
|
68
64
|
end
|
69
65
|
end
|
70
66
|
|
@@ -96,17 +92,19 @@ module Backup
|
|
96
92
|
|
97
93
|
def sync!
|
98
94
|
pipeline = Pipeline.new
|
99
|
-
dump_ext =
|
95
|
+
dump_ext = "rdb"
|
100
96
|
|
101
|
-
pipeline << "#{
|
97
|
+
pipeline << "#{redis_cli_cmd} --rdb -"
|
102
98
|
|
103
|
-
model.compressor
|
104
|
-
|
105
|
-
|
106
|
-
|
99
|
+
if model.compressor
|
100
|
+
model.compressor.compress_with do |command, ext|
|
101
|
+
pipeline << command
|
102
|
+
dump_ext << ext
|
103
|
+
end
|
104
|
+
end
|
107
105
|
|
108
|
-
pipeline << "#{
|
109
|
-
|
106
|
+
pipeline << "#{utility(:cat)} > " \
|
107
|
+
"'#{File.join(dump_path, dump_filename)}.#{dump_ext}'"
|
110
108
|
|
111
109
|
pipeline.run
|
112
110
|
|
@@ -116,17 +114,16 @@ module Backup
|
|
116
114
|
end
|
117
115
|
|
118
116
|
def save!
|
119
|
-
resp = run("#{
|
117
|
+
resp = run("#{redis_cli_cmd} SAVE")
|
120
118
|
unless resp =~ /OK$/
|
121
119
|
raise Error, <<-EOS
|
122
120
|
Failed to invoke the `SAVE` command
|
123
|
-
Response was: #{
|
121
|
+
Response was: #{resp}
|
124
122
|
EOS
|
125
123
|
end
|
126
|
-
|
127
124
|
rescue Error
|
128
125
|
if resp =~ /save already in progress/
|
129
|
-
unless (attempts ||=
|
126
|
+
unless (attempts ||= "0").next! == "5"
|
130
127
|
sleep 5
|
131
128
|
retry
|
132
129
|
end
|
@@ -138,14 +135,14 @@ module Backup
|
|
138
135
|
unless File.exist?(rdb_path)
|
139
136
|
raise Error, <<-EOS
|
140
137
|
Redis database dump not found
|
141
|
-
`rdb_path` was '#{
|
138
|
+
`rdb_path` was '#{rdb_path}'
|
142
139
|
EOS
|
143
140
|
end
|
144
141
|
|
145
|
-
dst_path = File.join(dump_path, dump_filename +
|
142
|
+
dst_path = File.join(dump_path, dump_filename + ".rdb")
|
146
143
|
if model.compressor
|
147
144
|
model.compressor.compress_with do |command, ext|
|
148
|
-
run("#{
|
145
|
+
run("#{command} -c '#{rdb_path}' > '#{dst_path + ext}'")
|
149
146
|
end
|
150
147
|
else
|
151
148
|
FileUtils.cp(rdb_path, dst_path)
|
@@ -153,27 +150,27 @@ module Backup
|
|
153
150
|
end
|
154
151
|
|
155
152
|
def redis_cli_cmd
|
156
|
-
"#{
|
157
|
-
|
153
|
+
"#{utility("redis-cli")} #{password_option} " \
|
154
|
+
"#{connectivity_options} #{user_options}"
|
158
155
|
end
|
159
156
|
|
160
157
|
def password_option
|
161
|
-
|
158
|
+
return unless password
|
159
|
+
"-a '#{password}'"
|
162
160
|
end
|
163
161
|
|
164
162
|
def connectivity_options
|
165
|
-
return "-s '#{
|
163
|
+
return "-s '#{socket}'" if socket
|
166
164
|
|
167
165
|
opts = []
|
168
|
-
opts << "-h '#{
|
169
|
-
opts << "-p '#{
|
170
|
-
opts.join(
|
166
|
+
opts << "-h '#{host}'" if host
|
167
|
+
opts << "-p '#{port}'" if port
|
168
|
+
opts.join(" ")
|
171
169
|
end
|
172
170
|
|
173
171
|
def user_options
|
174
|
-
Array(additional_options).join(
|
172
|
+
Array(additional_options).join(" ")
|
175
173
|
end
|
176
|
-
|
177
174
|
end
|
178
175
|
end
|
179
176
|
end
|
data/lib/backup/database/riak.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Database
|
5
3
|
class Riak < Base
|
6
|
-
|
7
4
|
##
|
8
5
|
# Node is the node from which to perform the backup.
|
9
6
|
# Default: riak@127.0.0.1
|
@@ -23,9 +20,9 @@ module Backup
|
|
23
20
|
super
|
24
21
|
instance_eval(&block) if block_given?
|
25
22
|
|
26
|
-
@node ||=
|
27
|
-
@cookie ||=
|
28
|
-
@user ||=
|
23
|
+
@node ||= "riak@127.0.0.1"
|
24
|
+
@cookie ||= "riak"
|
25
|
+
@user ||= "riak"
|
29
26
|
end
|
30
27
|
|
31
28
|
##
|
@@ -38,14 +35,16 @@ module Backup
|
|
38
35
|
|
39
36
|
dump_file = File.join(dump_path, dump_filename)
|
40
37
|
with_riak_owned_dump_path do
|
41
|
-
run("#{
|
38
|
+
run("#{riakadmin} backup #{node} #{cookie} '#{dump_file}' node")
|
42
39
|
end
|
43
40
|
|
44
|
-
model.compressor
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
if model.compressor
|
42
|
+
model.compressor.compress_with do |command, ext|
|
43
|
+
dump_file << "-#{node}" # `riak-admin` appends `node` to the filename.
|
44
|
+
run("#{command} -c '#{dump_file}' > '#{dump_file + ext}'")
|
45
|
+
FileUtils.rm_f(dump_file)
|
46
|
+
end
|
47
|
+
end
|
49
48
|
|
50
49
|
log!(:finished)
|
51
50
|
end
|
@@ -61,22 +60,20 @@ module Backup
|
|
61
60
|
# the user running Backup, since the absence of the execute bit on their
|
62
61
|
# home directory would deny +user+ access.
|
63
62
|
def with_riak_owned_dump_path
|
64
|
-
run
|
65
|
-
"#{ user } '#{ dump_path }'")
|
63
|
+
run "#{utility(:sudo)} -n #{utility(:chown)} #{user} '#{dump_path}'"
|
66
64
|
yield
|
67
65
|
ensure
|
68
66
|
# reclaim ownership
|
69
|
-
run
|
70
|
-
|
67
|
+
run "#{utility(:sudo)} -n #{utility(:chown)} -R " \
|
68
|
+
"#{Config.user} '#{dump_path}'"
|
71
69
|
end
|
72
70
|
|
73
71
|
##
|
74
72
|
# `riak-admin` must be run as the riak +user+.
|
75
73
|
# It will do this itself, but without `-n` and emits a message on STDERR.
|
76
74
|
def riakadmin
|
77
|
-
"#{
|
75
|
+
"#{utility(:sudo)} -n -u #{user} #{utility("riak-admin")}"
|
78
76
|
end
|
79
|
-
|
80
77
|
end
|
81
78
|
end
|
82
79
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Database
|
5
3
|
class SQLite < Base
|
@@ -28,10 +26,10 @@ module Backup
|
|
28
26
|
def perform!
|
29
27
|
super
|
30
28
|
|
31
|
-
dump = "echo '.dump' | #{
|
29
|
+
dump = "echo '.dump' | #{sqlitedump_utility} #{path}"
|
32
30
|
|
33
31
|
pipeline = Pipeline.new
|
34
|
-
dump_ext =
|
32
|
+
dump_ext = "sql"
|
35
33
|
|
36
34
|
pipeline << dump
|
37
35
|
if model.compressor
|
@@ -41,7 +39,7 @@ module Backup
|
|
41
39
|
end
|
42
40
|
end
|
43
41
|
|
44
|
-
pipeline << "cat > '#{
|
42
|
+
pipeline << "cat > '#{File.join(dump_path, dump_filename)}.#{dump_ext}'"
|
45
43
|
|
46
44
|
pipeline.run
|
47
45
|
|
@@ -49,7 +47,7 @@ module Backup
|
|
49
47
|
log!(:finished)
|
50
48
|
else
|
51
49
|
raise Error,
|
52
|
-
"#{
|
50
|
+
"#{database_name} Dump Failed!\n" + pipeline.error_messages
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Backup
|
4
2
|
module Encryptor
|
5
3
|
class Base
|
@@ -15,14 +13,14 @@ module Backup
|
|
15
13
|
##
|
16
14
|
# Return the encryptor name, with Backup namespace removed
|
17
15
|
def encryptor_name
|
18
|
-
self.class.to_s.sub(
|
16
|
+
self.class.to_s.sub("Backup::", "")
|
19
17
|
end
|
20
18
|
|
21
19
|
##
|
22
20
|
# Logs a message to the console and log file to inform
|
23
21
|
# the client that Backup is encrypting the archive
|
24
22
|
def log!
|
25
|
-
Logger.info "Using #{
|
23
|
+
Logger.info "Using #{encryptor_name} to encrypt the archive."
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|