encbs 0.1.0 → 0.1.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.1.0
1
+ 0.1.1
data/bin/encbs CHANGED
@@ -20,8 +20,6 @@ require 'backup'
20
20
  opts = Slop.parse :help => true do
21
21
  on :a, :add, "Add path to backup", true
22
22
  on :b, :bucket, "Set Amazon S3 bucket to backup", true
23
- on :k, :key, "Set API key to access Amazon S3", true
24
- on :s, :secret, "Set API secret to access Amazon S3", true
25
23
  on :c, :config, "Use config file to upload backup", true #TODO
26
24
  on :colorize, "Colorize print to console"
27
25
  on :d, :date, "Date for backup restore (default: last)", true
@@ -29,11 +27,14 @@ opts = Slop.parse :help => true do
29
27
  on :h, :hostname, "Set hostname (default: system)", true
30
28
  on :i, :increment, "Use increment mode for backup (default: false)"
31
29
  on :j, :jar, "Versions of jar (option: hash or path)", true
32
- on :t, :token, "RSA Key to encrypt/decrypt backup data", true
30
+ on :k, :key, "Set API key to access Amazon S3", true
33
31
  on :l, :local, "Backup in local directory", true
34
32
  on :list, "List of jars"
35
33
  on :r, :rescue, "Return data from backup (option: jar, path or filter)", true
34
+ on :s, :secret, "Set API secret to access Amazon S3", true
36
35
  on :t, :to, "Path to recovery (default: /)", true
36
+ on :token, "RSA Key to encrypt/decrypt backup data", true
37
+ on :threads, "Set count of thread (default: 1)", true
37
38
  on :v, :verbose, "Verbose mode"
38
39
 
39
40
  banner "Usage:\n $ encbs [options]\n\nOptions:"
@@ -48,16 +49,19 @@ end
48
49
  $PRINT_VERBOSE = opts.verbose?
49
50
  $COLORIZE = opts.colorize?
50
51
 
51
- #if opts.generate?
52
- # puts "Generate 4096 bits RSA keys"
53
- # Crypto::create_keys(
54
- # File.join(Dir.getwd, "rsa_key"),
55
- # File.join(Dir.getwd, "rsa_key.pub")
56
- # )
57
- # puts "Done!"
58
- #
59
- # exit
60
- #end
52
+ if opts.generate?
53
+ bits = opts[:generate].to_i
54
+ puts_fail "Unsupport #{bits} bits" unless bits == 4096 or bits == 2048
55
+ puts "Generate #{bits} bits RSA keys"
56
+ Crypto::create_keys(
57
+ File.join(Dir.getwd, "rsa_key"),
58
+ File.join(Dir.getwd, "rsa_key.pub"),
59
+ bits
60
+ )
61
+ puts "Done!"
62
+
63
+ exit
64
+ end
61
65
 
62
66
  if opts.local?
63
67
  try_create_dir opts[:local]
@@ -92,8 +96,7 @@ if opts.list?
92
96
  exit
93
97
  end
94
98
 
95
- #TODO: AES or RSA
96
- # @backup.key = opts[:key] if opts.key?
99
+ @backup.key = opts[:token] if opts.token?
97
100
 
98
101
  if opts.date?
99
102
  date = opts[:date].split("-")
data/encbs.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{encbs}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Timothy Klim"]
@@ -35,10 +35,14 @@ Gem::Specification.new do |s|
35
35
  "lib/backup/timestamp.rb",
36
36
  "lib/crypto.rb",
37
37
  "lib/helpers.rb",
38
+ "test/fixtures/etc/.hide",
39
+ "test/fixtures/etc/root/file",
40
+ "test/fixtures/test_crypto.rb",
38
41
  "test/helper.rb",
39
42
  "test/test_backup.rb",
40
43
  "test/test_backup_file_item.rb",
41
- "test/test_backup_timestamp.rb"
44
+ "test/test_backup_timestamp.rb",
45
+ "test/test_jar.rb"
42
46
  ]
43
47
  s.homepage = %q{http://github.com/TimothyKlim/encbs}
44
48
  s.licenses = ["MIT"]
data/lib/backup/jar.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  module Backup
2
2
  class Jar
3
- def initialize(file_item, root_path, local_path)
3
+ def initialize(file_item, root_path, local_path, key = nil)
4
4
  @root_path = root_path
5
5
  @local_path = local_path
6
6
  @timestamp = Backup::Timestamp.create
7
7
  @file_item = file_item
8
+ @key = key
8
9
  end
9
10
 
10
11
  def jar_hash
@@ -73,8 +74,17 @@ module Backup
73
74
 
74
75
  @local_files.keys.each do |file|
75
76
  unless Dir.exists?(file)
76
- @file_item.create_file_once "#{jar_data_path}/#{@file_item.file_hash file}",
77
- File.open(file)
77
+ data = if @key
78
+ @key.encrypt_to_stream(File.open(file).read)
79
+ else
80
+ File.open(file)
81
+ end
82
+
83
+ @file_item.create_file_once(
84
+ "#{jar_data_path}/#{@file_item.file_hash file}",
85
+ data
86
+ )
87
+
78
88
  pbar.inc
79
89
  end
80
90
  end
data/lib/backup.rb CHANGED
@@ -25,11 +25,11 @@ module Backup
25
25
  end
26
26
 
27
27
  def key=(path)
28
- @key = open(path).read
28
+ @key = Crypto::Key.from_file(path)
29
29
  end
30
30
 
31
31
  def create!(local_path, increment = false)
32
- jar = Jar.new(@file_item, @root_path, local_path)
32
+ jar = Jar.new(@file_item, @root_path, local_path, @key)
33
33
  jar.save(increment)
34
34
  end
35
35
 
@@ -44,6 +44,12 @@ module Backup
44
44
  def restore_jar_to(hash, timestamp, to)
45
45
  files = Jar.fetch_index_for(@file_item, @root_path, hash, timestamp)
46
46
 
47
+ pbar = ProgressBar.new(
48
+ "Restoring",
49
+ files.keys.length
50
+ )
51
+ pbar.bar_mark = '*'
52
+
47
53
  files.keys.sort.each do |file|
48
54
  restore_file = File.join(to, file)
49
55
  current_file = files[file]
@@ -76,6 +82,7 @@ module Backup
76
82
  remote_path += "/#{@file_item.file_hash file}"
77
83
 
78
84
  data = @file_item.read_file remote_path
85
+ data = @key.decrypt_from_stream data if @key
79
86
  f.puts data
80
87
  end
81
88
 
@@ -93,28 +100,11 @@ module Backup
93
100
  puts_fail "Permission denied for #{restore_file.dark_green}"
94
101
  end
95
102
  end
103
+
104
+ pbar.inc
96
105
  end
97
106
 
107
+ pbar.finish
98
108
  end
99
109
  end
100
-
101
- def self.fetch_versions_of_backup(path)
102
- Dir["#{path}/*"].map do |backup|
103
- backup.match(/[0-9]{12}$/)[0] if backup.match(/[0-9]{12}$/)
104
- end.compact.sort
105
- end
106
-
107
- def self.aes(command, key, data)
108
- aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').send(command)
109
- aes.key = key
110
- aes.update(data) << aes.final
111
- end
112
-
113
- def self.encrypt_data(key, data)
114
- Backup::aes(:encrypt, key, data) unless data.empty?
115
- end
116
-
117
- def self.decrypt_data(key, data)
118
- Backup::aes(:decrypt, key, data)
119
- end
120
110
  end
data/lib/crypto.rb CHANGED
@@ -3,7 +3,7 @@ require 'base64'
3
3
 
4
4
  module Crypto
5
5
 
6
- def self.create_keys(priv = "rsa_key", pub = "#{priv}.pub", bits = 4096)
6
+ def self.create_keys(priv, pub, bits)
7
7
  private_key = OpenSSL::PKey::RSA.new(bits)
8
8
  File.open(priv, "w+") { |fp| fp << private_key.to_s }
9
9
  File.open(pub, "w+") { |fp| fp << private_key.public_key.to_s }
@@ -19,7 +19,30 @@ module Crypto
19
19
  def self.from_file(filename)
20
20
  self.new File.read( filename )
21
21
  end
22
+
23
+ def encrypt_to_stream(data)
24
+ encrypt_data = StringIO.new
25
+ i = 0
26
+
27
+ while buf = data[i..(i+=117)] do
28
+ encrypt_data << encrypt(buf)
29
+ end
30
+
31
+ encrypt_data.seek(0)
32
+ encrypt_data
33
+ end
34
+
35
+ def decrypt_from_stream(data)
36
+ encrypt_data = StringIO.new data
37
+ decrypt_data = ""
22
38
 
39
+ while buf = encrypt_data.read(256) do
40
+ decrypt_data += decrypt(buf)
41
+ end
42
+
43
+ decrypt_data
44
+ end
45
+
23
46
  def encrypt(text)
24
47
  @key.send("#{key_type}_encrypt", text)
25
48
  end
@@ -0,0 +1 @@
1
+ Hide data
@@ -0,0 +1 @@
1
+ Root file
@@ -0,0 +1,23 @@
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_backup.rb CHANGED
@@ -9,6 +9,27 @@ class TestBackup < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_backup_attributes
12
+ hostname = Socket.gethostname
13
+ file = File.expand_path("../fixtures/backups", __FILE__)
12
14
 
15
+ assert_equal(
16
+ @backup.root_path,
17
+ "#{file}/#{hostname}"
18
+ )
19
+ assert_equal @backup.hostname, Socket.gethostname
20
+ assert_equal @backup.file_item.class, Backup::FileItem::Local
21
+ assert_not_nil @backup.timestamp
22
+ end
23
+
24
+ def test_create
25
+ end
26
+
27
+ def test_show_jars
28
+ end
29
+
30
+ def test_jar_versions
31
+ end
32
+
33
+ def test_restore
13
34
  end
14
35
  end
data/test/test_jar.rb ADDED
File without changes
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: encbs
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Timothy Klim
@@ -105,10 +105,14 @@ files:
105
105
  - lib/backup/timestamp.rb
106
106
  - lib/crypto.rb
107
107
  - lib/helpers.rb
108
+ - test/fixtures/etc/.hide
109
+ - test/fixtures/etc/root/file
110
+ - test/fixtures/test_crypto.rb
108
111
  - test/helper.rb
109
112
  - test/test_backup.rb
110
113
  - test/test_backup_file_item.rb
111
114
  - test/test_backup_timestamp.rb
115
+ - test/test_jar.rb
112
116
  has_rdoc: true
113
117
  homepage: http://github.com/TimothyKlim/encbs
114
118
  licenses:
@@ -123,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
127
  requirements:
124
128
  - - ">="
125
129
  - !ruby/object:Gem::Version
126
- hash: 4533740644498179754
130
+ hash: -2711619165124038743
127
131
  segments:
128
132
  - 0
129
133
  version: "0"