opstack 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1befb324fe3a090a3c934f743e9a92438be3af13
4
- data.tar.gz: c05e4e87f713a7b171b441d13a7136c489996fac
3
+ metadata.gz: 93b9749eecad15a9ff103140978d681239391390
4
+ data.tar.gz: bcd39f355a1cdf8531648a0057cf001dcee905fa
5
5
  SHA512:
6
- metadata.gz: 01e158994faaa9a4abd031bc49fb9be7b2f2f059901906a7315dcb0f306dc9fe4e3da99226b236627e0f5334a7038860c733f80e356b1d56cfaf0c0aac7efd27
7
- data.tar.gz: cd34361ac7e42a320019700e40a737a42fbd3f87907e1ed3807be8050a54ff8b1ab0f2a3a197e24b2aecddb3fb094a455a59c515f357c4d610bc9e795b4a1912
6
+ metadata.gz: daab96cd408a5645450ff8130d97080942f8ed17e4d7f84601ec4030e70ca3be9b9379e850d02fe6cdca56019634fa264fd8e652a09370d52add78d04e57f072
7
+ data.tar.gz: 8f24f562e9f0985ae45bed376b6821ed5256c197003803ea12ca7d5fa939d6aa5708138dd52ecb4dc3695c627c4d1fc6a60fdcd288b8b42a8a3cea3ae183f8be
data/README.md CHANGED
@@ -4,8 +4,11 @@
4
4
 
5
5
  ----------
6
6
 
7
+ ## Installing OpStack ##
8
+ `gem install opstack`
9
+
7
10
  ##Importing an environment
8
- ``opstack env import demo demo/accounts.json)`` will read the json file with your config variables and save them as an encrypted json file in the opstack config directory (~/.opstack)
11
+ ``opstack env import demo demo/accounts.json`` will read the json file with your config variables and save them as an encrypted json file in the opstack config directory (~/.opstack)
9
12
 
10
13
  ##Export an environment to bash
11
14
  ``eval $(opstack env export demo `` will export the environment variables for the demo enviornment
@@ -1,4 +1,5 @@
1
1
  require 'opstack/config'
2
+ require 'opstack/encryption'
2
3
  require 'opstack/exporter'
3
4
  require 'opstack/environment'
4
5
  require 'opstack/version'
@@ -1,5 +1,5 @@
1
1
  require 'thor'
2
- require 'opstack/logger'
2
+ require 'opstack/logging'
3
3
  require 'opstack/commands'
4
4
 
5
5
  module OpStack
@@ -17,11 +17,7 @@ module OpStack
17
17
  true
18
18
  end
19
19
 
20
- desc "hello NAME", "say hello to NAME"
21
- def hello(name)
22
- puts "Hello #{name}"
23
- end
24
- desc "env SUBCOMMAND ...ARGS", "stuff"
20
+ desc "env SUBCOMMAND ...ARGS", "environment comands"
25
21
  subcommand "env", OpStack::Commands::Env
26
22
  end
27
23
  end
@@ -0,0 +1,98 @@
1
+ # This code is derived from the chef encrypted data bag code found at
2
+ # https://github.com/chef/chef/tree/master/lib/chef/encrypted_data_bag_item
3
+ #
4
+ # Original Author:: Seth Falcon (<seth@opscode.com>)
5
+ # Original Copyright:: Copyright 2010-2011 Opscode, Inc.
6
+ # Original License:: Apache License, Version 2.0
7
+
8
+ module OpStack
9
+ class Encryption
10
+ attr_reader :key
11
+ attr_reader :plaintext_data
12
+ attr_reader :encrypted_data
13
+ attr_reader :cipher
14
+
15
+ require 'openssl'
16
+ require 'base64'
17
+ require 'digest/sha2'
18
+ require 'ffi_yajl'
19
+
20
+ ALGORITHM = 'aes-256-cbc'
21
+
22
+ def encryptor(plaintext_data, key, iv=nil, cipher=nil)
23
+ @plaintext_data = plaintext_data
24
+ @key = key
25
+ @iv = iv && Base64.decode64(iv)
26
+ @cipher = cipher || ALGORITHM
27
+ self
28
+ end
29
+
30
+ def decryptor(encrypted_hash, key)
31
+ @encrypted_data = Base64.decode64(encrypted_hash["encrypted_data"])
32
+ @cipher = encrypted_hash["cipher"] || ALGORITHM
33
+ @iv = Base64.decode64(encrypted_hash["iv"])
34
+ @key = key
35
+ self
36
+ end
37
+
38
+ def iv
39
+ openssl_encryptor if @iv.nil? and @plaintext_data
40
+ @iv
41
+ end
42
+
43
+ def openssl_encryptor
44
+ @openssl_encryptor ||= begin
45
+ encryptor = OpenSSL::Cipher.new(cipher)
46
+ encryptor.encrypt
47
+ @iv ||= encryptor.random_iv
48
+ encryptor.iv = @iv
49
+ encryptor.key = Digest::SHA256.digest(key)
50
+ encryptor
51
+ end
52
+ end
53
+
54
+ def openssl_decryptor
55
+ @openssl_decryptor ||= begin
56
+ decryptor = OpenSSL::Cipher.new(cipher)
57
+ decryptor.decrypt
58
+ decryptor.key = OpenSSL::Digest::SHA256.digest(key)
59
+ decryptor.iv = iv
60
+ decryptor
61
+ end
62
+ end
63
+
64
+ def encrypted_data
65
+ @encrypted_data ||= begin
66
+ enc_data = openssl_encryptor.update(serialized_data)
67
+ enc_data << openssl_encryptor.final
68
+ Base64.encode64(enc_data)
69
+ end
70
+ end
71
+
72
+ def decrypted_data
73
+ @decrypted_data ||= begin
74
+ plaintext = openssl_decryptor.update(@encrypted_data)
75
+ plaintext << openssl_decryptor.final
76
+ rescue OpenSSL::Cipher::CipherError => e
77
+ raise DecryptionFailure, "Error decrypting data bag value: '#{e.message}'. Most likely the provided key is incorrect"
78
+ end
79
+ end
80
+
81
+ def encrypted_hash
82
+ {
83
+ "encrypted_data" => encrypted_data,
84
+ "iv" => Base64.encode64(iv),
85
+ "cipher" => cipher
86
+ }
87
+ end
88
+
89
+ def serialized_data
90
+ FFI_Yajl::Encoder.encode(:json_wrapper => plaintext_data)
91
+ end
92
+
93
+ def decrypted_hash
94
+ FFI_Yajl::Parser.parse(decrypted_data)["json_wrapper"]
95
+ end
96
+
97
+ end
98
+ end
@@ -10,13 +10,11 @@ module OpStack
10
10
 
11
11
  begin
12
12
  encrypted_data = JSON.parse(File.read(databag_file))
13
- data_bag = ::Chef::EncryptedDataBagItem.new(encrypted_data, secret).to_hash
13
+ data_bag = OpStack::Encryption.new().decryptor(encrypted_data,secret).decrypted_hash
14
14
  rescue Errno::ENOENT
15
15
  OpStack.logger.error("Environment #{environment} Not Found."); return nil
16
16
  rescue JSON::ParserError
17
17
  OpStack.logger.error("Could not Parse #{databag_file}"); return nil
18
- rescue ::Chef::EncryptedDataBagItem::DecryptionFailure
19
- OpStack.logger.error("Could not decrypt #{databag_file}"); return nil
20
18
  end
21
19
 
22
20
  end
@@ -29,12 +27,11 @@ module OpStack
29
27
 
30
28
  begin
31
29
  data = JSON.parse(File.read(file))
32
- encrypted_data = ::Chef::EncryptedDataBagItem.encrypt_data_bag_item(data, secret)
30
+ encrypted_data = OpStack::Encryption.new().encryptor(data,secret).encrypted_hash
31
+ FileUtils.mkdir_p("#{config[:config_dir]}/environments/#{environment}")
33
32
  File.write(databag_file, JSON.pretty_generate(encrypted_data))
34
33
  rescue Errno::ENOENT
35
34
  OpStack.logger.error("File #{file} Not Found."); return nil
36
- rescue ::Chef::EncryptedDataBagItem::EncryptionFailure
37
- OpStack.logger.error("Could not encrypt the data"); return nil
38
35
  end
39
36
  end
40
37
 
File without changes
@@ -1,3 +1,3 @@
1
1
  module OpStack
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -14,10 +14,10 @@ Gem::Specification.new do |spec|
14
14
  spec.licenses = ['MIT', 'GPL-2']
15
15
 
16
16
  spec.add_runtime_dependency 'ansi'
17
- spec.add_runtime_dependency 'chef', '>= 11.0'
18
17
  spec.add_runtime_dependency 'thor'
19
18
 
20
19
  spec.add_development_dependency 'bundler', '~> 1.3'
20
+ spec.add_development_dependency 'chef'
21
21
  spec.add_development_dependency 'coveralls'
22
22
  spec.add_development_dependency 'guard', '~> 2.8'
23
23
  spec.add_development_dependency 'guard-rspec', '~> 4.3'
@@ -1,6 +1,6 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib', 'opstack'))
2
2
  require 'rspec'
3
- require 'chef/encrypted_data_bag_item'
3
+ require 'chef'
4
4
  require 'coveralls'
5
5
  require 'simplecov'
6
6
  require 'simplecov-console'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Salvatore Poliandro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-11 00:00:00.000000000 Z
11
+ date: 2015-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ansi
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: chef
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '11.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '11.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: thor
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +52,20 @@ dependencies:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
54
  version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: chef
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: coveralls
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -198,10 +198,11 @@ files:
198
198
  - lib/opstack/cli.rb
199
199
  - lib/opstack/commands.rb
200
200
  - lib/opstack/config.rb
201
+ - lib/opstack/encryption.rb
201
202
  - lib/opstack/environment.rb
202
203
  - lib/opstack/environment/chef.rb
203
204
  - lib/opstack/exporter.rb
204
- - lib/opstack/logger.rb
205
+ - lib/opstack/logging.rb
205
206
  - lib/opstack/version.rb
206
207
  - opstack.gemspec
207
208
  - spec/fixtures/environments/test/accounts.json