opstack 0.0.2 → 0.0.3

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