s3backup 0.6.10 → 0.7.01
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/History.txt +5 -0
- data/README.rdoc +1 -0
- data/backup.yml +1 -0
- data/lib/s3backup/manager.rb +45 -19
- data/lib/s3backup/s3wrapper.rb +1 -1
- data/lib/s3backup/tree_info.rb +22 -37
- data/lib/s3backup.rb +1 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -32,3 +32,8 @@
|
|
32
32
|
|
33
33
|
=== 0.6.10 2010-01-25
|
34
34
|
* mod bug if directory name has '#'
|
35
|
+
|
36
|
+
=== 0.7.01 2010-01-27
|
37
|
+
* mod bug if passward is not set. very sorry.
|
38
|
+
* change resume function default off. because use huge memory.
|
39
|
+
* default max_retry_count 20 to 30 because resume function change off.
|
data/README.rdoc
CHANGED
@@ -28,6 +28,7 @@ To use remotebackup,you should prepare backup configuretion file by yaml such be
|
|
28
28
|
proxy_user: login name for proxy server if you use proxy.
|
29
29
|
proxy_password: login password for proxy server if you use proxy.
|
30
30
|
log_level: 'output log level. value is debug or info or warn or error(optional default info)'
|
31
|
+
resume: 'if set true,when Ctrl-c or another program stop, next run program resume before backup. default false. caution!! this option use huge memory'
|
31
32
|
*If directories isn't specified when restore, it restores all directories in bucket.
|
32
33
|
|
33
34
|
== COMMAND:
|
data/backup.yml
CHANGED
@@ -13,3 +13,4 @@ proxy_port: 'port of proxy server(optional)'
|
|
13
13
|
proxy_user: 'user name of proxy server(optional)'
|
14
14
|
proxy_password: 'password of proxy server(optional)'
|
15
15
|
log_level: 'output log level. value is debug or info or warn or error(optional default info)'
|
16
|
+
resume: 'if set true,when Ctrl-c or another program stop, next run program resume before backup. default false. caution!! this option use huge memory'
|
data/lib/s3backup/manager.rb
CHANGED
@@ -21,6 +21,7 @@ module S3backup
|
|
21
21
|
end
|
22
22
|
def initialize(target,config)
|
23
23
|
@target = target
|
24
|
+
@resume = false
|
24
25
|
set_config(config)
|
25
26
|
end
|
26
27
|
def set_config(config)
|
@@ -33,20 +34,36 @@ module S3backup
|
|
33
34
|
S3log.error("salt format shoud be HexString and length should be 16.\n")
|
34
35
|
exit(-1)
|
35
36
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
if @buf_size > 1000*1000*1000*5
|
43
|
-
S3log.error("buffer_size must be less than 5G\n")
|
44
|
-
exit(-1)
|
45
|
-
end
|
37
|
+
@aes = Crypt.new(config["password"],config["salt"])
|
38
|
+
end
|
39
|
+
if config["buffer_size"]
|
40
|
+
if config["buffer_size"].class == String
|
41
|
+
@buf_size = config["buffer_size"].to_i
|
46
42
|
else
|
47
|
-
@buf_size =
|
43
|
+
@buf_size = config["buffer_size"]
|
48
44
|
end
|
49
|
-
@
|
45
|
+
if @buf_size > 1000*1000*1000*5
|
46
|
+
S3log.error("buffer_size must be less than 5G\n")
|
47
|
+
exit(-1)
|
48
|
+
end
|
49
|
+
else
|
50
|
+
@buf_size = DEFAULT_BUF_READ_SIZE
|
51
|
+
end
|
52
|
+
if config["buffer_size"]
|
53
|
+
if config["buffer_size"].class == String
|
54
|
+
@buf_size = config["buffer_size"].to_i
|
55
|
+
else
|
56
|
+
@buf_size = config["buffer_size"]
|
57
|
+
end
|
58
|
+
if @buf_size > 1000*1000*1000*5
|
59
|
+
S3log.error("buffer_size must be less than 5G\n")
|
60
|
+
exit(-1)
|
61
|
+
end
|
62
|
+
else
|
63
|
+
@buf_size = DEFAULT_BUF_READ_SIZE
|
64
|
+
end
|
65
|
+
if config["resume"] == true
|
66
|
+
@resume = true
|
50
67
|
end
|
51
68
|
end
|
52
69
|
#指定されたディレクトリをtar gzip形式で圧縮する
|
@@ -175,17 +192,25 @@ module S3backup
|
|
175
192
|
#前回と今回のファイル・ツリーを比較
|
176
193
|
diff_info = tree_info.diff(old_tree)
|
177
194
|
S3log.debug("diff_info=#{diff_info.inspect}")
|
178
|
-
|
195
|
+
dir_map = nil
|
196
|
+
if @resume
|
197
|
+
new_dir_map = tree_info.make_dir_map
|
198
|
+
old_dir_map = old_tree.make_dir_map
|
199
|
+
else
|
200
|
+
#メモリ節約のため開放
|
201
|
+
old_tree = nil
|
202
|
+
end
|
179
203
|
update_dir = diff_info[:directory][:add] + diff_info[:directory][:modify]
|
180
204
|
#更新されたディレクトリをアップロード
|
181
205
|
update_dir.each do |udir|
|
182
206
|
GC.start
|
183
207
|
store_directory(udir)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
208
|
+
if @resume
|
209
|
+
#前回のファイル・ツリー情報のうち、今回アップデートしたディレクトリ情報ファイル情報を更新
|
210
|
+
old_dir_map = old_tree.update_dir(udir,old_dir_map,new_dir_map[udir])
|
211
|
+
#更新したファイル・ツリー情報をアップロード(途中で失敗しても、resumeできるようにするため。)
|
212
|
+
@target.post(target_tree_name,old_tree.dump_yaml)
|
213
|
+
end
|
189
214
|
end
|
190
215
|
diff_info[:directory][:remove].each do |rm_dir|
|
191
216
|
delete_direcory(rm_dir)
|
@@ -226,6 +251,7 @@ module S3backup
|
|
226
251
|
return dirs.compact
|
227
252
|
end
|
228
253
|
def expand_tree(dir,tree_info,output_dir)
|
254
|
+
now = Time.new
|
229
255
|
tree = tree_info.hierarchie(dir)
|
230
256
|
top = tree[0].keys[0]
|
231
257
|
top_dir = File.dirname(top)
|
@@ -241,7 +267,7 @@ module S3backup
|
|
241
267
|
dir_len = k.length
|
242
268
|
relative_path = k.slice(top_dir_len,dir_len - top_dir_len)
|
243
269
|
dir = output_dir + relative_path
|
244
|
-
File.utime(
|
270
|
+
File.utime(now,v[:mtime],dir)
|
245
271
|
end
|
246
272
|
}
|
247
273
|
end
|
data/lib/s3backup/s3wrapper.rb
CHANGED
data/lib/s3backup/tree_info.rb
CHANGED
@@ -3,25 +3,17 @@ module S3backup
|
|
3
3
|
class TreeInfo
|
4
4
|
attr_reader :fileMap
|
5
5
|
def initialize(target)
|
6
|
-
@dir_map={}
|
7
|
-
@orig = nil
|
8
6
|
if target.nil?
|
9
7
|
@fileMap = {:file => Hash.new,:symlink => Hash.new,:directory => Hash.new}
|
10
8
|
elsif File.directory?(target)
|
11
|
-
@orig = {:type=>"directory",:target=>target}
|
12
9
|
@fileMap = {:file => Hash.new,:symlink => Hash.new,:directory => Hash.new}
|
13
10
|
stat = File.stat(target)
|
14
|
-
@fileMap[:directory][target] = {:mtime => stat.mtime
|
15
|
-
@dir_map[target] = {:mtime => stat.mtime, :atime => stat.atime,:file=>{},:symlink=>{}}
|
11
|
+
@fileMap[:directory][target] = {:mtime => stat.mtime}
|
16
12
|
makeFileMap(target)
|
17
13
|
elsif File.file?(target)
|
18
|
-
@orig = {:type=>"file",:target=>target}
|
19
14
|
load_yaml(File.read(target))
|
20
|
-
make_dir_map
|
21
15
|
else
|
22
|
-
@orig = {:type=>"data",:target=>""}
|
23
16
|
load_yaml(target)
|
24
|
-
make_dir_map
|
25
17
|
end
|
26
18
|
end
|
27
19
|
def makeFileMap(dir)
|
@@ -32,69 +24,62 @@ module S3backup
|
|
32
24
|
name = dir + "/" + e
|
33
25
|
if File.directory?(name)
|
34
26
|
stat = File.stat(name)
|
35
|
-
@
|
36
|
-
@fileMap[:directory][name] = {:mtime => stat.mtime, :atime => stat.atime}
|
27
|
+
@fileMap[:directory][name] = {:mtime => stat.mtime}
|
37
28
|
makeFileMap(name)
|
38
29
|
elsif File.symlink?(name)
|
39
|
-
@dir_map[dir][:symlink][name] = {:source => File.readlink(name)}
|
40
30
|
@fileMap[:symlink][name] = {:source => File.readlink(name)}
|
41
31
|
else
|
42
32
|
stat = File.stat(name)
|
43
|
-
@dir_map[dir][:file][name] ={:size => stat.size,:date => stat.mtime}
|
44
33
|
@fileMap[:file][name] = {:size => stat.size,:date => stat.mtime}
|
45
34
|
end
|
46
35
|
end
|
47
36
|
end
|
48
37
|
def make_dir_map
|
38
|
+
dir_map = {};
|
49
39
|
@fileMap[:directory].each do |k,v|
|
50
|
-
|
40
|
+
dir_map[k] = {:mtime => v[:mtime],:file=>{},:symlink=>{}}
|
51
41
|
end
|
52
42
|
@fileMap[:file].each do |k,v|
|
53
|
-
target =
|
43
|
+
target = dir_map[File.dirname(k)]
|
54
44
|
#不整合だけど適当に作る
|
55
45
|
unless target
|
56
|
-
S3log.warn("Tree Data isn't correct
|
57
|
-
target = {:mtime => DateTime.now.to_s,:
|
58
|
-
|
46
|
+
S3log.warn("Tree Data isn't correct.")
|
47
|
+
target = {:mtime => DateTime.now.to_s,:file=>{},:symlink=>{}}
|
48
|
+
dir_map[File.dirname(k)] = target
|
59
49
|
end
|
60
50
|
target[:file][k] = {:size => v[:size], :date => v[:date]}
|
61
51
|
end
|
62
52
|
@fileMap[:symlink].each do |k,v|
|
63
|
-
target =
|
53
|
+
target = dir_map[File.dirname(k)]
|
64
54
|
#不整合だけど適当に作る
|
65
55
|
unless target
|
66
|
-
S3log.warn("Tree Data isn't correct
|
67
|
-
target = {:mtime => DateTime.now.to_s,:
|
68
|
-
|
56
|
+
S3log.warn("Tree Data isn't correct.")
|
57
|
+
target = {:mtime => DateTime.now.to_s,:file=>{},:symlink=>{}}
|
58
|
+
dir_map[File.dirname(k)] = target
|
69
59
|
end
|
70
60
|
target[:symlink][k] = {:source => v[:source]}
|
71
61
|
end
|
62
|
+
return dir_map;
|
72
63
|
end
|
73
|
-
def
|
74
|
-
|
75
|
-
|
76
|
-
def update_dir_map(name,dir_info)
|
77
|
-
@dir_map[name][:file] = dir_info[:file]
|
78
|
-
@dir_map[name][:symlink] = dir_info[:symlink]
|
79
|
-
@dir_map[name][:mtime] = dir_info[:mtime]
|
80
|
-
@dir_map[name][:atime] = dir_info[:atime]
|
81
|
-
end
|
82
|
-
def update_dir(name,dir_info)
|
83
|
-
@dir_map[name] = {:file => {},:symlink=>{}} unless @dir_map[name]
|
84
|
-
@dir_map[name][:file].each do |k,v|
|
64
|
+
def update_dir(name,dir_map,dir_info)
|
65
|
+
dir_map[name] = {:file => {},:symlink=>{}} unless dir_map[name]
|
66
|
+
dir_map[name][:file].each do |k,v|
|
85
67
|
@fileMap[:file].delete(k)
|
86
68
|
end
|
87
|
-
|
69
|
+
dir_map[name][:symlink].each do |k,v|
|
88
70
|
@fileMap[:symlink].delete(k)
|
89
71
|
end
|
90
|
-
@fileMap[:directory][name] = {:mtime => dir_info[:mtime]
|
72
|
+
@fileMap[:directory][name] = {:mtime => dir_info[:mtime]}
|
91
73
|
dir_info[:file].each do |k,v|
|
92
74
|
@fileMap[:file][k] = v
|
93
75
|
end
|
94
76
|
dir_info[:symlink].each do |k,v|
|
95
77
|
@fileMap[:symlink][k] = v
|
96
78
|
end
|
97
|
-
|
79
|
+
dir_map[name][:file] = dir_info[:file]
|
80
|
+
dir_map[name][:symlink] = dir_info[:symlink]
|
81
|
+
dir_map[name][:mtime] = dir_info[:mtime]
|
82
|
+
return dir_map
|
98
83
|
end
|
99
84
|
def load_yaml(data)
|
100
85
|
@fileMap = YAML.load(data)
|
data/lib/s3backup.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.01
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takeshi Morita
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-27 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|