s3backup 0.6.10 → 0.7.01

Sign up to get free protection for your applications and to get access to all the features.
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'
@@ -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
- if config["buffer_size"]
37
- if config["buffer_size"].class == String
38
- @buf_size = config["buffer_size"].to_i
39
- else
40
- @buf_size = config["buffer_size"]
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 = DEFAULT_BUF_READ_SIZE
43
+ @buf_size = config["buffer_size"]
48
44
  end
49
- @aes = Crypt.new(config["password"],config["salt"])
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
- udir_info = tree_info.get_dir_info(udir)
185
- #前回のファイル・ツリー情報のうち、今回アップデートしたディレクトリ情報ファイル情報を更新
186
- old_tree.update_dir(udir,udir_info)
187
- #更新したファイル・ツリー情報をアップロード(途中で失敗しても、resumeできるようにするため。)
188
- @target.post(target_tree_name,old_tree.dump_yaml)
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(v[:atime],v[:mtime],dir)
270
+ File.utime(now,v[:mtime],dir)
245
271
  end
246
272
  }
247
273
  end
@@ -3,7 +3,7 @@ require 'aws/s3'
3
3
  module S3backup
4
4
  class S3Wrapper
5
5
  attr_reader :bucket
6
- DEFAULT_MAX_RETRY_COUNT = 20
6
+ DEFAULT_MAX_RETRY_COUNT = 30
7
7
  def initialize(config,create_flg)
8
8
  @bucket= nil
9
9
  @s3objects =nil
@@ -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, :atime => stat.atime}
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
- @dir_map[name] = {:mtime => stat.mtime, :atime => stat.atime,:file=>{},:symlink=>{}}
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
- @dir_map[k] = {:mtime => v[:mtime], :atime => v[:atime],:file=>{},:symlink=>{}}
40
+ dir_map[k] = {:mtime => v[:mtime],:file=>{},:symlink=>{}}
51
41
  end
52
42
  @fileMap[:file].each do |k,v|
53
- target = @dir_map[File.dirname(k)]
43
+ target = dir_map[File.dirname(k)]
54
44
  #不整合だけど適当に作る
55
45
  unless target
56
- S3log.warn("Tree Data isn't correct.#{@orig.inspect}")
57
- target = {:mtime => DateTime.now.to_s,:atime => DateTime.now.to_s,:file=>{},:symlink=>{}}
58
- @dir_map[File.dirname(k)] = target
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 = @dir_map[File.dirname(k)]
53
+ target = dir_map[File.dirname(k)]
64
54
  #不整合だけど適当に作る
65
55
  unless target
66
- S3log.warn("Tree Data isn't correct.#{@orig.inspect}")
67
- target = {:mtime => DateTime.now.to_s,:atime => DateTime.now.to_s,:file=>{},:symlink=>{}}
68
- @dir_map[File.dirname(k)] = target
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 get_dir_info(name)
74
- return @dir_map[name]
75
- end
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
- @dir_map[name][:symlink].each do |k,v|
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],:atime =>dir_info[:atime]}
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
- update_dir_map(name,dir_info)
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
@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  module S3backup
5
- VERSION = '0.6.10'
5
+ VERSION = '0.7.01'
6
6
  end
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.6.10
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-25 00:00:00 +09:00
12
+ date: 2010-01-27 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency