sweety_backy 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sweety_backy.rb +1 -0
- data/lib/sweety_backy/commander.rb +13 -7
- data/lib/sweety_backy/runner.rb +93 -18
- data/lib/sweety_backy/utils.rb +1 -1
- data/lib/sweety_backy/version.rb +1 -1
- data/test/commander_test.rb +12 -5
- data/test/fixtures/file_for_md5.txt +1 -0
- data/test/runner_test.rb +7 -3
- data/test/s3/commander_s3_test.rb +2 -2
- data/test/s3/runner_s3_test.rb +14 -0
- metadata +6 -4
data/lib/sweety_backy.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module SweetyBacky
|
2
2
|
module Commander
|
3
|
-
def self.do_files_backup( path, backup_path
|
3
|
+
def self.do_files_backup( path, backup_path )
|
4
4
|
SweetyBacky::Utils.log "doing files backup of #{path} to #{backup_path}"
|
5
5
|
|
6
6
|
FileUtils.mkdir_p( File.dirname( backup_path ) )
|
@@ -14,19 +14,19 @@ module SweetyBacky
|
|
14
14
|
tmp_sql_file_path = File.join( Dir::tmpdir, "#{File.basename( backup_path, '.tar.gz' )}" )
|
15
15
|
|
16
16
|
database_pass = opts[:database_pass].empty? ? '' : "-p#{opts[:database_pass]}"
|
17
|
-
|
17
|
+
|
18
18
|
SweetyBacky::Utils::command( "mysqldump -u#{opts[:database_user]} #{database_pass} #{database_name} > #{tmp_sql_file_path}" )
|
19
19
|
SweetyBacky::Utils::command( "tar -cz --same-permissions --file #{backup_path} --directory #{File.dirname(tmp_sql_file_path)} #{File.basename(tmp_sql_file_path)}" )
|
20
20
|
|
21
21
|
File.delete( tmp_sql_file_path )
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.
|
25
|
-
|
26
|
-
|
24
|
+
def self.clean( opts )
|
25
|
+
clean_files( opts )
|
26
|
+
clean_databases( opts )
|
27
27
|
end
|
28
28
|
|
29
|
-
def self.
|
29
|
+
def self.clean_files( opts )
|
30
30
|
SweetyBacky::Utils.log "cleaning files on #{opts[:working_path]}/files/"
|
31
31
|
|
32
32
|
opts[:paths].each do |path|
|
@@ -44,7 +44,7 @@ module SweetyBacky
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def self.
|
47
|
+
def self.clean_databases( opts )
|
48
48
|
SweetyBacky::Utils.log "cleaning databases on #{opts[:working_path]}/databases/"
|
49
49
|
|
50
50
|
opts[:databases].each do |database_name|
|
@@ -78,5 +78,11 @@ module SweetyBacky
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
+
def self.do_md5( path, md5_path )
|
82
|
+
digest = Digest::MD5.hexdigest( File.read( path ) )
|
83
|
+
File.open( md5_path, 'w' ) { |f| f.write digest }
|
84
|
+
|
85
|
+
return digest
|
86
|
+
end
|
81
87
|
end
|
82
88
|
end
|
data/lib/sweety_backy/runner.rb
CHANGED
@@ -6,12 +6,14 @@ require File.dirname(__FILE__) + "/utils.rb"
|
|
6
6
|
|
7
7
|
module SweetyBacky
|
8
8
|
class Runner
|
9
|
-
attr_reader :opts
|
9
|
+
attr_reader :opts, :results
|
10
10
|
|
11
11
|
def initialize( path = nil )
|
12
12
|
if( !path.nil? )
|
13
13
|
config( SweetyBacky::OptsReader.read_opts( path ) )
|
14
14
|
end
|
15
|
+
|
16
|
+
@results = []
|
15
17
|
end
|
16
18
|
|
17
19
|
def config( opts )
|
@@ -39,42 +41,80 @@ module SweetyBacky
|
|
39
41
|
|
40
42
|
def do_files_backup
|
41
43
|
@opts[:paths].each do |path|
|
44
|
+
success = nil
|
42
45
|
backup_path = "#{@opts[:working_path]}/files/#{SweetyBacky::Utils.namerize( path )}.#{Date.today.strftime('%Y%m%d')}.#{SweetyBacky::Utils.period}.tar.gz"
|
43
|
-
|
46
|
+
md5_path = "#{backup_path}.md5"
|
47
|
+
|
48
|
+
begin
|
49
|
+
|
50
|
+
SweetyBacky::Commander.do_files_backup( path, backup_path )
|
51
|
+
SweetyBacky::Commander.do_md5( backup_path, md5_path )
|
44
52
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
)
|
53
|
+
if( @opts[:storage_system].to_sym == :s3 )
|
54
|
+
upload_databases_backup_to_s3( backup_path, md5_path )
|
55
|
+
end
|
56
|
+
|
57
|
+
success = true
|
51
58
|
|
52
|
-
|
59
|
+
rescue Exception => e
|
60
|
+
Utils.log( "ERROR: backing up file: '#{path}', e: #{e.message}" )
|
61
|
+
Utils.log( e.backtrace.join("\n") )
|
62
|
+
|
63
|
+
success = false
|
53
64
|
end
|
65
|
+
|
66
|
+
@results << { :name => "file: #{path}", :success => success }
|
54
67
|
end
|
55
68
|
end
|
56
69
|
|
57
70
|
def do_databases_backup
|
58
71
|
@opts[:databases].each do |database_name|
|
72
|
+
|
73
|
+
success = nil
|
59
74
|
backup_path = "#{@opts[:working_path]}/databases/#{database_name}.#{Date.today.strftime('%Y%m%d')}.#{SweetyBacky::Utils.period}.sql.tar.gz"
|
60
|
-
|
75
|
+
md5_path = "#{backup_path}.md5"
|
61
76
|
|
62
|
-
|
63
|
-
SweetyBacky::
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
77
|
+
begin
|
78
|
+
SweetyBacky::Commander.do_database_backup( database_name, backup_path, @opts)
|
79
|
+
SweetyBacky::Commander.do_md5( backup_path, md5_path )
|
80
|
+
|
81
|
+
if( @opts[:storage_system].to_sym == :s3 )
|
82
|
+
upload_databases_backup_to_s3( backup_path, md5_path )
|
83
|
+
end
|
84
|
+
|
85
|
+
success = true
|
68
86
|
|
69
|
-
|
87
|
+
rescue Exception => e
|
88
|
+
Utils.log( "ERROR: backing up database: '#{database_name}', e: #{e.message}" )
|
89
|
+
Utils.log( e.backtrace.join("\n") )
|
90
|
+
|
91
|
+
success = false
|
70
92
|
end
|
93
|
+
|
94
|
+
@results << { :name => "database: #{database_name}", :success => success }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
def clean
|
101
|
+
SweetyBacky::Commander.clean( @opts )
|
102
|
+
end
|
103
|
+
|
104
|
+
def print_results
|
105
|
+
Utils.log( "RESULTS:" )
|
106
|
+
Utils.log( "--------" )
|
107
|
+
|
108
|
+
@results.each do |result|
|
109
|
+
Utils.log( "#{result[:name]} -> #{result[:success] ? 'OK' : 'ERROR'}" )
|
71
110
|
end
|
72
111
|
end
|
73
112
|
|
74
113
|
def run
|
75
114
|
begin
|
76
115
|
do_backup
|
77
|
-
|
116
|
+
clean
|
117
|
+
print_results
|
78
118
|
rescue => e
|
79
119
|
SweetyBacky::Utils.log "ERROR: #{e}"
|
80
120
|
SweetyBacky::Utils.log "BACKTRACE: #{e.backtrace.join("\n")}"
|
@@ -82,6 +122,41 @@ module SweetyBacky
|
|
82
122
|
end
|
83
123
|
end
|
84
124
|
|
125
|
+
private
|
126
|
+
|
127
|
+
def upload_databases_backup_to_s3( backup_path, md5_path )
|
128
|
+
SweetyBacky::S3.upload(
|
129
|
+
backup_path,
|
130
|
+
"#{@opts[:s3_opts][:path]}/databases/#{File.basename( backup_path )}",
|
131
|
+
@opts[:s3_opts]
|
132
|
+
)
|
133
|
+
|
134
|
+
SweetyBacky::S3.upload(
|
135
|
+
backup_path,
|
136
|
+
"#{@opts[:s3_opts][:path]}/databases/#{File.basename( md5_path )}",
|
137
|
+
@opts[:s3_opts]
|
138
|
+
)
|
139
|
+
|
140
|
+
FileUtils.rm backup_path
|
141
|
+
FileUtils.rm md5_path
|
142
|
+
end
|
143
|
+
|
144
|
+
def upload_files_backup_to_s3( backup_path, md5_path )
|
145
|
+
SweetyBacky::S3.upload(
|
146
|
+
backup_path,
|
147
|
+
"#{@opts[:s3_opts][:path]}/files/#{File.basename( backup_path )}",
|
148
|
+
@opts[:s3_opts]
|
149
|
+
)
|
150
|
+
|
151
|
+
SweetyBacky::S3.upload(
|
152
|
+
md5_path,
|
153
|
+
"#{@opts[:s3_opts][:path]}/files/#{File.basename( md5_path )}",
|
154
|
+
@opts[:s3_opts]
|
155
|
+
)
|
156
|
+
|
157
|
+
FileUtils.rm backup_path
|
158
|
+
FileUtils.rm md5_path
|
159
|
+
end
|
85
160
|
|
86
161
|
end
|
87
162
|
end
|
data/lib/sweety_backy/utils.rb
CHANGED
data/lib/sweety_backy/version.rb
CHANGED
data/test/commander_test.rb
CHANGED
@@ -17,8 +17,7 @@ class CommanderTest < Test::Unit::TestCase
|
|
17
17
|
def test_do_files_backup
|
18
18
|
SweetyBacky::Commander.do_files_backup(
|
19
19
|
"#{FIXTURES_PATH}/path",
|
20
|
-
"#{@tmp_dir}/back.tar.gz"
|
21
|
-
{}
|
20
|
+
"#{@tmp_dir}/back.tar.gz"
|
22
21
|
)
|
23
22
|
|
24
23
|
result = %x(tar -tzvf #{@tmp_dir}/back.tar.gz)
|
@@ -45,7 +44,7 @@ class CommanderTest < Test::Unit::TestCase
|
|
45
44
|
end
|
46
45
|
|
47
46
|
|
48
|
-
def
|
47
|
+
def test_clean
|
49
48
|
opts = {
|
50
49
|
:paths => [ 'name1', 'name2' ],
|
51
50
|
:databases => [ 'name1', 'name2' ],
|
@@ -91,7 +90,7 @@ class CommanderTest < Test::Unit::TestCase
|
|
91
90
|
# puts @tmp_dir
|
92
91
|
# exit 1
|
93
92
|
|
94
|
-
SweetyBacky::Commander.
|
93
|
+
SweetyBacky::Commander.clean( opts )
|
95
94
|
|
96
95
|
files_keeped = Dir.glob( "#{@tmp_dir}/files/*" ).join( "\n" )
|
97
96
|
databases_keeped = Dir.glob( "#{@tmp_dir}/databases/*" ).join( "\n" )
|
@@ -128,7 +127,15 @@ class CommanderTest < Test::Unit::TestCase
|
|
128
127
|
assert_no_match( /#{file_part}.sql.tar.gz/, databases_keeped )
|
129
128
|
end
|
130
129
|
end
|
131
|
-
|
130
|
+
|
131
|
+
def test_do_md5
|
132
|
+
md5_path = "#{@tmp_dir}/#{Time.now.to_i}.md5"
|
133
|
+
fixture_file_path = "#{FIXTURES_PATH}/file_for_md5.txt"
|
132
134
|
|
135
|
+
md5 = SweetyBacky::Commander.do_md5( fixture_file_path, md5_path )
|
136
|
+
|
137
|
+
assert_equal( '75fca8d37b0f7d75d11ccc8d255debe5', md5 )
|
138
|
+
assert_equal( '75fca8d37b0f7d75d11ccc8d255debe5', File.read( md5_path ) )
|
139
|
+
end
|
133
140
|
end
|
134
141
|
|
@@ -0,0 +1 @@
|
|
1
|
+
This is the content
|
data/test/runner_test.rb
CHANGED
@@ -38,8 +38,11 @@ class RunnerTest < Test::Unit::TestCase
|
|
38
38
|
@runner.do_backup
|
39
39
|
end
|
40
40
|
|
41
|
-
assert( File.exists?( "#{@tmp_dir}/files/#{SweetyBacky::Utils.namerize( @opts[:paths][0] )}.20091231.yearly.tar.gz") )
|
42
|
-
assert( File.exists?( "#{@tmp_dir}/databases/test.20091231.yearly.sql.tar.gz") )
|
41
|
+
assert( File.exists?( "#{@tmp_dir}/files/#{SweetyBacky::Utils.namerize( @opts[:paths][0] )}.20091231.yearly.tar.gz" ) )
|
42
|
+
assert( File.exists?( "#{@tmp_dir}/databases/test.20091231.yearly.sql.tar.gz" ) )
|
43
|
+
|
44
|
+
assert( File.exists?( "#{@tmp_dir}/files/#{SweetyBacky::Utils.namerize( @opts[:paths][0] )}.20091231.yearly.tar.gz.md5" ) )
|
45
|
+
assert( File.exists?( "#{@tmp_dir}/databases/test.20091231.yearly.sql.tar.gz.md5" ) )
|
43
46
|
end
|
44
47
|
|
45
48
|
def test_do_backup_monthly
|
@@ -71,7 +74,8 @@ class RunnerTest < Test::Unit::TestCase
|
|
71
74
|
|
72
75
|
def test_run
|
73
76
|
@runner.expects(:do_backup)
|
74
|
-
|
77
|
+
@runner.expects(:print_results)
|
78
|
+
SweetyBacky::Commander.expects(:clean)
|
75
79
|
|
76
80
|
@runner.run
|
77
81
|
end
|
@@ -31,7 +31,7 @@ class CommanderS3Test < Test::Unit::TestCase
|
|
31
31
|
@bucket.destroy( true )
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
34
|
+
def test_clean
|
35
35
|
[
|
36
36
|
'name1.20081231.yearly',
|
37
37
|
'name1.20081232.yearly',
|
@@ -57,7 +57,7 @@ class CommanderS3Test < Test::Unit::TestCase
|
|
57
57
|
SweetyBacky::S3.upload( "#{FIXTURES_PATH}/file.txt", "#{@opts[:s3_opts][:path]}/databases/#{file_part}.sql.tar.gz", @opts[:s3_opts] )
|
58
58
|
end
|
59
59
|
|
60
|
-
SweetyBacky::Commander.
|
60
|
+
SweetyBacky::Commander.clean( @opts )
|
61
61
|
|
62
62
|
files_keeped = SweetyBacky::S3.paths_in( "#{@opts[:s3_opts][:path]}/files/*", @opts[:s3_opts] ).join( "\n" )
|
63
63
|
databases_keeped = SweetyBacky::S3.paths_in( "#{@opts[:s3_opts][:path]}/databases/*", @opts[:s3_opts] ).join( "\n" )
|
data/test/s3/runner_s3_test.rb
CHANGED
@@ -53,6 +53,20 @@ class RunnerS3Test < Test::Unit::TestCase
|
|
53
53
|
"test/path/databases/test.#{Date.today.strftime('%Y%m%d')}.daily.sql.tar.gz"
|
54
54
|
).exists?
|
55
55
|
)
|
56
|
+
|
57
|
+
assert(
|
58
|
+
@bucket.
|
59
|
+
object(
|
60
|
+
"test/path/files/#{SweetyBacky::Utils.namerize( @opts[:paths][0] )}.#{Date.today.strftime('%Y%m%d')}.daily.tar.gz.md5"
|
61
|
+
).exists?
|
62
|
+
)
|
63
|
+
|
64
|
+
assert(
|
65
|
+
@bucket.
|
66
|
+
object(
|
67
|
+
"test/path/databases/test.#{Date.today.strftime('%Y%m%d')}.daily.sql.tar.gz.md5"
|
68
|
+
).exists?
|
69
|
+
)
|
56
70
|
end
|
57
71
|
|
58
72
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sweety_backy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Fernando Guillen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-18 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- test/commander_test.rb
|
106
106
|
- test/fixtures/config_s3.yml
|
107
107
|
- test/fixtures/file.txt
|
108
|
+
- test/fixtures/file_for_md5.txt
|
108
109
|
- test/fixtures/path/a/file2.txt
|
109
110
|
- test/fixtures/path/b/file3.txt
|
110
111
|
- test/fixtures/path/file1.txt
|
@@ -154,6 +155,7 @@ test_files:
|
|
154
155
|
- test/commander_test.rb
|
155
156
|
- test/fixtures/config_s3.yml
|
156
157
|
- test/fixtures/file.txt
|
158
|
+
- test/fixtures/file_for_md5.txt
|
157
159
|
- test/fixtures/path/a/file2.txt
|
158
160
|
- test/fixtures/path/b/file3.txt
|
159
161
|
- test/fixtures/path/file1.txt
|