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 +4 -4
- data/README.md +4 -1
- data/lib/opstack.rb +1 -0
- data/lib/opstack/cli.rb +2 -6
- data/lib/opstack/encryption.rb +98 -0
- data/lib/opstack/environment/chef.rb +3 -6
- data/lib/opstack/{logger.rb → logging.rb} +0 -0
- data/lib/opstack/version.rb +1 -1
- data/opstack.gemspec +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +18 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93b9749eecad15a9ff103140978d681239391390
|
4
|
+
data.tar.gz: bcd39f355a1cdf8531648a0057cf001dcee905fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
data/lib/opstack.rb
CHANGED
data/lib/opstack/cli.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'thor'
|
2
|
-
require 'opstack/
|
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 "
|
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 = ::
|
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 = ::
|
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
|
data/lib/opstack/version.rb
CHANGED
data/opstack.gemspec
CHANGED
@@ -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'
|
data/spec/spec_helper.rb
CHANGED
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.
|
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
|
+
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/
|
205
|
+
- lib/opstack/logging.rb
|
205
206
|
- lib/opstack/version.rb
|
206
207
|
- opstack.gemspec
|
207
208
|
- spec/fixtures/environments/test/accounts.json
|