new_backup 1.0.3 → 1.0.4
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/Gemfile.lock +1 -1
- data/lib/new_backup/datadog.rb +5 -5
- data/lib/new_backup/main.rb +8 -17
- data/lib/new_backup/myrds.rb +10 -7
- data/lib/new_backup/mys3.rb +4 -1
- data/lib/new_backup/mysqlcmds.rb +8 -6
- data/lib/new_backup/version.rb +1 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/lib/new_backup/datadog.rb
CHANGED
@@ -59,7 +59,7 @@ module NewBackup
|
|
59
59
|
def api_key=(api_key)
|
60
60
|
$dogger ||= DataDogger.new
|
61
61
|
$dogger.api_key=api_key
|
62
|
-
debug "#{self.class}##{__method__}@#{__LINE__}: $dogger.api_key: #{$dogger.api_key}"
|
62
|
+
debug "#{self.class}##{__method__}@#{File.basename(__FILE__)}:#{__LINE__}: $dogger.api_key: #{$dogger.api_key}"
|
63
63
|
end
|
64
64
|
|
65
65
|
def dogger(msg, options={})
|
@@ -71,12 +71,12 @@ module NewBackup
|
|
71
71
|
else
|
72
72
|
info msg
|
73
73
|
end
|
74
|
-
debug "#{self.class}##{__method__}@#{__LINE__}: $dogger exists? #{$dogger.inspect}"
|
75
|
-
debug "#{self.class}##{__method__}@#{__LINE__}: $dogger.api_key: #{$dogger.api_key}"
|
74
|
+
debug "#{self.class}##{__method__}@#{File.basename(__FILE__)}:#{__LINE__}: $dogger exists? #{$dogger.inspect}"
|
75
|
+
debug "#{self.class}##{__method__}@#{File.basename(__FILE__)}:#{__LINE__}: $dogger.api_key: #{$dogger.api_key}"
|
76
76
|
return if $dogger.api_key.nil? || $dogger.api_key.empty?
|
77
77
|
|
78
78
|
$dogger.client ||= Dogapi::Client.new($dogger.api_key)
|
79
|
-
debug "#{self.class}##{__method__}@#{__LINE__}: $dogger.client: #{$dogger.client.inspect}"
|
79
|
+
debug "#{self.class}##{__method__}@#{File.basename(__FILE__)}:#{__LINE__}: $dogger.client: #{$dogger.client.inspect}"
|
80
80
|
|
81
81
|
$dogger.environment ||= (ENV['RAILS_ENV'].nil? || ENV['RAILS_ENV'].empty?) ? 'development' : ENV['RAILS_ENV']
|
82
82
|
|
@@ -93,7 +93,7 @@ module NewBackup
|
|
93
93
|
body = options[:body] ||= msg
|
94
94
|
|
95
95
|
this_event = Dogapi::Event.new(body, emit_options)
|
96
|
-
debug "#{self.class}##{__method__}@#{__LINE__}: emit_options: #{emit_options.to_yaml}\nbody: #{body}\nthis_event: #{this_event.inspect}"
|
96
|
+
debug "#{self.class}##{__method__}@#{File.basename(__FILE__)}:#{__LINE__}: emit_options: #{emit_options.to_yaml}\nbody: #{body}\nthis_event: #{this_event.inspect}"
|
97
97
|
$dogger.client.emit_event(this_event)
|
98
98
|
|
99
99
|
end
|
data/lib/new_backup/main.rb
CHANGED
@@ -42,7 +42,7 @@ module NewBackup
|
|
42
42
|
# Initialize the Main loop, processing options and putting them in the right form
|
43
43
|
def initialize(opts={})
|
44
44
|
|
45
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: original opts: #{opts.to_yaml}"
|
45
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: original opts: #{opts.to_yaml}"
|
46
46
|
|
47
47
|
if opts["config_file"] && File.exists?(opts["config_file"])
|
48
48
|
converged_opts = DEFAULT_OPTIONS.merge(YAML.load(File.read(opts["config_file"]))).merge(opts)
|
@@ -52,7 +52,7 @@ module NewBackup
|
|
52
52
|
|
53
53
|
converged_opts["timestamp"] = Time.now.strftime(converged_opts["timestamp_format"])
|
54
54
|
|
55
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: converged_opts: #{converged_opts.to_yaml}"
|
55
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: converged_opts: #{converged_opts.to_yaml}"
|
56
56
|
|
57
57
|
missing_options = REQUIRED_OPTIONS.select {|o| o unless converged_opts.has_key?(o)}
|
58
58
|
raise "Missing required options #{missing_options.inspect} in either configuration or command line" if missing_options.count > 0
|
@@ -94,8 +94,7 @@ module NewBackup
|
|
94
94
|
:nos3 => converged_opts["nos3"]
|
95
95
|
}
|
96
96
|
|
97
|
-
|
98
|
-
debug "Options:\n#{@options.to_yaml}"
|
97
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: Options:\n#{@options.to_yaml}"
|
99
98
|
|
100
99
|
# Fill in the hidden values after showing the options
|
101
100
|
@options[:aws][:access_key] = converged_opts["aws_access_key_id"]
|
@@ -103,11 +102,9 @@ module NewBackup
|
|
103
102
|
@options[:mysql][:password] = converged_opts["mysql_password"]
|
104
103
|
@options[:datadog][:api_key] = converged_opts["datadog_apikey"]
|
105
104
|
|
106
|
-
debug @options.to_yaml
|
107
|
-
|
108
105
|
$dogger = DataDogger.new
|
109
106
|
$dogger.api_key=@options[:datadog][:api_key] unless @options[:debug]
|
110
|
-
debug "#{self.class}##{__method__}@#{__LINE__}: $dogger.api_key: #{$dogger.api_key}"
|
107
|
+
debug "#{self.class}##{__method__}@#{File.basename(__FILE__)}:#{__LINE__}: $dogger.api_key: #{$dogger.api_key}"
|
111
108
|
|
112
109
|
end
|
113
110
|
|
@@ -115,13 +112,13 @@ module NewBackup
|
|
115
112
|
dogger "Beginning RDS-S3-Backup"
|
116
113
|
begin
|
117
114
|
|
118
|
-
raise "#{self.class}##{__method__}:#{__LINE__}: Dump directory #{@options[:dump_directory]} does not exist!" unless File.directory?(@options[:dump_directory])
|
115
|
+
raise "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: Dump directory #{@options[:dump_directory]} does not exist!" unless File.directory?(@options[:dump_directory])
|
119
116
|
|
120
117
|
|
121
118
|
raw_file = File.join(File.expand_path(@options[:dump_directory]),save_file_name)
|
122
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: raw_file: #{raw_file}"
|
119
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: raw_file: #{raw_file}"
|
123
120
|
clean_file = File.join(File.expand_path(@options[:dump_directory]),clean_file_name)
|
124
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: clean_file: #{clean_file}"
|
121
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: clean_file: #{clean_file}"
|
125
122
|
|
126
123
|
if (@options[:nords])
|
127
124
|
info "Not running RDS"
|
@@ -134,11 +131,8 @@ module NewBackup
|
|
134
131
|
else
|
135
132
|
|
136
133
|
NewBackup::MyRds.new(@options).restore do |db|
|
137
|
-
info "Dump raw database"
|
138
134
|
db.dump(raw_file)
|
139
|
-
info "Obfuscate database"
|
140
135
|
db.obfuscate
|
141
|
-
info "Dump clean database"
|
142
136
|
db.dump(clean_file)
|
143
137
|
end
|
144
138
|
end
|
@@ -150,14 +144,11 @@ module NewBackup
|
|
150
144
|
s3 = NewBackup::MyS3.new(@options)
|
151
145
|
s3.connect do |connection|
|
152
146
|
s3.connect_bucket(connection, @options[:s3][:raw_bucket]) do |bucket|
|
153
|
-
info "Save raw db dump"
|
154
147
|
s3.put_file bucket, raw_file
|
155
|
-
info "Prune excess backups"
|
156
148
|
s3.prune bucket, @options[:s3][:dump_ttl]
|
157
149
|
end
|
158
150
|
|
159
151
|
s3.connect_bucket(connection, @options[:s3][:clean_bucket]) do |bucket|
|
160
|
-
info "Save cleaned db dump"
|
161
152
|
s3.put_file bucket, clean_file
|
162
153
|
end
|
163
154
|
end
|
@@ -168,7 +159,7 @@ module NewBackup
|
|
168
159
|
dogger "Fatal error in #{self.class}#run: #{e.class}: #{e}" ,
|
169
160
|
:type => :error,
|
170
161
|
:body => "Backtrace:\n#{e.backtrace.join("\n")}"
|
171
|
-
debug e.backtrace.join("\n")
|
162
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: Backtrace:\n #{e.backtrace.join("\n")}"
|
172
163
|
raise e
|
173
164
|
|
174
165
|
|
data/lib/new_backup/myrds.rb
CHANGED
@@ -25,7 +25,7 @@ module NewBackup
|
|
25
25
|
|
26
26
|
# Initialize the class with options
|
27
27
|
def initialize(options={})
|
28
|
-
debug "Options: #{options}"
|
28
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: Options: #{options}"
|
29
29
|
@options = options
|
30
30
|
end
|
31
31
|
|
@@ -62,8 +62,7 @@ module NewBackup
|
|
62
62
|
|
63
63
|
# Get the RDS server
|
64
64
|
def get_rds(connection)
|
65
|
-
debug "rds instance_id: #{@options[:rds][:instance_id]}"
|
66
|
-
debug "Connection servers: #{connection.servers}"
|
65
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: rds instance_id: #{@options[:rds][:instance_id]}\nConnection servers: #{connection.servers}"
|
67
66
|
rds_server = connection.servers.get(@options[:rds][:instance_id])
|
68
67
|
raise "No RDS server!" if rds_server.nil?
|
69
68
|
yield rds_server
|
@@ -76,7 +75,7 @@ module NewBackup
|
|
76
75
|
rds_server.snapshots.new(:id => snap_name).save
|
77
76
|
new_snapshot = rds_server.snapshots.get(snap_name)
|
78
77
|
1.upto(MAX_TRIES) do |i|
|
79
|
-
debug "waiting for new snapshot, try ##{i}"
|
78
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: waiting for new snapshot, try ##{i}"
|
80
79
|
new_snapshot.wait_for { ready? }
|
81
80
|
end
|
82
81
|
|
@@ -100,7 +99,7 @@ module NewBackup
|
|
100
99
|
)
|
101
100
|
backup_server = connection.servers.get(backup_server_id)
|
102
101
|
1.upto(MAX_TRIES) do |i|
|
103
|
-
debug "waiting for backup server, try ##{i}"
|
102
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: waiting for backup server, try ##{i}"
|
104
103
|
backup_server.wait_for { ready? }
|
105
104
|
end
|
106
105
|
|
@@ -124,12 +123,16 @@ module NewBackup
|
|
124
123
|
|
125
124
|
# Return the snapshot name
|
126
125
|
def snap_name
|
127
|
-
"s3-dump-snap-#{@options[:timestamp]}".tap
|
126
|
+
"s3-dump-snap-#{@options[:timestamp]}".tap do |t|
|
127
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: Snap Name: #{t}"
|
128
|
+
end
|
128
129
|
end
|
129
130
|
|
130
131
|
# Return the backup server id
|
131
132
|
def backup_server_id
|
132
|
-
"#{@options[:rds][:instance_id]}-s3-dump-server-#{@options[:timestamp]}".tap
|
133
|
+
"#{@options[:rds][:instance_id]}-s3-dump-server-#{@options[:timestamp]}".tap do |t|
|
134
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: Backup Server ID: #{t}"
|
135
|
+
end
|
133
136
|
end
|
134
137
|
|
135
138
|
|
data/lib/new_backup/mys3.rb
CHANGED
@@ -56,7 +56,8 @@ module NewBackup
|
|
56
56
|
# *&block*:: block passed to evaluate in context of bucket
|
57
57
|
# (If no block given simply return the bucket pointer.)
|
58
58
|
def connect_bucket(connection, bucket_name, &block)
|
59
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: connection: #{connection.inspect}"
|
59
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: connection: #{connection.inspect}"
|
60
|
+
info "Connecting to #{bucket_name}"
|
60
61
|
buckets = connection.directories
|
61
62
|
raise "No buckets!" if buckets.nil? || buckets.empty?
|
62
63
|
bucket = connection.directories.get(bucket_name)
|
@@ -79,6 +80,7 @@ module NewBackup
|
|
79
80
|
# bucket:: directory where to put the file
|
80
81
|
# fn:: name of file to upload (gzipped)
|
81
82
|
def put_file(bucket,fn)
|
83
|
+
info "Saving #{fn} to #{bucket.key}"
|
82
84
|
s3_fn = File.join(@options[:s3][:prefix], File.basename(fn))
|
83
85
|
options = {
|
84
86
|
:key => s3_fn,
|
@@ -105,6 +107,7 @@ module NewBackup
|
|
105
107
|
return if files.nil? || files.empty?
|
106
108
|
|
107
109
|
if files.count > keep
|
110
|
+
info "Pruning down to #{keep} files"
|
108
111
|
files.sort {|x,y| x.last_modified <=> y.last_modified}.
|
109
112
|
take(files.count - keep).
|
110
113
|
map(&:destroy)
|
data/lib/new_backup/mysqlcmds.rb
CHANGED
@@ -39,7 +39,7 @@ module NewBackup
|
|
39
39
|
:gzip => get_command('gzip')
|
40
40
|
}
|
41
41
|
|
42
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: @commands: #{@commands}"
|
42
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: @commands: #{@commands}"
|
43
43
|
|
44
44
|
end
|
45
45
|
|
@@ -55,12 +55,13 @@ module NewBackup
|
|
55
55
|
cmd << ">"
|
56
56
|
cmd << save_file
|
57
57
|
|
58
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: cmd = #{cmd.join(" ")}"
|
58
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: cmd = #{cmd.join(" ")}"
|
59
59
|
|
60
60
|
saver = RunIt.new cmd.join(" ")
|
61
|
+
info "dumping #{self.database} to #{save_file}"
|
61
62
|
saver.run
|
62
63
|
raise "#{self.class}#save error: #{saver.result.exitstatus}: #{saver.error.inspect}" unless saver.result.success?
|
63
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: saver.output: #{saver.output}"
|
64
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: saver.output: #{saver.output}"
|
64
65
|
end
|
65
66
|
|
66
67
|
def obfuscate
|
@@ -74,11 +75,12 @@ module NewBackup
|
|
74
75
|
cmd << "<"
|
75
76
|
cmd << self.obfuscate_script
|
76
77
|
|
77
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: cmd= #{cmd.join(" ")}"
|
78
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: cmd= #{cmd.join(" ")}"
|
78
79
|
obfuscator = RunIt.new cmd.join(" ")
|
80
|
+
info "Running #{self.obfuscate_script} on #{self.database}"
|
79
81
|
obfuscator.run
|
80
|
-
raise "#{self.class}##{__method__}:#{__LINE__}: error: #{obfuscator.result.exitstatus}: #{obfuscator.error.inspect}" unless obfuscator.result.success?
|
81
|
-
debug "#{self.class}##{__method__}:#{__LINE__}: obfuscator.output: #{obfuscator.output}"
|
82
|
+
raise "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: error: #{obfuscator.result.exitstatus}: #{obfuscator.error.inspect}" unless obfuscator.result.success?
|
83
|
+
debug "#{self.class}##{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: obfuscator.output: #{obfuscator.output}"
|
82
84
|
end
|
83
85
|
|
84
86
|
|
data/lib/new_backup/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: new_backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -205,7 +205,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
205
205
|
version: '0'
|
206
206
|
segments:
|
207
207
|
- 0
|
208
|
-
hash:
|
208
|
+
hash: 1620806548271440799
|
209
209
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
210
|
none: false
|
211
211
|
requirements:
|
@@ -214,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
214
|
version: '0'
|
215
215
|
segments:
|
216
216
|
- 0
|
217
|
-
hash:
|
217
|
+
hash: 1620806548271440799
|
218
218
|
requirements: []
|
219
219
|
rubyforge_project:
|
220
220
|
rubygems_version: 1.8.24
|