encbs 0.2.1.beta2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1.beta2
1
+ 0.2.1
data/bin/encbs CHANGED
@@ -168,21 +168,29 @@ begin
168
168
  exit
169
169
  end
170
170
 
171
- #TODO: Support rescue option as hash
172
171
  if opts.rescue?
173
172
  paths = opts[:rescue].split(" ")
174
173
  jars_list = @backup.jars
174
+ puts jars_list
175
175
 
176
- include_path = lambda {|path| jars_list.keys.include? path}
176
+ include_path = lambda {|path| jars_list.has_key?(path)}
177
177
 
178
178
  jars_hashes = paths.map do |path|
179
- path = File.expand_path path
179
+ unless path.length == 32 and path.match /[0-9a-f]{32}/
180
+ path = File.expand_path path
180
181
 
181
- unless include_path[path] or include_path["#{path}/"]
182
- puts_fail "Jar \"#{path}\" not exists."
183
- end
182
+ unless include_path[path] or include_path["#{path}/"]
183
+ puts_fail "Jar \"#{path}\" not exists."
184
+ end
184
185
 
185
- jars_list[path] || jars_list["#{path}/"]
186
+ jars_list[path] || jars_list["#{path}/"]
187
+ else
188
+ unless jars_list.has_value? path
189
+ puts_fail "Jar with hash \"#{path}\" not exists."
190
+ else
191
+ path
192
+ end
193
+ end
186
194
  end
187
195
 
188
196
  if opts.to?
@@ -192,14 +200,10 @@ begin
192
200
  @to = "/"
193
201
  end
194
202
 
195
- #TODO: Confirm flag
196
- #TODO: Empty destination directory
197
-
198
203
  @index = {}
199
204
 
200
205
  jars_hashes.each do |hash|
201
206
  versions = @backup.jar_versions(hash)
202
- # puts "Versions: #{versions}" #FIXME
203
207
 
204
208
  last_version = Backup::Timestamp.last_from(versions, @end_date, @start_date)
205
209
 
@@ -231,7 +235,7 @@ begin
231
235
  meta = YAML::load open("/var/tmp/encbs.swap").read
232
236
  jar_path, timestamp = meta[:jar_path], meta[:timestamp]
233
237
  dirs = @backup.file_item.dir File.expand_path("../", jar_path)
234
-
238
+
235
239
  if dirs.include? File.basename(jar_path)
236
240
  meta.delete :timestamp
237
241
  meta.delete :jar_path
@@ -240,11 +244,11 @@ begin
240
244
  "#{jar_path}/#{timestamp}.yml",
241
245
  meta.to_yaml
242
246
  )
243
-
247
+
244
248
  FileUtils.rm "/var/tmp/encbs.swap"
245
249
  end
246
250
  end
247
-
251
+
248
252
  if opts.add?
249
253
  paths = opts[:add].split(" ")
250
254
  else
data/encbs.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{encbs}
8
- s.version = "0.2.1.beta2"
8
+ s.version = "0.2.1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Timothy Klim"]
12
- s.date = %q{2011-06-03}
12
+ s.date = %q{2011-06-04}
13
13
  s.default_executable = %q{encbs}
14
14
  s.description = %q{Simple backup system for pushing into cloud}
15
15
  s.email = %q{klimtimothy@gmail.com}
@@ -39,12 +39,14 @@ Gem::Specification.new do |s|
39
39
  "lib/helpers.rb",
40
40
  "test/fixtures/etc/.hide",
41
41
  "test/fixtures/etc/root/file",
42
- "test/fixtures/test_crypto.rb",
42
+ "test/fixtures/rsa_key.private",
43
+ "test/fixtures/rsa_key.public",
43
44
  "test/helper.rb",
44
45
  "test/test_backup.rb",
45
46
  "test/test_backup_file_item.rb",
46
47
  "test/test_backup_timestamp.rb",
47
- "test/test_jar.rb"
48
+ "test/test_config.rb",
49
+ "test/test_crypto.rb"
48
50
  ]
49
51
  s.homepage = %q{http://github.com/TimothyKlim/encbs}
50
52
  s.licenses = ["MIT"]
@@ -4,7 +4,7 @@ module Backup
4
4
  module FileItem
5
5
  class Local < Backup::FileItem::Base
6
6
  attr_reader :timeout
7
-
7
+
8
8
  def initialize
9
9
  @timeout = 0
10
10
  end
@@ -27,7 +27,7 @@ module Backup
27
27
  f.read
28
28
  end if File.exists? file
29
29
  end
30
-
30
+
31
31
  def timeout= time
32
32
  end
33
33
 
data/lib/backup/jar.rb CHANGED
@@ -28,14 +28,14 @@ module Backup
28
28
  @local_files.keys.each do |file|
29
29
  current = @local_files[file].dup
30
30
  current.delete(:timestamp)
31
-
31
+
32
32
  unless @last_index[file].nil?
33
33
  backup = @last_index[file].dup
34
34
  backup.delete(:timestamp)
35
-
35
+
36
36
  if (current == backup) or
37
37
  (!current[:checksum].nil? and current[:checksum] == backup[:checksum])
38
-
38
+
39
39
  @meta_index[file] = @local_files[file]
40
40
  @meta_index[file][:timestamp] = @last_index[file][:timestamp]
41
41
  end
@@ -72,10 +72,8 @@ module Backup
72
72
  @local_files.keys.count
73
73
  )
74
74
  end
75
-
76
- pbar.bar_mark = '*'
77
75
 
78
- #@local_files = @meta_index.select {|k, v| v[:timestamp] == @timestamp if v.is_a? Hash}
76
+ pbar.bar_mark = '*'
79
77
 
80
78
  begin
81
79
  @local_files.keys.each do |file|
@@ -88,15 +86,15 @@ module Backup
88
86
  data = compression.compress(data.read, 3) unless compression.nil?
89
87
 
90
88
  data = @key.encrypt_to_stream(data) if @key
91
-
89
+
92
90
  @file_item.create_file_once(
93
91
  "#{jar_data_path}/#{@file_item.file_hash file}",
94
92
  data
95
93
  )
96
-
94
+
97
95
  pbar.inc
98
96
  end
99
-
97
+
100
98
  @meta_index[file] = @local_files[file]
101
99
  @meta_index[file][:checksum] = checksum
102
100
  @meta_index[file][:timestamp] = @timestamp
@@ -110,7 +108,7 @@ module Backup
110
108
  File.open("/var/tmp/encbs.swap", "w") do |f|
111
109
  f.puts @meta_index.to_yaml
112
110
  end
113
-
111
+
114
112
  puts
115
113
  puts_fail "Index file has been saved that to allow upload into cloud in next run."
116
114
  else
@@ -125,7 +123,7 @@ module Backup
125
123
  puts "Removing previous backups..."
126
124
  previous_versions = Jar.jar_versions @file_item, @root_path, jar_hash, true
127
125
  previous_versions.delete @timestamp
128
-
126
+
129
127
  previous_versions.each do |version|
130
128
  @file_item.delete_file "#{meta_jar_path}/#{version}.yml"
131
129
  @file_item.delete_dir "#{@root_path}/#{jar_hash}/#{version}"
@@ -16,7 +16,7 @@ module Backup
16
16
  sec = 59 if sec.nil?
17
17
  end
18
18
 
19
- time = Time.new(year + 2000, month, day, hour, min, sec, 0)
19
+ time = Time.utc(year + 2000, month, day, hour, min, sec, 0)
20
20
  end
21
21
 
22
22
  def self.last_from(list, end_date, start_date = nil)
data/lib/backup.rb CHANGED
@@ -33,7 +33,11 @@ module Backup
33
33
  end
34
34
 
35
35
  def rsa_key path, size
36
- @key = Crypto::Key.from_file(path, size)
36
+ if File.exists? path
37
+ @key = Crypto::Key.from_file(path, size)
38
+ else
39
+ @key = nil
40
+ end
37
41
  end
38
42
 
39
43
  def create! local_path, increment = false, purge_previous = false
@@ -51,6 +55,7 @@ module Backup
51
55
 
52
56
  def restore_jar_to(hash, timestamp, to)
53
57
  files = Jar.fetch_index_for(@file_item, @root_path, hash, timestamp)
58
+ puts_fail "Jar doesn't exists" if files.nil?
54
59
 
55
60
  unless files[:checksum].nil?
56
61
  if @key.nil? or
@@ -85,7 +90,7 @@ module Backup
85
90
  File.chown current_file[:uid], current_file[:gid], restore_file
86
91
 
87
92
  file_ok = @file_item.stat(restore_file)[restore_file]
88
-
93
+
89
94
  check_mode(restore_file, file_ok[:mode], current_file[:mode])
90
95
  check_rights(
91
96
  restore_file,
@@ -106,7 +111,7 @@ module Backup
106
111
  remote_path += "/#{@file_item.file_hash file}"
107
112
 
108
113
  data = @file_item.read_file(remote_path)
109
- data = @key.decrypt_from_stream data if @key
114
+ data = @key.decrypt_from_stream data.chomp if @key
110
115
 
111
116
  unless compression.nil?
112
117
  data = compression.decompress(data.chomp).read
@@ -116,7 +121,7 @@ module Backup
116
121
  end
117
122
 
118
123
  file_ok = @file_item.stat(restore_file)[restore_file]
119
-
124
+
120
125
  check_mode(restore_file, file_ok[:mode], current_file[:mode])
121
126
  check_rights(
122
127
  restore_file,
data/lib/crypto.rb CHANGED
@@ -2,42 +2,42 @@ require 'openssl'
2
2
  require 'base64'
3
3
 
4
4
  module Crypto
5
-
6
5
  def self.create_keys(priv, pub, bits)
7
6
  private_key = OpenSSL::PKey::RSA.new(bits)
8
7
  File.open(priv, "w+") { |fp| fp << private_key.to_s }
9
- File.open(pub, "w+") { |fp| fp << private_key.public_key.to_s }
8
+ File.open(pub, "w+") { |fp| fp << private_key.public_key.to_s }
10
9
  private_key
11
10
  end
12
-
11
+
13
12
  class Key
14
13
  def initialize(data, size)
15
14
  @public = (data =~ /^-----BEGIN (RSA|DSA) PRIVATE KEY-----$/).nil?
16
15
  @key = OpenSSL::PKey::RSA.new(data)
17
16
  @size = (size == 4096 ? 512 : 256)
18
17
  end
19
-
18
+
20
19
  def self.from_file(filename, size = 4096)
21
20
  self.new(File.read(filename), size)
22
21
  end
23
22
 
24
23
  def encrypt_to_stream(data)
25
24
  encrypt_data = StringIO.new
25
+ data = data.read if data.is_a? StringIO
26
26
  i = 0
27
-
27
+
28
28
  while buf = data[i..(i+=117)] do
29
29
  encrypt_data << encrypt(buf)
30
30
  end
31
-
31
+
32
32
  encrypt_data.seek 0
33
33
  encrypt_data
34
34
  end
35
35
 
36
36
  def decrypt_from_stream(data)
37
- encrypt_data = StringIO.new(data.chomp)
37
+ encrypt_data = StringIO.new data
38
38
  encrypt_data.seek 0
39
39
  decrypt_data = ""
40
-
40
+
41
41
  while buf = encrypt_data.read(@size) do
42
42
  decrypt_data += decrypt(buf)
43
43
  end
@@ -50,23 +50,23 @@ module Crypto
50
50
  rescue Exception => e
51
51
  puts_fail "RSA encrypt error: #{e.message}"
52
52
  end
53
-
53
+
54
54
  def decrypt(text)
55
55
  @key.send("#{key_type}_decrypt", text)
56
56
  rescue Exception => e
57
57
  puts_fail "RSA decrypt error: #{e.message}"
58
58
  end
59
-
59
+
60
60
  def private?
61
61
  !@public
62
62
  end
63
-
63
+
64
64
  def public?
65
65
  @public
66
66
  end
67
-
67
+
68
68
  def key_type
69
69
  @public ? :public : :private
70
70
  end
71
71
  end
72
- end
72
+ end
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEAsSCSU+4EkDC6wGiOOOQ8g5un1/6NRupxXFljghEDzOiNJklL
3
+ yY27EAsmFYw8+Z3KWl2WM9qTB/VxqbXn3CSzjh0bG/cpw8S35d5pARZFbKHGYut+
4
+ K3bl7x8dJ4lQukuNJe8Z8MgNjwm16T2M0DCPTGroHpJducuk/vOH5C1udPvAndpO
5
+ o2Nt28gSqaP2bduQ6aAX5bMKuD2ArW3b5jLMEEuoPPG1w1GNxVfcwO5ggsBy7IJk
6
+ 2t4yh42VGkGJ5BbWRnM7zOy6nXxQ7sDZtWAxxOpA4N2l1S9mVk2EsfAco6G/QR3X
7
+ Tyid2yOj+yAfwyhuF+u5K35CbU+7jI47vZGXJwIDAQABAoIBAQCEvDvr2Xph86J/
8
+ fdrWl3MhzQvCuWd1tUquQe5oEggfDkZ4YoUAzc1ZAIHRs/4dsTlq7qcYxLtaQ3yi
9
+ CUdvmbFU1krycg5CPrDw+fMGdYIhHjpk9sTeHYPB5jca4bQ1Z1inDL8LyV8fyc8g
10
+ spdLjJhWU+cOwfCqwwkqZaV4QPN9hcxh8xyMzh7vhAkOGI/1DNNqh3Bk81hWmulF
11
+ wuWCiUetuhl1kbVuFSx68jDEVEp2B2sap6VmNBas+IYCyi7fUvFahRDGaZrHFIZK
12
+ 4wSBwMlmOr4qjMUbq/OYgN4jh5VNMZJfZ1drb5XR/Qxj9/Ih9bnk7TLxJld2ShPd
13
+ FI2eTUWBAoGBANlYhMgeiwU9ij5h2c8u/d8XO8yA3+DgOphe4PlybgyvNQ5DFiGM
14
+ gyl31QWoclfsjkxhq1sKqjD2qkQUOKbgaFs5kQVmokYW2YMTP1T3JqVgXXdnn+Tv
15
+ GsnDxQj+An78F9f82aynfz+lXpPP5bT9hftlTrbDa9Q0K+EB+A5Ug/H5AoGBANCg
16
+ 8/QxI2iWuE0IxYjhDnCwWWU5r9tvvi98e4/QpGBZR/ABjkrHyR/Jvn6Srr9uh2F0
17
+ WVo5J+Mz0P6QcCD5PzhNBwRXOXoRi1cjjshQm6dLd18ms08tzM6XA3ciclgysxBr
18
+ ihAebhra+P0l6NxQFNANMRbD2SwlMvrSb0G0JBofAoGBAIUCmggKQRPM7Ixuv6f+
19
+ XxknE858VAY/0zwqXE3sDJMwqix3O9T+M8qt7izPQGK0fwUZhI9rwGnEmsCdC2p8
20
+ zQB/A1Ql0ktIcoa3wbtSoVD1311SilTFS0SMzUlKgeaKimEA+Ymi28nsfyvAQBh6
21
+ SoNmJTzN7XBpGS1TUiYa7MCpAoGAasYFNLO1YIDKwDo+BqjQICJRDjpw40iUOG9o
22
+ OZlZlyn6ZD4XmfQX3hn9UYA2ySiDRwAp/sADxwcs7iv0BxwpG+JoNfOCKhQykR1U
23
+ pPaEQyGfbWY8HMje6dhl4KITjUodVMkE9uzsAviQt9agD6k4jaZCuljvm+VJ6w6p
24
+ /CF63JcCgYEAhMRz0pr4OeI5yF2Qyx4EjCLLHSobCYjad0euR0b9hdOBMahHMUrM
25
+ pjqZ7MOOKPUGsJNe1jBmwvSn//GqERa1vBa1VY2E27mtVV51AMTy21lyF2Z6CTqp
26
+ qDf8d1SozgCkK+v9v4DiQmDAHQsGW+1YSH4tu9FFP78tXxTOfYP+Qsg=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,8 @@
1
+ -----BEGIN RSA PUBLIC KEY-----
2
+ MIIBCgKCAQEAsSCSU+4EkDC6wGiOOOQ8g5un1/6NRupxXFljghEDzOiNJklLyY27
3
+ EAsmFYw8+Z3KWl2WM9qTB/VxqbXn3CSzjh0bG/cpw8S35d5pARZFbKHGYut+K3bl
4
+ 7x8dJ4lQukuNJe8Z8MgNjwm16T2M0DCPTGroHpJducuk/vOH5C1udPvAndpOo2Nt
5
+ 28gSqaP2bduQ6aAX5bMKuD2ArW3b5jLMEEuoPPG1w1GNxVfcwO5ggsBy7IJk2t4y
6
+ h42VGkGJ5BbWRnM7zOy6nXxQ7sDZtWAxxOpA4N2l1S9mVk2EsfAco6G/QR3XTyid
7
+ 2yOj+yAfwyhuF+u5K35CbU+7jI47vZGXJwIDAQAB
8
+ -----END RSA PUBLIC KEY-----
data/test/test_backup.rb CHANGED
@@ -1,11 +1,9 @@
1
- require File.expand_path("../helper.rb", __FILE__)
1
+ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class TestBackup < Test::Unit::TestCase
4
4
  def setup
5
5
  @backups_path = File.expand_path("../fixtures/backups", __FILE__)
6
-
7
- FileUtils.rm_r @backups_path, :force => true
8
- FileUtils.mkdir_p @backups_path
6
+ @restore_path = File.expand_path("../fixtures/restore", __FILE__)
9
7
 
10
8
  @hostname = Socket.gethostname
11
9
 
@@ -15,6 +13,26 @@ class TestBackup < Test::Unit::TestCase
15
13
  )
16
14
  end
17
15
 
16
+ def teardown
17
+ FileUtils.rm_r @backups_path, :force => true
18
+ FileUtils.rm_r @restore_path, :force => true
19
+
20
+ FileUtils.mkdir_p @backups_path
21
+ FileUtils.mkdir_p @restore_path
22
+
23
+ File.open(File.expand_path('../fixtures/etc/root/file', __FILE__), 'w') do |f|
24
+ f.puts "Root file\n"
25
+ end
26
+ end
27
+
28
+ def create_backup! increment = false
29
+ @local_path = File.expand_path('../fixtures/etc', __FILE__)
30
+ @local_path_hash = Digest::MD5.hexdigest @local_path
31
+
32
+ @timestamp = @backup.create! @local_path, increment, false
33
+ @back_path = "#{@backups_path}/#{@hostname}"
34
+ end
35
+
18
36
  def test_backup_attributes
19
37
  assert_equal(
20
38
  @backup.root_path,
@@ -26,36 +44,131 @@ class TestBackup < Test::Unit::TestCase
26
44
  end
27
45
 
28
46
  def test_create
29
- local_path = File.expand_path('../fixtures/etc', __FILE__)
30
- local_path_hash = Digest::MD5.hexdigest local_path
47
+ create_backup!
48
+
49
+ assert File.exists?("#{@back_path}")
50
+ assert File.exists?("#{@back_path}/meta")
51
+ assert File.exists?("#{@back_path}/meta/#{@local_path_hash}")
52
+ assert File.exists?("#{@back_path}/meta/#{@local_path_hash}/#{@timestamp}.yml")
53
+ assert File.exists?("#{@back_path}/meta/jars")
54
+ assert File.exists?("#{@back_path}/meta/jars/#{@local_path_hash}")
55
+ assert File.exists?("#{@back_path}/#{@local_path_hash}")
31
56
 
32
- timestamp = @backup.create! local_path, false, false
33
- back_path = "#{@backups_path}/#{@hostname}"
57
+ assert_equal "#{@local_path}/", open(
58
+ "#{@back_path}/meta/jars/#{@local_path_hash}"
59
+ ).read.chomp
34
60
 
35
- assert File.exists?("#{back_path}")
36
- assert File.exists?("#{back_path}/meta")
37
- assert File.exists?("#{back_path}/meta/#{local_path_hash}")
38
- assert File.exists?("#{back_path}/meta/#{local_path_hash}/#{timestamp}.yml")
39
- assert File.exists?("#{back_path}/meta/jars")
40
- assert File.exists?("#{back_path}/meta/jars/#{local_path_hash}")
41
- assert File.exists?("#{back_path}/#{local_path_hash}")
61
+ meta_index = YAML::load open(
62
+ "#{@back_path}/meta/#{@local_path_hash}/#{@timestamp}.yml"
63
+ ).read
42
64
 
43
- assert_equal "#{local_path}/", open("#{back_path}/meta/jars/#{local_path_hash}").read.chomp
44
- meta_index = YAML::load open("#{back_path}/meta/#{local_path_hash}/#{timestamp}.yml").read
45
- assert meta_index.has_key? local_path
65
+ assert meta_index.has_key? @local_path
46
66
 
47
67
  root_file = File.expand_path '../fixtures/etc/root/file', __FILE__
48
68
  assert_equal open(root_file).read, open(
49
- "#{back_path}/#{local_path_hash}/#{timestamp}/#{Digest::MD5.hexdigest root_file}"
69
+ "#{@back_path}/#{@local_path_hash}/#{@timestamp}/#{Digest::MD5.hexdigest root_file}"
70
+ ).read
71
+ end
72
+
73
+ def test_create_with_crypt
74
+ @backup.rsa_key(
75
+ File.expand_path('../fixtures/rsa_key.public', __FILE__),
76
+ 2048
77
+ )
78
+ private_key = Crypto::Key.from_file(
79
+ File.expand_path('../fixtures/rsa_key.private', __FILE__),
80
+ 2048
81
+ )
82
+
83
+ create_backup!
84
+
85
+ root_file = File.expand_path '../fixtures/etc/root/file', __FILE__
86
+ root_file_content = open(root_file).read
87
+
88
+ root_file_crypt_content = open(
89
+ "#{@back_path}/#{@local_path_hash}/#{@timestamp}/#{Digest::MD5.hexdigest root_file}"
90
+ ).read
91
+
92
+ assert_not_equal root_file_content, root_file_crypt_content
93
+ assert_equal root_file_content, private_key.decrypt_from_stream(
94
+ root_file_crypt_content.chomp
95
+ )
96
+ end
97
+
98
+ def test_show_jars
99
+ create_backup!
100
+
101
+ jars = @backup.jars
102
+
103
+ assert jars.has_key? "#{@local_path}/"
104
+ assert_equal jars["#{@local_path}/"], Digest::MD5.hexdigest(@local_path)
105
+ end
106
+
107
+ def test_jar_versions
108
+ create_backup!
109
+
110
+ jar_timestamp = @backup.jar_versions @local_path
111
+
112
+ assert_equal @timestamp, jar_timestamp.first
113
+ end
114
+
115
+ def test_restore
116
+ create_backup!
117
+ restore_path = File.expand_path '../fixtures/restore', __FILE__
118
+
119
+ @backup.restore_jar_to @local_path_hash, @timestamp, restore_path
120
+
121
+ assert "#{@restore_path}/#{@local_path}"
122
+ assert "#{@restore_path}/#{@local_path}/etc/root/file"
123
+
124
+ root_file_content = open(
125
+ File.expand_path '../fixtures/etc/root/file', __FILE__
126
+ ).read
127
+ assert_equal root_file_content, open(
128
+ "#{@restore_path}/#{@local_path}/root/file"
50
129
  ).read
51
130
  end
52
131
 
53
- #def test_show_jars
54
- #end
132
+ def test_restore_with_decrypt
133
+ @backup.rsa_key(
134
+ File.expand_path('../fixtures/rsa_key.public', __FILE__),
135
+ 2048
136
+ )
137
+ create_backup!
55
138
 
56
- #def test_jar_versions
57
- #end
139
+ restore_path = File.expand_path '../fixtures/restore', __FILE__
140
+ @backup.rsa_key(
141
+ File.expand_path('../fixtures/rsa_key.private', __FILE__),
142
+ 2048
143
+ )
144
+ @backup.restore_jar_to @local_path_hash, @timestamp, restore_path
145
+
146
+ root_file_content = open(
147
+ File.expand_path '../fixtures/etc/root/file', __FILE__
148
+ ).read
149
+ root_file_decrypt_content = open(
150
+ "#{@restore_path}/#{@local_path}/root/file"
151
+ ).read
152
+
153
+ assert_equal root_file_content, root_file_decrypt_content
154
+ end
155
+
156
+ def test_increment_backup
157
+ create_backup!
58
158
 
59
- #def test_restore
60
- #end
159
+ File.open(File.expand_path('../fixtures/etc/root/file', __FILE__), 'w') do |f|
160
+ f.puts "Changed file\n"
161
+ end
162
+
163
+ sleep 1
164
+ create_backup! true
165
+
166
+ root_file = File.expand_path '../fixtures/etc/root/file', __FILE__
167
+ root_file_content = open(root_file).read
168
+
169
+ assert_equal root_file_content, "Changed file\n"
170
+ assert_equal root_file_content, open(
171
+ "#{@back_path}/#{@local_path_hash}/#{@timestamp}/#{Digest::MD5.hexdigest root_file}"
172
+ ).read
173
+ end
61
174
  end
@@ -4,7 +4,7 @@ class BackupFileItemTest < Test::Unit::TestCase
4
4
  def setup
5
5
  @file_item = Backup::FileItem.for :local
6
6
  end
7
-
7
+
8
8
  def test_semantic_path
9
9
  assert_equal __FILE__, @file_item.semantic_path(__FILE__)
10
10
  assert_equal File.dirname(__FILE__) + '/',
@@ -1,29 +1,29 @@
1
- require File.expand_path("../helper", __FILE__)
1
+ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class BackupTimestampTest < Test::Unit::TestCase
4
4
  def test_parse_timestamp
5
5
  assert_equal Backup::Timestamp.parse_timestamp("110102201130"),
6
- Time.new(2011, 01, 02, 20, 11, 30, 0)
6
+ Time.utc(2011, 01, 02, 20, 11, 30, 0)
7
7
 
8
8
  assert_equal Backup::Timestamp.parse_timestamp("11.01.02. 20:11:30"),
9
- Time.new(2011, 01, 02, 20, 11, 30, 0)
9
+ Time.utc(2011, 01, 02, 20, 11, 30, 0)
10
10
 
11
11
  assert_equal Backup::Timestamp.parse_timestamp("1101022011"),
12
- Time.new(2011, 01, 02, 20, 11, 0, 0)
12
+ Time.utc(2011, 01, 02, 20, 11, 0, 0)
13
13
  assert_equal Backup::Timestamp.parse_timestamp("11010220"),
14
- Time.new(2011, 01, 02, 20, 0, 0, 0)
14
+ Time.utc(2011, 01, 02, 20, 0, 0, 0)
15
15
  assert_equal Backup::Timestamp.parse_timestamp("110102"),
16
- Time.new(2011, 01, 02, 0, 0, 0, 0)
16
+ Time.utc(2011, 01, 02, 0, 0, 0, 0)
17
17
 
18
18
  assert_equal Backup::Timestamp.parse_timestamp("1101022011", true),
19
- Time.new(2011, 01, 02, 20, 11, 59, 0)
19
+ Time.utc(2011, 01, 02, 20, 11, 59, 0)
20
20
  assert_equal Backup::Timestamp.parse_timestamp("11010220", true),
21
- Time.new(2011, 01, 02, 20, 59, 59, 0)
21
+ Time.utc(2011, 01, 02, 20, 59, 59, 0)
22
22
  assert_equal Backup::Timestamp.parse_timestamp("110102", true),
23
- Time.new(2011, 01, 02, 23, 59, 59, 0)
23
+ Time.utc(2011, 01, 02, 23, 59, 59, 0)
24
24
 
25
25
  assert_not_equal Backup::Timestamp.parse_timestamp("110102201130"),
26
- Time.new(2011, 01, 02, 20, 11, 31, 0)
26
+ Time.utc(2011, 01, 02, 20, 11, 31, 0)
27
27
 
28
28
  assert_raise(RuntimeError) { Backup::Timestamp.parse_timestamp("11d10.,130") }
29
29
  end
@@ -57,15 +57,15 @@ class BackupTimestampTest < Test::Unit::TestCase
57
57
  end
58
58
 
59
59
  def test_create_timestamp
60
- time = Time.new(2011, 01, 02, 23, 59, 59, 0)
60
+ time = Time.utc(2011, 01, 02, 23, 59, 59, 0)
61
61
 
62
62
  assert_equal(Backup::Timestamp.create.length, 12)
63
63
  assert_equal(Backup::Timestamp.create(time), "110102235959")
64
64
  end
65
-
65
+
66
66
  def test_formatted_timestamp
67
- time = Time.new(2011, 01, 02, 23, 59, 30, 0)
68
-
67
+ time = Time.utc(2011, 01, 02, 23, 59, 30, 0)
68
+
69
69
  assert_equal Backup::Timestamp.to_s(time), "11.01.02 23:59:30"
70
70
  assert_equal Backup::Timestamp.to_s(51), nil
71
71
  assert_equal Backup::Timestamp.to_str("110102235930"), "11.01.02 23:59:30"
@@ -0,0 +1,4 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestConfig < Test::Unit::TestCase
4
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestCrypto < Test::Unit::TestCase
4
+ def setup
5
+ @fixtures = File.expand_path('../fixtures/rsa_keys', __FILE__)
6
+
7
+ FileUtils.rm_r @fixtures, :force => true
8
+ FileUtils.mkdir_p @fixtures
9
+ end
10
+
11
+ def create_keys!(bits = 4096)
12
+ Crypto.create_keys("#{@fixtures}/rsa_key", "#{@fixtures}/rsa_key.pub", bits)
13
+ end
14
+
15
+ def load_keys
16
+ @priv_key = Crypto::Key.from_file("#{@fixtures}/rsa_key")
17
+ @pub_key = Crypto::Key.from_file("#{@fixtures}/rsa_key.pub")
18
+ end
19
+
20
+ def test_create_keys
21
+ create_keys!
22
+
23
+ assert_not_nil File.open("#{@fixtures}/rsa_key").read
24
+ assert_not_nil File.open("#{@fixtures}/rsa_key.pub").read
25
+ end
26
+ end
metadata CHANGED
@@ -1,20 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: encbs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1.beta2
5
- prerelease: 6
4
+ version: 0.2.1
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Timothy Klim
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-03 00:00:00.000000000 +04:00
12
+ date: 2011-06-04 00:00:00.000000000 +04:00
13
13
  default_executable: encbs
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: fog
17
- requirement: &2159701080 !ruby/object:Gem::Requirement
17
+ requirement: &2155354360 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2159701080
25
+ version_requirements: *2155354360
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: slop
28
- requirement: &2159700480 !ruby/object:Gem::Requirement
28
+ requirement: &2155353860 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2159700480
36
+ version_requirements: *2155353860
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: ruby-progressbar
39
- requirement: &2159699880 !ruby/object:Gem::Requirement
39
+ requirement: &2155353340 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2159699880
47
+ version_requirements: *2155353340
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: lzoruby
50
- requirement: &2159699300 !ruby/object:Gem::Requirement
50
+ requirement: &2155352820 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *2159699300
58
+ version_requirements: *2155352820
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rake
61
- requirement: &2159698720 !ruby/object:Gem::Requirement
61
+ requirement: &2155352300 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - =
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 0.8.4
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2159698720
69
+ version_requirements: *2155352300
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: bundler
72
- requirement: &2159698140 !ruby/object:Gem::Requirement
72
+ requirement: &2155351700 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 1.0.0
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2159698140
80
+ version_requirements: *2155351700
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: jeweler
83
- requirement: &2159697600 !ruby/object:Gem::Requirement
83
+ requirement: &2155351100 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ! '>='
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 1.6.0
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *2159697600
91
+ version_requirements: *2155351100
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: rcov
94
- requirement: &2159697080 !ruby/object:Gem::Requirement
94
+ requirement: &2155350480 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,7 +99,7 @@ dependencies:
99
99
  version: '0'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *2159697080
102
+ version_requirements: *2155350480
103
103
  description: Simple backup system for pushing into cloud
104
104
  email: klimtimothy@gmail.com
105
105
  executables:
@@ -129,12 +129,14 @@ files:
129
129
  - lib/helpers.rb
130
130
  - test/fixtures/etc/.hide
131
131
  - test/fixtures/etc/root/file
132
- - test/fixtures/test_crypto.rb
132
+ - test/fixtures/rsa_key.private
133
+ - test/fixtures/rsa_key.public
133
134
  - test/helper.rb
134
135
  - test/test_backup.rb
135
136
  - test/test_backup_file_item.rb
136
137
  - test/test_backup_timestamp.rb
137
- - test/test_jar.rb
138
+ - test/test_config.rb
139
+ - test/test_crypto.rb
138
140
  has_rdoc: true
139
141
  homepage: http://github.com/TimothyKlim/encbs
140
142
  licenses:
@@ -151,13 +153,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
151
153
  version: '0'
152
154
  segments:
153
155
  - 0
154
- hash: -2054393209983335340
156
+ hash: 59491317708756896
155
157
  required_rubygems_version: !ruby/object:Gem::Requirement
156
158
  none: false
157
159
  requirements:
158
- - - ! '>'
160
+ - - ! '>='
159
161
  - !ruby/object:Gem::Version
160
- version: 1.3.1
162
+ version: '0'
161
163
  requirements: []
162
164
  rubyforge_project:
163
165
  rubygems_version: 1.6.2
@@ -1,23 +0,0 @@
1
- require File.expand_path('../helper', __FILE__)
2
-
3
- class TestCrypto < Test::Unit::TestCase
4
- def fixtures
5
- File.expand_path('../fixtures/rsa_keys', __FILE__)
6
- end
7
-
8
- def create_keys!(bits = 4096)
9
- Crypto.create_keys("#{fixtures}/rsa_key", "#{fixtures}/rsa_key.pub", bits)
10
- end
11
-
12
- def load_keys
13
- @priv_key = Crypto::Key.from_file("#{fixtures}/rsa_key")
14
- @pub_key = Crypto::Key.from_file("#{fixtures}/rsa_key.pub")
15
- end
16
-
17
- def test_create_keys
18
- create_keys!
19
-
20
- assert_not_nil File.open("#{fixtures}/rsa_key").read
21
- assert_not_nil File.open("#{fixtures}/rsa_key.pub").read
22
- end
23
- end
data/test/test_jar.rb DELETED
File without changes