chef-vault 1.2.3 → 1.2.4
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.
- data/.gitignore +2 -1
- data/.travis.yml +3 -0
- data/Changelog.md +14 -7
- data/Gemfile +0 -4
- data/README.md +3 -0
- data/chef-vault.gemspec +6 -1
- data/lib/chef-vault/version.rb +1 -1
- data/lib/chef/knife/DecryptCert.rb +2 -2
- data/lib/chef/knife/DecryptPassword.rb +2 -2
- data/lib/chef/knife/EncryptCert.rb +13 -13
- data/lib/chef/knife/EncryptPassword.rb +11 -11
- metadata +35 -3
- data/Gemfile.lock +0 -73
data/.gitignore
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
*.gem
|
1
|
+
*.gem
|
2
|
+
Gemfile.lock
|
data/.travis.yml
ADDED
data/Changelog.md
CHANGED
@@ -1,23 +1,30 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
+
## v1.2.4 / 2013-07-01
|
4
|
+
* Move compat include into the lazy-load deps
|
5
|
+
* Modify open file commands in knife commands to avoid file locking on windows
|
3
6
|
|
4
|
-
## v1.2.
|
7
|
+
## v1.2.3 / 2013-04-30
|
8
|
+
* Update to use attr_accessor in chef_vault
|
9
|
+
* Add rspec tests
|
10
|
+
|
11
|
+
## v1.2.2 / 2013-04-23
|
5
12
|
* Update to create data bag folder if it does not already exist
|
6
13
|
|
7
|
-
## v1.2.1 /
|
14
|
+
## v1.2.1 / 2013-04-23
|
8
15
|
* Clarify Readme
|
9
16
|
|
10
|
-
## v1.0.1 /
|
17
|
+
## v1.0.1 / 2013-04-12
|
11
18
|
* Compatibility with Chef 10/11 (Shef vs Chef-Shell)
|
12
19
|
|
13
|
-
## v1.0.0 /
|
20
|
+
## v1.0.0 / 2013-04-08
|
14
21
|
* Rename from Chef-Keepass to Chef-Vault
|
15
22
|
|
16
|
-
## v0.2.1 /
|
23
|
+
## v0.2.1 / 2013-04/05
|
17
24
|
* Add Certificate class
|
18
25
|
|
19
|
-
## v0.2.0 /
|
26
|
+
## v0.2.0 / 2013-04-05
|
20
27
|
* Add encrypt cert
|
21
28
|
|
22
|
-
## v0.1.1 /
|
29
|
+
## v0.1.1 / 2013-03-14
|
23
30
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
data/chef-vault.gemspec
CHANGED
@@ -28,7 +28,12 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.license = 'Apache License, v2.0'
|
29
29
|
|
30
30
|
s.files = `git ls-files`.split("\n")
|
31
|
-
s.add_dependency
|
31
|
+
s.add_dependency "chef", ">= 0.10.10"
|
32
|
+
|
33
|
+
# tests
|
34
|
+
s.add_development_dependency 'rake'
|
35
|
+
s.add_development_dependency 'rspec'
|
36
|
+
|
32
37
|
s.require_paths = ["lib"]
|
33
38
|
|
34
39
|
s.bindir = "bin"
|
data/lib/chef-vault/version.rb
CHANGED
@@ -20,15 +20,15 @@ class DecryptCert < Chef::Knife
|
|
20
20
|
require 'chef/search/query'
|
21
21
|
require 'json'
|
22
22
|
require File.expand_path('../compat', __FILE__)
|
23
|
+
include ChefVault::Compat
|
23
24
|
end
|
24
|
-
include ChefVault::Compat
|
25
25
|
|
26
26
|
banner "knife decrypt cert --name NAME"
|
27
27
|
|
28
28
|
option :name,
|
29
29
|
:short => '-N NAME',
|
30
30
|
:long => '--name NAME',
|
31
|
-
:description => 'Certificate data bag name'
|
31
|
+
:description => 'Certificate data bag name'
|
32
32
|
|
33
33
|
def run
|
34
34
|
unless config[:name]
|
@@ -20,15 +20,15 @@ class DecryptPassword < Chef::Knife
|
|
20
20
|
require 'chef/search/query'
|
21
21
|
require 'json'
|
22
22
|
require File.expand_path('../compat', __FILE__)
|
23
|
+
include ChefVault::Compat
|
23
24
|
end
|
24
|
-
include ChefVault::Compat
|
25
25
|
|
26
26
|
banner "knife decrypt password --username USERNAME"
|
27
27
|
|
28
28
|
option :username,
|
29
29
|
:short => '-U USERNAME',
|
30
30
|
:long => '--username USERNAME',
|
31
|
-
:description => 'username of account to encrypt'
|
31
|
+
:description => 'username of account to encrypt'
|
32
32
|
|
33
33
|
def run
|
34
34
|
unless config[:username]
|
@@ -19,15 +19,15 @@ class EncryptCert < Chef::Knife
|
|
19
19
|
deps do
|
20
20
|
require 'chef/search/query'
|
21
21
|
require File.expand_path('../compat', __FILE__)
|
22
|
+
include ChefVault::Compat
|
22
23
|
end
|
23
|
-
include ChefVault::Compat
|
24
24
|
|
25
25
|
banner "knife encrypt cert --search SEARCH --cert CERT --password PASSWORD --name NAME --admins ADMINS"
|
26
26
|
|
27
27
|
option :search,
|
28
28
|
:short => '-S SEARCH',
|
29
29
|
:long => '--search SEARCH',
|
30
|
-
:description => 'node search for nodes to encrypt to'
|
30
|
+
:description => 'node search for nodes to encrypt to'
|
31
31
|
|
32
32
|
option :cert,
|
33
33
|
:short => '-C CERT',
|
@@ -42,12 +42,12 @@ class EncryptCert < Chef::Knife
|
|
42
42
|
option :password,
|
43
43
|
:short => '-P PASSWORD',
|
44
44
|
:long => '--password PASSWORD',
|
45
|
-
:description => 'optional pfx password'
|
45
|
+
:description => 'optional pfx password'
|
46
46
|
|
47
47
|
option :name,
|
48
48
|
:short => '-N NAME',
|
49
49
|
:long => '--name NAME',
|
50
|
-
:description => 'optional data bag name'
|
50
|
+
:description => 'optional data bag name'
|
51
51
|
|
52
52
|
def run
|
53
53
|
unless config[:search]
|
@@ -79,12 +79,12 @@ class EncryptCert < Chef::Knife
|
|
79
79
|
file_to_encrypt = config[:cert]
|
80
80
|
contents = open(file_to_encrypt, "rb").read
|
81
81
|
name = config[:name] ? config[:name].gsub(".", "_") : File.basename(file_to_encrypt, ".*").gsub(".", "_")
|
82
|
-
|
82
|
+
|
83
83
|
current_dbi = Hash.new
|
84
84
|
current_dbi_keys = Hash.new
|
85
85
|
if File.exists?("#{data_bag_path}/#{name}_keys.json") && File.exists?("#{data_bag_path}/#{name}.json")
|
86
|
-
current_dbi_keys = JSON.parse(open("#{data_bag_path}/#{name}_keys.json").read())
|
87
|
-
current_dbi = JSON.parse(open("#{data_bag_path}/#{name}.json").read())
|
86
|
+
current_dbi_keys = JSON.parse(File.open("#{data_bag_path}/#{name}_keys.json"){ |file| file.read() })
|
87
|
+
current_dbi = JSON.parse(File.open("#{data_bag_path}/#{name}_keys.json"){ |file| file.read() })
|
88
88
|
|
89
89
|
unless equal?(data_bag, name, "contents", contents)
|
90
90
|
puts("FATAL: Content in #{data_bag_path}/#{name}.json does not match content in file supplied!")
|
@@ -109,7 +109,7 @@ class EncryptCert < Chef::Knife
|
|
109
109
|
puts("WARNING: Caught exception: #{node_error.message} while processing #{client}, so skipping...")
|
110
110
|
end
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
# Get the public keys for the admin users, skipping users already in the data bag
|
114
114
|
public_keys << admins.split(/[\s,]+/).map do |user|
|
115
115
|
begin
|
@@ -126,7 +126,7 @@ class EncryptCert < Chef::Knife
|
|
126
126
|
end
|
127
127
|
|
128
128
|
if public_keys.length == 0
|
129
|
-
puts "A node search for #{node_search} returned no results"
|
129
|
+
puts "A node search for #{node_search} returned no results"
|
130
130
|
exit 1
|
131
131
|
end
|
132
132
|
|
@@ -144,7 +144,7 @@ class EncryptCert < Chef::Knife
|
|
144
144
|
# Delete existing keys data bag and rewrite the whole bag from memory
|
145
145
|
puts("INFO: Writing #{data_bag_path}/#{name}_keys.json...")
|
146
146
|
File.delete("#{data_bag_path}/#{name}_keys.json") if File.exists?("#{data_bag_path}/#{name}_keys.json")
|
147
|
-
File.open("#{data_bag_path}/#{name}_keys.json",'w').write(JSON.pretty_generate(enc_db_key_dbi))
|
147
|
+
File.open("#{data_bag_path}/#{name}_keys.json",'w'){ |file| file.write(JSON.pretty_generate(enc_db_key_dbi)) }
|
148
148
|
|
149
149
|
# If the existing certificate bag does not exist, write it out with the correct certificate
|
150
150
|
# Otherwise leave the existing bag alone
|
@@ -155,7 +155,7 @@ class EncryptCert < Chef::Knife
|
|
155
155
|
edbi = Chef::EncryptedDataBagItem.encrypt_data_bag_item(dbi, data_bag_shared_key)
|
156
156
|
|
157
157
|
puts("INFO: Writing #{data_bag_path}/#{name}.json...")
|
158
|
-
open("#{data_bag_path}/#{name}.json",'w').write(JSON.pretty_generate(edbi))
|
158
|
+
File.open("#{data_bag_path}/#{name}.json",'w'){ |file| file.write(JSON.pretty_generate(edbi)) }
|
159
159
|
end
|
160
160
|
|
161
161
|
puts("INFO: Successfully wrote #{data_bag_path}/#{name}.json & #{data_bag_path}/#{name}_keys.json!")
|
@@ -165,7 +165,7 @@ class EncryptCert < Chef::Knife
|
|
165
165
|
data_bag_path = "./data_bags/#{db}"
|
166
166
|
|
167
167
|
shared_secret = get_shared_secret(db, dbi)
|
168
|
-
dbi = JSON.parse(open("#{data_bag_path}/#{dbi}.json").read())
|
168
|
+
dbi = JSON.parse(File.open("#{data_bag_path}/#{dbi}.json") { |file| file.read() })
|
169
169
|
dbi = Chef::EncryptedDataBagItem.new dbi, shared_secret
|
170
170
|
|
171
171
|
dbi[key] == value
|
@@ -175,7 +175,7 @@ class EncryptCert < Chef::Knife
|
|
175
175
|
data_bag_path = "./data_bags/#{db}"
|
176
176
|
|
177
177
|
private_key = OpenSSL::PKey::RSA.new(open(Chef::Config[:client_key]).read())
|
178
|
-
key = File.exists?("#{data_bag_path}/#{dbi}_keys.json") ? JSON.parse(open("#{data_bag_path}/#{dbi}_keys.json").read()) : nil
|
178
|
+
key = File.exists?("#{data_bag_path}/#{dbi}_keys.json") ? JSON.parse(File.open("#{data_bag_path}/#{dbi}_keys.json"){ |file| file.read() }) : nil
|
179
179
|
|
180
180
|
begin
|
181
181
|
private_key.private_decrypt(Base64.decode64(key[Chef::Config[:node_name]]))
|
@@ -19,20 +19,20 @@ class EncryptPassword < Chef::Knife
|
|
19
19
|
deps do
|
20
20
|
require 'chef/search/query'
|
21
21
|
require File.expand_path('../compat', __FILE__)
|
22
|
+
include ChefVault::Compat
|
22
23
|
end
|
23
|
-
include ChefVault::Compat
|
24
24
|
|
25
25
|
banner "knife encrypt password --search SEARCH --username USERNAME --password PASSWORD --admins ADMINS"
|
26
26
|
|
27
27
|
option :search,
|
28
28
|
:short => '-S SEARCH',
|
29
29
|
:long => '--search SEARCH',
|
30
|
-
:description => 'node search for nodes to encrypt for'
|
30
|
+
:description => 'node search for nodes to encrypt for'
|
31
31
|
|
32
32
|
option :username,
|
33
33
|
:short => '-U USERNAME',
|
34
34
|
:long => '--username USERNAME',
|
35
|
-
:description => 'username of account to encrypt'
|
35
|
+
:description => 'username of account to encrypt'
|
36
36
|
|
37
37
|
option :password,
|
38
38
|
:short => '-P PASSWORD',
|
@@ -61,7 +61,7 @@ class EncryptPassword < Chef::Knife
|
|
61
61
|
puts("You must supply either -A or --admins")
|
62
62
|
exit 1
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
extend_context_object(self)
|
66
66
|
|
67
67
|
data_bag = "passwords"
|
@@ -81,8 +81,8 @@ class EncryptPassword < Chef::Knife
|
|
81
81
|
current_dbi = Hash.new
|
82
82
|
current_dbi_keys = Hash.new
|
83
83
|
if File.exists?("#{data_bag_path}/#{username}_keys.json") && File.exists?("#{data_bag_path}/#{username}.json")
|
84
|
-
current_dbi_keys = JSON.parse(open("#{data_bag_path}/#{username}_keys.json").read())
|
85
|
-
current_dbi = JSON.parse(open("#{data_bag_path}/#{username}.json").read())
|
84
|
+
current_dbi_keys = JSON.parse(File.open("#{data_bag_path}/#{username}_keys.json"){ |file| file.read() })
|
85
|
+
current_dbi = JSON.parse(File.open("#{data_bag_path}/#{username}.json"){ |file| file.read() })
|
86
86
|
|
87
87
|
unless equal?(data_bag, username, "password", password)
|
88
88
|
puts("FATAL: Password in #{data_bag_path}/#{username}.json does not match password supplied!")
|
@@ -107,7 +107,7 @@ class EncryptPassword < Chef::Knife
|
|
107
107
|
puts("WARNING: Caught exception: #{node_error.message} while processing #{client}, so skipping...")
|
108
108
|
end
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
# Get the public keys for the admin users, skipping users already in the data bag
|
112
112
|
public_keys << admins.split(/[\s,]+/).map do |user|
|
113
113
|
begin
|
@@ -124,7 +124,7 @@ class EncryptPassword < Chef::Knife
|
|
124
124
|
end
|
125
125
|
|
126
126
|
if public_keys.length == 0
|
127
|
-
puts "A node search for #{node_search} returned no results"
|
127
|
+
puts "A node search for #{node_search} returned no results"
|
128
128
|
exit 1
|
129
129
|
end
|
130
130
|
|
@@ -142,7 +142,7 @@ class EncryptPassword < Chef::Knife
|
|
142
142
|
# Delete existing keys data bag and rewrite the whole bag from memory
|
143
143
|
puts("INFO: Writing #{data_bag_path}/#{username}_keys.json...")
|
144
144
|
File.delete("#{data_bag_path}/#{username}_keys.json") if File.exists?("#{data_bag_path}/#{username}_keys.json")
|
145
|
-
File.open("#{data_bag_path}/#{username}_keys.json",'w').write(JSON.pretty_generate(enc_db_key_dbi))
|
145
|
+
File.open("#{data_bag_path}/#{username}_keys.json",'w'){ |file| file.write(JSON.pretty_generate(enc_db_key_dbi)) }
|
146
146
|
|
147
147
|
# If the existing password bag does not exist, write it out with the correct password
|
148
148
|
# Otherwise leave the existing bag alone
|
@@ -152,7 +152,7 @@ class EncryptPassword < Chef::Knife
|
|
152
152
|
edbi = Chef::EncryptedDataBagItem.encrypt_data_bag_item(dbi, data_bag_shared_key)
|
153
153
|
|
154
154
|
puts("INFO: Writing #{data_bag_path}/#{username}.json...")
|
155
|
-
open("#{data_bag_path}/#{username}.json",'w').write(JSON.pretty_generate(edbi))
|
155
|
+
File.open("#{data_bag_path}/#{username}.json",'w'){ |file| file.write(JSON.pretty_generate(edbi)) }
|
156
156
|
end
|
157
157
|
|
158
158
|
puts("INFO: Successfully wrote #{data_bag_path}/#{username}.json & #{data_bag_path}/#{username}_keys.json!")
|
@@ -172,7 +172,7 @@ class EncryptPassword < Chef::Knife
|
|
172
172
|
data_bag_path = "./data_bags/#{db}"
|
173
173
|
|
174
174
|
private_key = OpenSSL::PKey::RSA.new(open(Chef::Config[:client_key]).read())
|
175
|
-
key = File.exists?("#{data_bag_path}/#{dbi}_keys.json") ? JSON.parse(open("#{data_bag_path}/#{dbi}_keys.json").read()) : nil
|
175
|
+
key = File.exists?("#{data_bag_path}/#{dbi}_keys.json") ? JSON.parse(File.open("#{data_bag_path}/#{dbi}_keys.json"){ |file| file.read() }) : nil
|
176
176
|
|
177
177
|
begin
|
178
178
|
private_key.private_decrypt(Base64.decode64(key[Chef::Config[:node_name]]))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-vault
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chef
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 0.10.10
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
30
62
|
description: Data encryption support for chef using data bags
|
31
63
|
email:
|
32
64
|
- kevin.moser@nordstrom.com
|
@@ -37,10 +69,10 @@ extra_rdoc_files: []
|
|
37
69
|
files:
|
38
70
|
- .gitignore
|
39
71
|
- .rspec
|
72
|
+
- .travis.yml
|
40
73
|
- CONTRIBUTING.md
|
41
74
|
- Changelog.md
|
42
75
|
- Gemfile
|
43
|
-
- Gemfile.lock
|
44
76
|
- LICENSE
|
45
77
|
- README.md
|
46
78
|
- Rakefile
|
data/Gemfile.lock
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: https://rubygems.org/
|
3
|
-
specs:
|
4
|
-
bunny (0.7.9)
|
5
|
-
chef (10.16.6)
|
6
|
-
bunny (>= 0.6.0, < 0.8.0)
|
7
|
-
erubis
|
8
|
-
highline (>= 1.6.9)
|
9
|
-
json (>= 1.4.4, <= 1.6.1)
|
10
|
-
mixlib-authentication (>= 1.3.0)
|
11
|
-
mixlib-cli (>= 1.1.0)
|
12
|
-
mixlib-config (>= 1.1.2)
|
13
|
-
mixlib-log (>= 1.3.0)
|
14
|
-
mixlib-shellout
|
15
|
-
moneta (< 0.7.0)
|
16
|
-
net-ssh (~> 2.2.2)
|
17
|
-
net-ssh-multi (~> 1.1.0)
|
18
|
-
ohai (>= 0.6.0)
|
19
|
-
rest-client (>= 1.0.4, < 1.7.0)
|
20
|
-
treetop (~> 1.4.9)
|
21
|
-
uuidtools
|
22
|
-
yajl-ruby (~> 1.1)
|
23
|
-
diff-lcs (1.2.4)
|
24
|
-
erubis (2.7.0)
|
25
|
-
highline (1.6.18)
|
26
|
-
ipaddress (0.8.0)
|
27
|
-
json (1.6.1)
|
28
|
-
mime-types (1.23)
|
29
|
-
mixlib-authentication (1.3.0)
|
30
|
-
mixlib-log
|
31
|
-
mixlib-cli (1.3.0)
|
32
|
-
mixlib-config (1.1.2)
|
33
|
-
mixlib-log (1.6.0)
|
34
|
-
mixlib-shellout (1.1.0)
|
35
|
-
moneta (0.6.0)
|
36
|
-
net-ssh (2.2.2)
|
37
|
-
net-ssh-gateway (1.1.0)
|
38
|
-
net-ssh (>= 1.99.1)
|
39
|
-
net-ssh-multi (1.1)
|
40
|
-
net-ssh (>= 2.1.4)
|
41
|
-
net-ssh-gateway (>= 0.99.0)
|
42
|
-
ohai (6.16.0)
|
43
|
-
ipaddress
|
44
|
-
mixlib-cli
|
45
|
-
mixlib-config
|
46
|
-
mixlib-log
|
47
|
-
mixlib-shellout
|
48
|
-
systemu
|
49
|
-
yajl-ruby
|
50
|
-
polyglot (0.3.3)
|
51
|
-
rest-client (1.6.7)
|
52
|
-
mime-types (>= 1.16)
|
53
|
-
rspec (2.13.0)
|
54
|
-
rspec-core (~> 2.13.0)
|
55
|
-
rspec-expectations (~> 2.13.0)
|
56
|
-
rspec-mocks (~> 2.13.0)
|
57
|
-
rspec-core (2.13.1)
|
58
|
-
rspec-expectations (2.13.0)
|
59
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
60
|
-
rspec-mocks (2.13.1)
|
61
|
-
systemu (2.5.2)
|
62
|
-
treetop (1.4.12)
|
63
|
-
polyglot
|
64
|
-
polyglot (>= 0.3.1)
|
65
|
-
uuidtools (2.1.3)
|
66
|
-
yajl-ruby (1.1.0)
|
67
|
-
|
68
|
-
PLATFORMS
|
69
|
-
ruby
|
70
|
-
|
71
|
-
DEPENDENCIES
|
72
|
-
chef
|
73
|
-
rspec
|