dumper 1.3.7 → 1.4.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.
- checksums.yaml +4 -4
- data/lib/dumper/cli.rb +28 -9
- data/lib/dumper/dependency.rb +2 -1
- data/lib/dumper/job.rb +34 -8
- data/lib/dumper/version.rb +1 -1
- data/spec/dumper_spec.rb +17 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 821b7a382e2fe27d7fe8fb1c3d4368368d3bea54
|
4
|
+
data.tar.gz: fccb695b3b21ac6998bf8423ca891be8033398db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31f45ae50d8441350d87e90168cec56054c1295851f6066d0ca852cf9263938fa2c33eeb02223554fa2889dd126836fb24d0306f9b63d39f71e79e4f60332500
|
7
|
+
data.tar.gz: 424fedc83af11fa9a493a1ab12a8a5391068f34ff4a14aa2d251003e800d33969cdc0ad0c00d67d7574682c1154b70e5777464b43e410a6daffe8466c5450632
|
data/lib/dumper/cli.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
Dumper::Dependency.load('thor')
|
2
2
|
Dumper::Dependency.load('rainbow')
|
3
|
+
Dumper::Dependency.load('net-ntp')
|
3
4
|
|
4
5
|
module Dumper
|
5
6
|
class Cli < Thor
|
@@ -9,23 +10,23 @@ module Dumper
|
|
9
10
|
def doctor
|
10
11
|
check_ip
|
11
12
|
check_cnf
|
13
|
+
check_clock
|
12
14
|
end
|
13
15
|
|
14
16
|
no_tasks do
|
15
17
|
def check_ip
|
16
|
-
|
18
|
+
print 'Checking IP address... '
|
17
19
|
@ip = Dumper::Utility::IP.new
|
18
|
-
|
20
|
+
print "#{@ip.ip} => "
|
19
21
|
if @ip.ipaddr.private?
|
20
|
-
|
22
|
+
puts "private IP, #{fetch_will_fail_warning}".color(:red)
|
21
23
|
else
|
22
|
-
|
24
|
+
puts 'public IP, good'.color(:green)
|
23
25
|
end
|
24
|
-
puts str
|
25
26
|
end
|
26
27
|
|
27
28
|
def check_cnf
|
28
|
-
|
29
|
+
print 'Checking my.cnf... '
|
29
30
|
bound = nil
|
30
31
|
['/etc/my.cnf', '/etc/mysql/my.cnf', '/usr/etc/my.cnf', '~/.my.cnf'].each do |name|
|
31
32
|
fullpath = File.expand_path(name)
|
@@ -39,14 +40,32 @@ module Dumper
|
|
39
40
|
end
|
40
41
|
if bound
|
41
42
|
if bound == '127.0.0.1'
|
42
|
-
|
43
|
+
print 'There is bind-address = 127.0.0.1 => '
|
43
44
|
elsif IPAddr.new(bound).private?
|
44
|
-
|
45
|
+
print "There is bind-address = #{bound} => "
|
45
46
|
end
|
47
|
+
puts fetch_will_fail_warning.color(:red)
|
46
48
|
else
|
47
|
-
puts 'No bind-address defined in my.cnf
|
49
|
+
puts 'No bind-address defined in my.cnf => ' << 'good'.color(:green)
|
48
50
|
end
|
49
51
|
end
|
52
|
+
|
53
|
+
def check_clock
|
54
|
+
print 'Checking server clock accuracy... '
|
55
|
+
target = Net::NTP.get('us.pool.ntp.org').time
|
56
|
+
source = Time.now
|
57
|
+
diff = (target - source).abs.round(3)
|
58
|
+
print "#{source.strftime('%Y-%m-%d %H:%M:%S')} (server time) vs #{target.strftime('%Y-%m-%d %H:%M:%S')} (ntp time), diff: #{diff} seconds => "
|
59
|
+
if diff > 15 * 60
|
60
|
+
puts 'warning, Amazon S3 does not accept clock skewed more than 15 minutes.'.color(:red)
|
61
|
+
else
|
62
|
+
puts 'good'.color(:green)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def fetch_will_fail_warning
|
67
|
+
'warning - fetch from dumper.io to this server will fail, you will need to use the dumper gem with rails.'
|
68
|
+
end
|
50
69
|
end
|
51
70
|
end
|
52
71
|
end
|
data/lib/dumper/dependency.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Dumper
|
2
2
|
class Dependency
|
3
3
|
LIBS = {
|
4
|
-
'thor' => { :require => 'thor', :version => '~> 0.14
|
4
|
+
'thor' => { :require => 'thor', :version => '~> 0.14' },
|
5
5
|
'rainbow' => { :require => 'rainbow', :version => '~> 1.1.4' },
|
6
|
+
'net-ntp' => { :require => 'net/ntp', :version => '~> 2.1.1' },
|
6
7
|
}
|
7
8
|
|
8
9
|
def self.load(name)
|
data/lib/dumper/job.rb
CHANGED
@@ -55,12 +55,13 @@ module Dumper
|
|
55
55
|
end
|
56
56
|
|
57
57
|
dump_duration = Time.now - start_at
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
@filesize = File.size(@database.dump_path)
|
59
|
+
log "dump_duration = #{dump_duration}, filesize = #{@filesize}"
|
60
|
+
if @filesize > @agent.max_filesize
|
61
|
+
abort_with("max filesize exceeded: #{@filesize}", :too_large)
|
61
62
|
end
|
62
63
|
|
63
|
-
upload_to_s3(json
|
64
|
+
upload_to_s3(json)
|
64
65
|
|
65
66
|
json = @agent.api_request('backup/commit', :params => { :backup_id => @backup_id, :dump_duration => dump_duration.to_i })
|
66
67
|
rescue
|
@@ -70,10 +71,37 @@ module Dumper
|
|
70
71
|
end
|
71
72
|
|
72
73
|
# Upload
|
73
|
-
def upload_to_s3(
|
74
|
+
def upload_to_s3(json)
|
75
|
+
if defined?(AWS::S3::MultipartUpload) and @filesize > 100.megabytes
|
76
|
+
# aws-sdk gem installed
|
77
|
+
upload_by_aws_sdk(json)
|
78
|
+
else
|
79
|
+
# fallback to multipart-post
|
80
|
+
upload_by_multipart_post(json)
|
81
|
+
end
|
82
|
+
rescue
|
83
|
+
abort_with("upload error: #{$!} - please contact our support.", :upload_error)
|
84
|
+
end
|
85
|
+
|
86
|
+
def upload_by_aws_sdk(json)
|
87
|
+
log "uploading by aws-sdk v#{AWS::VERSION}"
|
88
|
+
|
89
|
+
s3 = json[:s3_federation]
|
90
|
+
aws = AWS::S3.new(s3[:credentials])
|
91
|
+
aws.buckets[s3[:bucket]].objects[s3[:key]].write(
|
92
|
+
file: @database.dump_path,
|
93
|
+
content_type: 'application/octet-stream',
|
94
|
+
content_disposition: "attachment; filename=#{@database.filename}",
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
def upload_by_multipart_post(json)
|
74
99
|
require 'net/http/post/multipart'
|
100
|
+
log "uploading by multipart-post v#{Gem.loaded_specs['multipart-post'].version.to_s}"
|
101
|
+
|
102
|
+
fields = json[:fields]
|
75
103
|
fields['file'] = UploadIO.new(@database.dump_path, 'application/octet-stream', @database.filename)
|
76
|
-
uri = URI.parse(url)
|
104
|
+
uri = URI.parse(json[:url])
|
77
105
|
request = Net::HTTP::Post::Multipart.new uri.path, fields
|
78
106
|
http = Net::HTTP.new(uri.host, uri.port)
|
79
107
|
if uri.is_a? URI::HTTPS
|
@@ -102,8 +130,6 @@ module Dumper
|
|
102
130
|
else
|
103
131
|
abort_with("upload error: #{response.to_s} - #{response.body}", :upload_error)
|
104
132
|
end
|
105
|
-
rescue
|
106
|
-
abort_with("upload error: #{$!}", :upload_error)
|
107
133
|
end
|
108
134
|
|
109
135
|
def abort_with(text, code=nil)
|
data/lib/dumper/version.rb
CHANGED
data/spec/dumper_spec.rb
CHANGED
@@ -7,6 +7,23 @@ describe Dumper do
|
|
7
7
|
Dumper::Agent.respond_to?(:start).should be_true
|
8
8
|
end
|
9
9
|
|
10
|
+
it 'loads everything' do
|
11
|
+
expect {
|
12
|
+
Dumper::Agent
|
13
|
+
# Dumper::Cli
|
14
|
+
Dumper::Dependency
|
15
|
+
Dumper::Job
|
16
|
+
Dumper::Stack
|
17
|
+
Dumper::Utility
|
18
|
+
Dumper::VERSION
|
19
|
+
Dumper::Database::Base
|
20
|
+
Dumper::Database::MySQL
|
21
|
+
Dumper::Database::PostgreSQL
|
22
|
+
Dumper::Database::MongoDB
|
23
|
+
Dumper::Database::Redis
|
24
|
+
}.to_not raise_error
|
25
|
+
end
|
26
|
+
|
10
27
|
describe :Stack do
|
11
28
|
it 'initializes stack' do
|
12
29
|
stack = Dumper::Stack.new
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dumper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenn Ejima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|