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 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