hiera-eyaml 1.3.7 → 1.3.8
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/.travis.yml +10 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +5 -7
- data/README.md +151 -57
- data/lib/hiera/backend/eyaml.rb +4 -1
- data/lib/hiera/backend/eyaml/CLI.rb +15 -9
- data/lib/hiera/backend/eyaml/actions/edit_action.rb +45 -33
- data/lib/hiera/backend/eyaml/actions/recrypt_action.rb +44 -0
- data/lib/hiera/backend/eyaml/encryptors/pkcs7.rb +5 -1
- data/lib/hiera/backend/eyaml_backend.rb +5 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0794eaaca28f7702c08e251f54f938c06c7856fe
|
4
|
+
data.tar.gz: 505eea5b6e2bc567f5587adabb3c0aaef8b701e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b995c5e993985e4d38c0b1dfe55c0767057311cf00c75b3d3ac12538dfe7d58a9343a949005f06ccb1d1ea10628ffea2bf13e770d3ea5dad1288e2e09ba30174
|
7
|
+
data.tar.gz: b54b10584df24f60bf148bd62116e9c6b6426e67be16a4c95172b2e1776cd33a30b308dba0a17a7814ceac84268749a35737567147605714e63e85b7ac6f8fbd
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -8,7 +8,7 @@ GEM
|
|
8
8
|
builder (3.2.2)
|
9
9
|
childprocess (0.3.9)
|
10
10
|
ffi (~> 1.0, >= 1.0.11)
|
11
|
-
cucumber (1.3.
|
11
|
+
cucumber (1.3.10)
|
12
12
|
builder (>= 2.1.2)
|
13
13
|
diff-lcs (>= 1.1.3)
|
14
14
|
gherkin (~> 2.12)
|
@@ -21,19 +21,16 @@ GEM
|
|
21
21
|
multi_json (~> 1.3)
|
22
22
|
hiera (1.2.1)
|
23
23
|
json_pure
|
24
|
-
hiera-eyaml (
|
25
|
-
highline (>= 1.6.19)
|
26
|
-
trollop (>= 2.0)
|
27
|
-
hiera-eyaml-plaintext (0.4)
|
28
|
-
hiera-eyaml (>= 1.3.1)
|
24
|
+
hiera-eyaml-plaintext (0.5)
|
29
25
|
highline (1.6.20)
|
30
26
|
json_pure (1.8.1)
|
31
27
|
multi_json (1.8.2)
|
32
28
|
multi_test (0.0.2)
|
33
|
-
puppet (3.3.
|
29
|
+
puppet (3.3.2)
|
34
30
|
facter (~> 1.6)
|
35
31
|
hiera (~> 1.0)
|
36
32
|
rgen (~> 0.6.5)
|
33
|
+
rake (10.1.0)
|
37
34
|
rgen (0.6.6)
|
38
35
|
rspec-expectations (2.14.4)
|
39
36
|
diff-lcs (>= 1.1.3, < 2.0)
|
@@ -47,4 +44,5 @@ DEPENDENCIES
|
|
47
44
|
hiera-eyaml-plaintext
|
48
45
|
highline
|
49
46
|
puppet
|
47
|
+
rake
|
50
48
|
trollop
|
data/README.md
CHANGED
@@ -1,17 +1,39 @@
|
|
1
|
-
Hiera
|
1
|
+
Hiera eyaml
|
2
2
|
===========
|
3
3
|
|
4
|
-
|
5
|
-
within yaml type files to be used by Puppet.
|
4
|
+
[](https://travis-ci.org/TomPoulton/hiera-eyaml)
|
6
5
|
|
7
|
-
|
6
|
+
hiera-eyaml is a backend for Hiera that provides per-value encryption of sensitive data within yaml files
|
7
|
+
to be used by Puppet.
|
8
8
|
|
9
|
-
The Hiera eYaml backend uses yaml formatted files with the .eyaml extension. Simply prefix your
|
10
|
-
encrypted string with the encryption method (PKCS7,) wrap it with ENC[] and place it in an eyaml file. You can mix your plain values in as well or separate them into different files.
|
11
9
|
|
12
|
-
|
10
|
+
Advantages over hiera-gpg
|
11
|
+
-------------------------
|
13
12
|
|
14
|
-
|
13
|
+
A few people found that [hiera-gpg](https://github.com/crayfishx/hiera-gpg) just wasn't cutting it for all use cases,
|
14
|
+
one of the best expressed frustrations was
|
15
|
+
[written back in June 2013](http://slashdevslashrandom.wordpress.com/2013/06/03/my-griefs-with-hiera-gpg/). So
|
16
|
+
[Tom created an initial version](http://themettlemonkey.wordpress.com/2013/07/15/hiera-eyaml-per-value-encrypted-backend-for-hiera-and-puppet/)
|
17
|
+
and this was refined into an elegant solution over the following months.
|
18
|
+
|
19
|
+
Unlike `hiera-gpg`, `hiera-eyaml`:
|
20
|
+
|
21
|
+
- only encrypts the values (which allows files to be swiftly reviewed without decryption)
|
22
|
+
- encrypts the value of each key individually (this means that `git diff` is meaningful)
|
23
|
+
- includes a command line tool for encrypting, decrypting, editing and rotating keys (makes it almost as
|
24
|
+
easy as using clear text files)
|
25
|
+
- uses basic asymmetric encryption (PKCS#7) by default (doesn't require any native libraries that need to
|
26
|
+
be compiled & allows users without the private key to encrypt values that the puppet master can decrypt)
|
27
|
+
- has a pluggable encryption framework (e.g. GPG encryption ([hiera-eyaml-gpg](https://github.com/sihil/hiera-eyaml-gpg)) can be used
|
28
|
+
if you have the need for multiple keys and easier key rotation)
|
29
|
+
|
30
|
+
The Hiera eyaml backend uses yaml formatted files with the .eyaml extension. The encrypted strings are prefixed with the encryption
|
31
|
+
method, wrapped with ENC[] and placed in an eyaml file. You can mix your plain values in as well or separate them into different files.
|
32
|
+
Encrypted values can occur within arrays, hashes, nested arrays and nested hashes.
|
33
|
+
|
34
|
+
For instance:
|
35
|
+
|
36
|
+
```yaml
|
15
37
|
---
|
16
38
|
plain-property: You can see me
|
17
39
|
|
@@ -22,24 +44,19 @@ encrypted-property: >
|
|
22
44
|
l5ZP119Fwq8xiREGOL0lVvFYJz2hZc1ppPCNG5lwuLnTekXN/OazNYpf4CMd
|
23
45
|
/HjZFXwcXRtTlzewJLc+/gox2IfByQRhsI/AgogRfYQKocZgFb/DOZoXR7wm
|
24
46
|
IZGeunzwhqfmEtGiqpvJJQ5wVRdzJVpTnANBA5qxeA==]
|
25
|
-
|
47
|
+
```
|
48
|
+
|
49
|
+
To edit this you can use the command `eyaml -i important.eyaml` which will decrypt the file, fire up an editor with
|
50
|
+
the decrypted values and re-encrypt any edited values when you exit the editor. This tool makes editing your encrypted
|
51
|
+
files as simple as clear text files.
|
26
52
|
|
27
|
-
eYaml supports multiple encryption types, and encrypted values can occur within arrays, hashes, nested arrays and nested hashes
|
28
53
|
|
29
54
|
Setup
|
30
|
-
|
55
|
+
-----
|
31
56
|
|
32
57
|
### Installing hiera-eyaml
|
33
58
|
|
34
59
|
$ gem install hiera-eyaml
|
35
|
-
|
36
|
-
#### Installing from behind a corporate/application proxy
|
37
|
-
$ export HTTP_PROXY=http://yourcorporateproxy:3128/
|
38
|
-
$ export HTTPS_PROXY=http://yourcorporateproxy:3128/
|
39
|
-
|
40
|
-
then run your install
|
41
|
-
|
42
|
-
$ gem install hiera-eyaml
|
43
60
|
|
44
61
|
### Generate keys
|
45
62
|
|
@@ -54,11 +71,11 @@ This creates a public and private key with default names in the default location
|
|
54
71
|
Since the point of using this module is to securely store sensitive information, it's important to store these keys securely.
|
55
72
|
If using Hiera with Puppet, Your puppetmaster will need to access these keys to perform decryption when the puppet agent runs on a remote node.
|
56
73
|
So for this reason, a suggested location might be to store them in:
|
57
|
-
|
74
|
+
|
58
75
|
/etc/puppet/secure/keys
|
59
|
-
|
76
|
+
|
60
77
|
(Using a secure/keys/ subfolder is so that you can still store other secure puppet files in the secure/ folder that might not be related to this module.)
|
61
|
-
|
78
|
+
|
62
79
|
The permissions for this folder should allow the puppet user (normally 'puppet') execute access to the keys directory, read only access to the keys themselves and restrict everyone else:
|
63
80
|
|
64
81
|
$ chown -R puppet:puppet /etc/puppet/secure/keys
|
@@ -91,37 +108,60 @@ To test decryption you can also use the eyaml tool if you have both keys
|
|
91
108
|
$ eyaml -d -f filename # Decrypt a file
|
92
109
|
$ eyaml -d -s 'ENC[PKCS7,.....]' # Decrypt a string
|
93
110
|
|
94
|
-
###
|
111
|
+
### Editing eyaml files
|
95
112
|
|
96
|
-
Once you have created a few eyaml files, with a mixture of encrypted and non-encrypted properties,
|
113
|
+
Once you have created a few eyaml files, with a mixture of encrypted and non-encrypted properties,
|
114
|
+
you can edit the encrypted values in place, using the special edit mode of the eyaml utility. Edit
|
115
|
+
mode opens a decrypted copy of the eyaml file in your `$EDITOR` and will encrypt and modified values
|
116
|
+
when you exit the editor.
|
97
117
|
|
98
118
|
$ eyaml -i filename.eyaml # Edit an eyaml file in place
|
99
119
|
|
100
|
-
|
101
|
-
|
120
|
+
When editing eyaml files, you will see that the unencrypted plaintext is marked to allow the eyaml tool to
|
121
|
+
identify each encrypted block, along with the encryption method. This is used to make sure that the block
|
122
|
+
is encrypted again only if the clear text value has changed, and is encrypted using the
|
123
|
+
original encryption mechanism (see plugable encryption later).
|
102
124
|
|
103
|
-
|
125
|
+
A decrypted file might look like this:
|
104
126
|
|
105
|
-
|
127
|
+
```yaml
|
128
|
+
---
|
129
|
+
plain-property: You can see me
|
106
130
|
|
107
|
-
|
108
|
-
|
109
|
-
ENC[GPG,SOME_ENCRYPTED_VALUE] # a GPG encrypted value (hiera-eyaml-gpg)
|
110
|
-
... etc ...
|
111
|
-
</pre>
|
131
|
+
cipher-property : >
|
132
|
+
DEC(1)::PKCS7[You can't see me]!
|
112
133
|
|
113
|
-
|
134
|
+
environments:
|
135
|
+
development:
|
136
|
+
host: localhost
|
137
|
+
password: password
|
138
|
+
production:
|
139
|
+
host: prod.org.com
|
140
|
+
password: >
|
141
|
+
DEC(2)::PKCS7[securepassword]!
|
142
|
+
|
143
|
+
things:
|
144
|
+
- thing 1
|
145
|
+
- - nested thing 1.0
|
146
|
+
- >
|
147
|
+
DEC(3)::PKCS7[secure nested thing 1.1]!
|
148
|
+
- - nested thing 2.0
|
149
|
+
- nested thing 2.1
|
150
|
+
```
|
151
|
+
|
152
|
+
Whilst editing you can delete existing values and add new one using the same format (as below). Note that it is important to
|
153
|
+
omit the number in brackets for new values. If any duplicate IDs are found then the re-encryption process will be abandoned
|
154
|
+
by the eyaml tool.
|
155
|
+
|
156
|
+
some_new_key: DEC::PKCS7[a new value to encrypt]!
|
114
157
|
|
115
|
-
<pre>
|
116
|
-
some_key: DEC::PKCS7[very secret password]!
|
117
|
-
</pre>
|
118
158
|
|
119
159
|
Hiera
|
120
|
-
|
160
|
+
-----
|
121
161
|
|
122
162
|
To use eyaml with hiera and puppet, first configure hiera.yaml to use the eyaml backend
|
123
163
|
|
124
|
-
|
164
|
+
```yaml
|
125
165
|
---
|
126
166
|
:backends:
|
127
167
|
- eyaml
|
@@ -139,17 +179,20 @@ To use eyaml with hiera and puppet, first configure hiera.yaml to use the eyaml
|
|
139
179
|
# If using the pkcs7 encryptor (default)
|
140
180
|
:pkcs7_private_key: /path/to/private_key.pkcs7.pem
|
141
181
|
:pkcs7_public_key: /path/to/public_key.pkcs7.pem
|
182
|
+
```
|
142
183
|
|
143
|
-
|
144
|
-
|
145
|
-
Then, edit your hiera yaml files (renaming them with the .eyaml extension), and insert your encrypted values:
|
184
|
+
Then, edit your hiera yaml files, and insert your encrypted values. The default eyaml file extension is .eyaml, however this can be configured in the :eyaml block to set :extension,
|
146
185
|
|
186
|
+
```yaml
|
187
|
+
:eyaml:
|
188
|
+
:extension: 'yaml'
|
189
|
+
```
|
147
190
|
|
148
|
-
*Important Note:*
|
149
|
-
The
|
191
|
+
*Important Note:*
|
192
|
+
The eyaml backend will not parse internally json formatted yaml files, whereas the regular yaml backend will.
|
150
193
|
You'll need to ensure any existing yaml files using json format are converted to syntactically correct yaml format.
|
151
194
|
|
152
|
-
|
195
|
+
```yaml
|
153
196
|
---
|
154
197
|
plain-property: You can see me
|
155
198
|
|
@@ -187,22 +230,36 @@ things:
|
|
187
230
|
IZGeunzwhqfmEtGiqpvJJQ5wVRdzJVpTnANBA5qxeA==]
|
188
231
|
- - nested thing 2.0
|
189
232
|
- nested thing 2.1
|
190
|
-
|
233
|
+
```
|
191
234
|
|
192
|
-
Tests
|
193
|
-
=====
|
194
235
|
|
195
|
-
|
236
|
+
Pluggable Encryption
|
237
|
+
--------------------
|
196
238
|
|
197
|
-
|
239
|
+
hiera-eyaml backend is pluggable, so that further encryption types can be added as separate gems to the general mechanism which hiera-eyaml uses. Hiera-eyaml ships with one default mechanism of 'pkcs7', the encryption type widely used to sign smime email messages.
|
240
|
+
|
241
|
+
Other encryption types (if the gems for them have been loaded) can be specified using the following formats:
|
242
|
+
|
243
|
+
ENC[PKCS7,SOME_ENCRYPTED_VALUE] # a PKCS7 encrypted value
|
244
|
+
ENC[GPG,SOME_ENCRYPTED_VALUE] # a GPG encrypted value (hiera-eyaml-gpg)
|
245
|
+
... etc ...
|
246
|
+
|
247
|
+
When editing eyaml files, you will see that the unencrypted plaintext is marked in such a way as to identify the encryption method. This is so that the eyaml tool knows to encrypt it back using the correct method afterwards:
|
248
|
+
|
249
|
+
some_key: DEC(1)::PKCS7[very secret password]!
|
250
|
+
|
251
|
+
### Encryption plugins
|
252
|
+
|
253
|
+
This is a list of available plugins:
|
254
|
+
|
255
|
+
- [hiera-eyaml-gpg](https://github.com/sihil/hiera-eyaml-gpg) - Provide GPG encryption
|
256
|
+
- [hiera-eyaml-plaintext](https://github.com/gtmtech/hiera-eyaml-plaintext) - This is a no-op encryption plugin that
|
257
|
+
simply base64 encodes the values. It exists as an example plugin to create your own and to do integration tests on
|
258
|
+
hiera-eyaml. **THIS SHOULD NOT BE USED IN PRODUCTION**
|
198
259
|
|
199
|
-
* `expect` (via yum/apt-get or system package)
|
200
|
-
* `aruba` (gem)
|
201
|
-
* `cucumber` (gem)
|
202
|
-
* `puppet` (gem)
|
203
260
|
|
204
261
|
Notes
|
205
|
-
|
262
|
+
-----
|
206
263
|
|
207
264
|
If you do not specify an encryption method within ENC[] tags, it will be assumed to be PKCS7
|
208
265
|
|
@@ -214,8 +271,45 @@ access to a DEV branch will be able to read/view the contents of the PRD branch,
|
|
214
271
|
Github has a great guide on removing sensitive data from repos here:
|
215
272
|
https://help.github.com/articles/remove-sensitive-data
|
216
273
|
|
274
|
+
|
275
|
+
Troubleshooting
|
276
|
+
---------------
|
277
|
+
|
278
|
+
### Installing from behind a corporate/application proxy
|
279
|
+
|
280
|
+
$ export HTTP_PROXY=http://yourcorporateproxy:3128/
|
281
|
+
$ export HTTPS_PROXY=http://yourcorporateproxy:3128/
|
282
|
+
|
283
|
+
then run your install
|
284
|
+
|
285
|
+
$ gem install hiera-eyaml
|
286
|
+
|
287
|
+
|
288
|
+
Issues
|
289
|
+
------
|
290
|
+
|
291
|
+
If you have found a bug then please raise an issue here on github.
|
292
|
+
|
293
|
+
Some of us hang out on #hiera-eyaml on freenode, please drop by if you want to say hi or have a question.
|
294
|
+
|
295
|
+
|
296
|
+
Tests
|
297
|
+
-----
|
298
|
+
|
299
|
+
In order to run the tests, simply run `cucumber` in the top level directory of the project.
|
300
|
+
|
301
|
+
You'll need to have a few requirements installed:
|
302
|
+
|
303
|
+
* `expect` (via yum/apt-get or system package)
|
304
|
+
* `aruba` (gem)
|
305
|
+
* `cucumber` (gem)
|
306
|
+
* `puppet` (gem)
|
307
|
+
|
308
|
+
|
217
309
|
Authors
|
218
|
-
|
310
|
+
-------
|
219
311
|
|
220
312
|
- [Tom Poulton](http://github.com/TomPoulton) - Initial author. eyaml backend.
|
221
|
-
- [Geoff Meakin](http://github.com/gtmtech) - Major contributor. eyaml command
|
313
|
+
- [Geoff Meakin](http://github.com/gtmtech) - Major contributor. eyaml command, tests, CI
|
314
|
+
- [Simon Hildrew](http://github.com/sihil) - Contributor. eyaml edit sub command.
|
315
|
+
- [Robert Fielding](http://github.com/rooprob) - Contributor. eyaml recrypt sub command.
|
data/lib/hiera/backend/eyaml.rb
CHANGED
@@ -4,6 +4,7 @@ require 'hiera/backend/eyaml/utils'
|
|
4
4
|
require 'hiera/backend/eyaml/actions/createkeys_action'
|
5
5
|
require 'hiera/backend/eyaml/actions/decrypt_action'
|
6
6
|
require 'hiera/backend/eyaml/actions/encrypt_action'
|
7
|
+
require 'hiera/backend/eyaml/actions/recrypt_action'
|
7
8
|
require 'hiera/backend/eyaml/actions/edit_action'
|
8
9
|
require 'hiera/backend/eyaml/plugins'
|
9
10
|
require 'hiera/backend/eyaml/options'
|
@@ -16,25 +17,26 @@ class Hiera
|
|
16
17
|
def self.parse
|
17
18
|
|
18
19
|
options = Trollop::options do
|
19
|
-
|
20
|
+
|
20
21
|
version "Hiera-eyaml version " + Hiera::Backend::Eyaml::VERSION.to_s
|
21
22
|
banner <<-EOS
|
22
23
|
Hiera-eyaml is a backend for Hiera which provides OpenSSL encryption/decryption for Hiera properties
|
23
24
|
|
24
25
|
Usage:
|
25
|
-
eyaml [options]
|
26
|
+
eyaml [options]
|
26
27
|
eyaml -i file.eyaml # edit a file
|
27
28
|
eyaml -e -s some-string # encrypt a string
|
28
|
-
eyaml -e -p # encrypt a password
|
29
|
+
eyaml -e -p # encrypt a password
|
29
30
|
eyaml -e -f file.txt # encrypt a file
|
30
31
|
cat file.txt | eyaml -e # encrypt a file on a pipe
|
31
32
|
|
32
|
-
Options:
|
33
|
+
Options:
|
33
34
|
EOS
|
34
|
-
|
35
|
+
|
35
36
|
opt :createkeys, "Create public and private keys for use encrypting properties", :short => 'c'
|
36
37
|
opt :decrypt, "Decrypt something", :short => 'd'
|
37
38
|
opt :encrypt, "Encrypt something", :short => 'e'
|
39
|
+
opt :recrypt, "Recrypt something", :short => 'r', :type => :string
|
38
40
|
opt :edit, "Decrypt, Edit, and Reencrypt", :short => 'i', :type => :string
|
39
41
|
opt :eyaml, "Source input is an eyaml file", :short => 'y', :type => :string
|
40
42
|
opt :password, "Source input is a password entered on the terminal", :short => 'p'
|
@@ -53,8 +55,8 @@ Options:
|
|
53
55
|
|
54
56
|
end
|
55
57
|
|
56
|
-
actions = [:createkeys, :decrypt, :encrypt, :edit].collect {|x| x if options[x]}.compact
|
57
|
-
sources = [:edit, :eyaml, :password, :string, :file, :stdin].collect {|x| x if options[x]}.compact
|
58
|
+
actions = [:createkeys, :decrypt, :recrypt, :encrypt, :edit].collect {|x| x if options[x]}.compact
|
59
|
+
sources = [:edit, :recrypt, :eyaml, :password, :string, :file, :stdin].collect {|x| x if options[x]}.compact
|
58
60
|
# sources << :stdin if STDIN
|
59
61
|
|
60
62
|
Trollop::die "You can only specify one of (#{actions.join(', ')})" if actions.count > 1
|
@@ -84,7 +86,11 @@ Options:
|
|
84
86
|
if options[:edit]
|
85
87
|
options[:eyaml] = options[:edit]
|
86
88
|
options[:source] = :eyaml
|
87
|
-
File.read options[:edit]
|
89
|
+
File.read options[:edit]
|
90
|
+
elsif options[:recrypt]
|
91
|
+
options[:eyaml] = options[:recrypt]
|
92
|
+
options[:source] = :eyaml
|
93
|
+
File.read options[:recrypt]
|
88
94
|
else
|
89
95
|
nil
|
90
96
|
end
|
@@ -104,7 +110,7 @@ Options:
|
|
104
110
|
return_value = action_class.execute
|
105
111
|
puts return_value unless return_value.nil?
|
106
112
|
|
107
|
-
end
|
113
|
+
end
|
108
114
|
|
109
115
|
end
|
110
116
|
|
@@ -3,6 +3,7 @@ require 'hiera/backend/eyaml/actions/decrypt_action'
|
|
3
3
|
require 'hiera/backend/eyaml/actions/encrypt_action'
|
4
4
|
require 'hiera/backend/eyaml/options'
|
5
5
|
require 'hiera/backend/eyaml/parser/parser'
|
6
|
+
require 'highline/import'
|
6
7
|
|
7
8
|
class Hiera
|
8
9
|
module Backend
|
@@ -19,50 +20,61 @@ class Hiera
|
|
19
20
|
decrypted_file = Utils.write_tempfile decrypted_input
|
20
21
|
|
21
22
|
editor = Utils.find_editor
|
22
|
-
system editor, decrypted_file
|
23
|
-
status = $?
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
begin
|
25
|
+
system "#{editor} #{decrypted_file}"
|
26
|
+
status = $?
|
28
27
|
|
29
|
-
|
30
|
-
|
28
|
+
raise StandardError, "File was moved by editor" unless File.file? decrypted_file
|
29
|
+
edited_file = File.read decrypted_file
|
31
30
|
|
32
|
-
|
31
|
+
raise StandardError, "Editor #{editor} has not exited?" unless status.exited?
|
32
|
+
raise StandardError, "Editor did not exit successfully (exit code #{status.exitstatus}), aborting" unless status.exitstatus == 0
|
33
33
|
|
34
|
-
|
35
|
-
Utils.info "No changes detected, exiting"
|
36
|
-
else
|
37
|
-
decrypted_parser = Parser::ParserFactory.decrypted_parser
|
38
|
-
edited_tokens = decrypted_parser.parse(edited_file)
|
34
|
+
raise StandardError, "Edited file is blank" if edited_file.empty?
|
39
35
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
if edited_file == decrypted_input
|
37
|
+
Utils.info "No changes detected, exiting"
|
38
|
+
else
|
39
|
+
decrypted_parser = Parser::ParserFactory.decrypted_parser
|
40
|
+
edited_tokens = decrypted_parser.parse(edited_file)
|
41
|
+
|
42
|
+
# check that the tokens haven't been copy / pasted
|
43
|
+
used_ids = edited_tokens.find_all{ |t| t.class.name =~ /::EncToken$/ and !t.id.nil? }.map{ |t| t.id }
|
44
|
+
if used_ids.length != used_ids.uniq.length
|
45
|
+
raise RecoverableError, "A duplicate DEC(ID) was found so I don't know how to proceed. This is probably because you copy and pasted a value - if you do this please delete the ID in parentheses"
|
46
|
+
end
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
# replace untouched values with the source values
|
49
|
+
edited_denoised_tokens = edited_tokens.map{ |token|
|
50
|
+
if token.class.name =~ /::EncToken$/ && !token.id.nil?
|
51
|
+
old_token = tokens[token.id]
|
52
|
+
if old_token.plain_text.eql? token.plain_text
|
53
|
+
old_token
|
54
|
+
else
|
55
|
+
token
|
56
|
+
end
|
52
57
|
else
|
53
58
|
token
|
54
59
|
end
|
55
|
-
|
56
|
-
token
|
57
|
-
end
|
58
|
-
}
|
60
|
+
}
|
59
61
|
|
60
|
-
|
62
|
+
encrypted_output = edited_denoised_tokens.map{ |t| t.to_encrypted }.join
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
filename = Eyaml::Options[:eyaml]
|
65
|
+
File.open("#{filename}", 'w') { |file|
|
66
|
+
file.write encrypted_output
|
67
|
+
}
|
68
|
+
end
|
69
|
+
rescue RecoverableError => e
|
70
|
+
Utils.info e
|
71
|
+
if agree "Return to the editor to try again?"
|
72
|
+
retry
|
73
|
+
else
|
74
|
+
raise e
|
75
|
+
end
|
76
|
+
ensure
|
77
|
+
Utils.secure_file_delete :file => decrypted_file, :num_bytes => [edited_file.length, decrypted_input.length].max
|
66
78
|
end
|
67
79
|
|
68
80
|
nil
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'hiera/backend/eyaml/utils'
|
2
|
+
require 'hiera/backend/eyaml/actions/decrypt_action'
|
3
|
+
require 'hiera/backend/eyaml/actions/encrypt_action'
|
4
|
+
require 'hiera/backend/eyaml/options'
|
5
|
+
require 'hiera/backend/eyaml/parser/parser'
|
6
|
+
|
7
|
+
class Hiera
|
8
|
+
module Backend
|
9
|
+
module Eyaml
|
10
|
+
module Actions
|
11
|
+
|
12
|
+
class RecryptAction
|
13
|
+
|
14
|
+
def self.execute
|
15
|
+
|
16
|
+
encrypted_parser = Parser::ParserFactory.encrypted_parser
|
17
|
+
tokens = encrypted_parser.parse Eyaml::Options[:input_data]
|
18
|
+
decrypted_input = tokens.each_with_index.to_a.map{|(t,index)| t.to_decrypted :index => index}.join
|
19
|
+
decrypted_file = Utils.write_tempfile decrypted_input
|
20
|
+
|
21
|
+
edited_file = File.read decrypted_file
|
22
|
+
Utils.secure_file_delete :file => decrypted_file, :num_bytes => [edited_file.length, decrypted_input.length].max
|
23
|
+
|
24
|
+
raise StandardError, "Edited file is blank" if edited_file.empty?
|
25
|
+
|
26
|
+
decrypted_parser = Parser::ParserFactory.decrypted_parser
|
27
|
+
edited_tokens = decrypted_parser.parse(edited_file)
|
28
|
+
|
29
|
+
encrypted_output = edited_tokens.map{ |t| t.to_encrypted }.join
|
30
|
+
|
31
|
+
filename = Eyaml::Options[:eyaml]
|
32
|
+
File.open("#{filename}", 'w') { |file|
|
33
|
+
file.write encrypted_output
|
34
|
+
}
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -69,7 +69,11 @@ class Hiera
|
|
69
69
|
cert.serial = 0
|
70
70
|
cert.version = 2
|
71
71
|
cert.not_before = Time.now
|
72
|
-
cert.not_after =
|
72
|
+
cert.not_after = if 1.size == 8 # 64bit
|
73
|
+
Time.now + 50 * 365 * 24 * 60 * 60
|
74
|
+
else # 32bit
|
75
|
+
Time.at(0x7fffffff)
|
76
|
+
end
|
73
77
|
cert.public_key = key.public_key
|
74
78
|
|
75
79
|
ef = OpenSSL::X509::ExtensionFactory.new
|
@@ -7,8 +7,9 @@ require 'yaml'
|
|
7
7
|
class Hiera
|
8
8
|
module Backend
|
9
9
|
class Eyaml_backend
|
10
|
-
|
10
|
+
|
11
11
|
def initialize
|
12
|
+
@extension = Config[:eyaml][:extension] ? Config[:eyaml][:extension] : "eyaml"
|
12
13
|
end
|
13
14
|
|
14
15
|
def lookup(key, scope, order_override, resolution_type)
|
@@ -17,7 +18,7 @@ class Hiera
|
|
17
18
|
answer = nil
|
18
19
|
|
19
20
|
Backend.datasources(scope, order_override) do |source|
|
20
|
-
eyaml_file = Backend.datafile(:eyaml, scope, source,
|
21
|
+
eyaml_file = Backend.datafile(:eyaml, scope, source, @extension) || next
|
21
22
|
|
22
23
|
debug("Processing datasource: #{eyaml_file}")
|
23
24
|
|
@@ -42,7 +43,7 @@ class Hiera
|
|
42
43
|
debug("Merging answer hash")
|
43
44
|
raise Exception, "Hiera type mismatch: expected Hash and got #{parsed_answer.class}" unless parsed_answer.kind_of? Hash
|
44
45
|
answer ||= {}
|
45
|
-
answer = parsed_answer
|
46
|
+
answer = Backend.merge_answer(parsed_answer,answer)
|
46
47
|
else
|
47
48
|
debug("Assigning answer variable")
|
48
49
|
answer = parsed_answer
|
@@ -87,7 +88,7 @@ class Hiera
|
|
87
88
|
if encrypted? value
|
88
89
|
|
89
90
|
debug "Attempting to decrypt: #{key}"
|
90
|
-
|
91
|
+
|
91
92
|
Config[:eyaml].each do |config_key, config_value|
|
92
93
|
config_value = Backend.parse_string(Config[:eyaml][config_key], scope)
|
93
94
|
debug "Setting: #{config_key} = #{config_value}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hiera-eyaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Poulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trollop
|
@@ -46,6 +46,7 @@ extensions: []
|
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- .gitignore
|
49
|
+
- .travis.yml
|
49
50
|
- Gemfile
|
50
51
|
- Gemfile.lock
|
51
52
|
- LICENSE.txt
|
@@ -60,6 +61,7 @@ files:
|
|
60
61
|
- lib/hiera/backend/eyaml/actions/decrypt_action.rb
|
61
62
|
- lib/hiera/backend/eyaml/actions/edit_action.rb
|
62
63
|
- lib/hiera/backend/eyaml/actions/encrypt_action.rb
|
64
|
+
- lib/hiera/backend/eyaml/actions/recrypt_action.rb
|
63
65
|
- lib/hiera/backend/eyaml/encryptor.rb
|
64
66
|
- lib/hiera/backend/eyaml/encryptors/pkcs7.rb
|
65
67
|
- lib/hiera/backend/eyaml/options.rb
|