clarenceb-hiera-eyaml 2.0.1

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.
Files changed (36) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +10 -0
  3. data/Gemfile +17 -0
  4. data/Gemfile.lock +52 -0
  5. data/LICENSE.txt +21 -0
  6. data/PLUGINS.md +4 -0
  7. data/README.md +322 -0
  8. data/Rakefile +1 -0
  9. data/bin/eyaml +13 -0
  10. data/hiera-eyaml.gemspec +22 -0
  11. data/lib/hiera/backend/eyaml/CLI.rb +60 -0
  12. data/lib/hiera/backend/eyaml/commands.rb +21 -0
  13. data/lib/hiera/backend/eyaml/encryptor.rb +79 -0
  14. data/lib/hiera/backend/eyaml/encryptors/pkcs7.rb +107 -0
  15. data/lib/hiera/backend/eyaml/options.rb +35 -0
  16. data/lib/hiera/backend/eyaml/parser/encrypted_tokens.rb +138 -0
  17. data/lib/hiera/backend/eyaml/parser/parser.rb +82 -0
  18. data/lib/hiera/backend/eyaml/parser/token.rb +49 -0
  19. data/lib/hiera/backend/eyaml/plugins.rb +70 -0
  20. data/lib/hiera/backend/eyaml/subcommand.rb +126 -0
  21. data/lib/hiera/backend/eyaml/subcommands/createkeys.rb +29 -0
  22. data/lib/hiera/backend/eyaml/subcommands/decrypt.rb +81 -0
  23. data/lib/hiera/backend/eyaml/subcommands/edit.rb +105 -0
  24. data/lib/hiera/backend/eyaml/subcommands/encrypt.rb +100 -0
  25. data/lib/hiera/backend/eyaml/subcommands/help.rb +51 -0
  26. data/lib/hiera/backend/eyaml/subcommands/recrypt.rb +56 -0
  27. data/lib/hiera/backend/eyaml/subcommands/unknown_command.rb +48 -0
  28. data/lib/hiera/backend/eyaml/subcommands/version.rb +47 -0
  29. data/lib/hiera/backend/eyaml/utils.rb +172 -0
  30. data/lib/hiera/backend/eyaml.rb +48 -0
  31. data/lib/hiera/backend/eyaml_backend.rb +125 -0
  32. data/sublime_text/README.md +16 -0
  33. data/sublime_text/eyaml.sublime-package +0 -0
  34. data/sublime_text/eyaml.syntax_definition.json +288 -0
  35. data/tools/regem.sh +9 -0
  36. metadata +114 -0
@@ -0,0 +1,48 @@
1
+ class Hiera
2
+ module Backend
3
+ module Eyaml
4
+
5
+ VERSION = "2.0.1"
6
+ DESCRIPTION = "Hiera-eyaml is a backend for Hiera which provides OpenSSL encryption/decryption for Hiera properties"
7
+
8
+ class RecoverableError < StandardError
9
+ end
10
+
11
+ def self.subcommand= command
12
+ @@subcommand = command
13
+ end
14
+
15
+ def self.subcommand
16
+ @@subcommand
17
+ end
18
+
19
+ def self.default_encryption_scheme= new_encryption
20
+ @@default_encryption_scheme = new_encryption
21
+ end
22
+
23
+ def self.default_encryption_scheme
24
+ @@default_encryption_scheme ||= "PKCS7"
25
+ @@default_encryption_scheme
26
+ end
27
+
28
+ def self.verbosity_level= new_verbosity_level
29
+ @@debug_level = new_verbosity_level
30
+ end
31
+
32
+ def self.verbosity_level
33
+ @@debug_level ||= 1
34
+ @@debug_level
35
+ end
36
+
37
+ def self.subcommands= commands
38
+ @@subcommands = commands
39
+ end
40
+
41
+ def self.subcommands
42
+ @@subcommands
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,125 @@
1
+ require 'hiera/backend/eyaml/encryptor'
2
+ require 'hiera/backend/eyaml/utils'
3
+ require 'hiera/backend/eyaml/options'
4
+ require 'hiera/backend/eyaml/parser/parser'
5
+ require 'yaml'
6
+
7
+ class Hiera
8
+ module Backend
9
+ class Eyaml_backend
10
+
11
+ def initialize
12
+ @extension = Config[:eyaml][:extension] ? Config[:eyaml][:extension] : "eyaml"
13
+ end
14
+
15
+ def lookup(key, scope, order_override, resolution_type)
16
+
17
+ debug("Lookup called for key #{key}")
18
+ answer = nil
19
+
20
+ Backend.datasources(scope, order_override) do |source|
21
+ eyaml_file = Backend.datafile(:eyaml, scope, source, @extension) || next
22
+
23
+ debug("Processing datasource: #{eyaml_file}")
24
+
25
+ data = YAML.load(File.read( eyaml_file ))
26
+
27
+ next if data.nil? or data.empty?
28
+ debug ("Data contains valid YAML")
29
+
30
+ next unless data.include?(key)
31
+ debug ("Key #{key} found in YAML document")
32
+
33
+ parsed_answer = parse_answer(key, data[key], scope)
34
+
35
+ begin
36
+ case resolution_type
37
+ when :array
38
+ debug("Appending answer array")
39
+ raise Exception, "Hiera type mismatch: expected Array and got #{parsed_answer.class}" unless parsed_answer.kind_of? Array or parsed_answer.kind_of? String
40
+ answer ||= []
41
+ answer << parsed_answer
42
+ when :hash
43
+ debug("Merging answer hash")
44
+ raise Exception, "Hiera type mismatch: expected Hash and got #{parsed_answer.class}" unless parsed_answer.kind_of? Hash
45
+ answer ||= {}
46
+ answer = Backend.merge_answer(parsed_answer,answer)
47
+ else
48
+ debug("Assigning answer variable")
49
+ answer = parsed_answer
50
+ break
51
+ end
52
+ rescue NoMethodError
53
+ raise Exception, "Resolution type is #{resolution_type} but parsed_answer is a #{parsed_answer.class}"
54
+ end
55
+ end
56
+
57
+ answer
58
+ end
59
+
60
+ def parse_answer(key, data, scope, extra_data={})
61
+ if data.is_a?(Numeric) or data.is_a?(TrueClass) or data.is_a?(FalseClass)
62
+ # Can't be encrypted
63
+ data
64
+ elsif data.is_a?(String)
65
+ parsed_string = Backend.parse_string(data, scope)
66
+ decrypt(key, parsed_string, scope)
67
+ elsif data.is_a?(Hash)
68
+ answer = {}
69
+ data.each_pair do |key, val|
70
+ answer[key] = parse_answer(key, val, scope, extra_data)
71
+ end
72
+ answer
73
+ elsif data.is_a?(Array)
74
+ answer = []
75
+ data.each do |item|
76
+ answer << parse_answer(key, item, scope, extra_data)
77
+ end
78
+ answer
79
+ end
80
+ end
81
+
82
+ def deblock block_string
83
+ block_string.gsub(/[ \n]/, '')
84
+ end
85
+
86
+ def decrypt(key, value, scope)
87
+
88
+ if encrypted? value
89
+
90
+ debug "Attempting to decrypt: #{key}"
91
+
92
+ Config[:eyaml].each do |config_key, config_value|
93
+ config_value = Backend.parse_string(Config[:eyaml][config_key], scope)
94
+ debug "Setting: #{config_key} = #{config_value}"
95
+ Eyaml::Options[config_key] = config_value
96
+ end
97
+
98
+ Eyaml::Options[:source] = "hiera"
99
+
100
+ parser = Eyaml::Parser::ParserFactory.hiera_backend_parser
101
+ tokens = parser.parse(value)
102
+ decrypted = tokens.map{ |token| token.to_plain_text }
103
+ plaintext = decrypted.join
104
+
105
+ plaintext.chomp
106
+
107
+ else
108
+ value
109
+ end
110
+ end
111
+
112
+ def encrypted?(value)
113
+ if value.match(/.*ENC\[.*?\]/) then true else false end
114
+ end
115
+
116
+ def debug(msg)
117
+ Hiera.debug("[eyaml_backend]: #{msg}")
118
+ end
119
+
120
+ def warn(msg)
121
+ Hiera.warn("[eyaml_backend]: #{msg}")
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,16 @@
1
+ Sublime Text Syntax Highlighting Package
2
+ ========================================
3
+
4
+ The contents of this directory give syntax highlighting to .eyaml files in Sublime Text 2+
5
+
6
+ Install
7
+ =======
8
+
9
+ To install, simply copy eyaml.sublime-package into your "Installed Packages" directory in the data directory of your Sublime Text 2 installation. The data directory is:
10
+
11
+ * Windows: %APPDATA%/Sublime Text 2
12
+ * OS X: ~/Library/Application Support/Sublime Text 2
13
+ * Linux: ~/.Sublime Text 2
14
+
15
+ Then restart sublimetext
16
+
Binary file
@@ -0,0 +1,288 @@
1
+ { "name": "EYAML",
2
+ "scopeName": "source.eyaml",
3
+ "fileTypes": ["eyaml"],
4
+ "foldingStartMarker": "^[^#]\\s*.*:(\\s*\\[?| &.+)?$",
5
+ "foldingStopMarker": "^\\s*$|^\\s*\\}|^\\s*\\]|^\\s*\\)",
6
+ "keyEquivalent": "^~Y",
7
+ "repository": {
8
+ "erb": {
9
+ "end": "%>",
10
+ "begin": "<%+(?!>)=?",
11
+ "patterns": [
12
+ {
13
+ "match": "(#).*?(?=%>)",
14
+ "captures": {
15
+ "1": {
16
+ "name": "punctuation.definition.comment.ruby"
17
+ }
18
+ },
19
+ "name": "comment.line.number-sign.ruby"
20
+ },
21
+ {
22
+ "include": "source.ruby.rails"
23
+ }
24
+ ],
25
+ "captures": {
26
+ "0": {
27
+ "name": "punctuation.section.embedded.ruby"
28
+ }
29
+ },
30
+ "name": "source.ruby.rails.embedded.html"
31
+ },
32
+ "escaped_char": {
33
+ "match": "\\\\.",
34
+ "name": "constant.character.escape.yaml"
35
+ }
36
+ },
37
+ "patterns": [
38
+ {
39
+ "include": "#erb"
40
+ },
41
+ {
42
+ "end": "^(?!^\\1)|^(?=\\1(-|\\w+\\s*:)|#)",
43
+ "begin": "^(\\s*)(?:(-)|(?:(-\\s*)?(\\w+\\s*(:))))\\s*(\\||>)",
44
+ "beginCaptures": {
45
+ "3": {
46
+ "name": "punctuation.definition.entry.yaml"
47
+ },
48
+ "4": {
49
+ "name": "entity.name.tag.yaml"
50
+ },
51
+ "5": {
52
+ "name": "punctuation.separator.key-value.yaml"
53
+ },
54
+ "2": {
55
+ "name": "punctuation.definition.entry.yaml"
56
+ }
57
+ },
58
+ "patterns": [
59
+ {
60
+ "include": "#erb"
61
+ }
62
+ ],
63
+ "name": "string.unquoted.block.yaml"
64
+ },
65
+ {
66
+ "match": "(?:(?:(-\\s*)?(\\w+\\s*(:)))|(-))\\s*((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\s*$",
67
+ "captures": {
68
+ "3": {
69
+ "name": "punctuation.separator.key-value.yaml"
70
+ },
71
+ "4": {
72
+ "name": "punctuation.definition.entry.yaml"
73
+ },
74
+ "1": {
75
+ "name": "punctuation.definition.entry.yaml"
76
+ },
77
+ "2": {
78
+ "name": "entity.name.tag.yaml"
79
+ }
80
+ },
81
+ "name": "constant.numeric.yaml"
82
+ },
83
+ {
84
+ "match": "(?:(?:(-\\s*)?(\\w+\\s*(:)))|(-))\\s*(?:((\")[^\"]*(\"))|((')[^']*('))|([^,{}&#\\[\\]]+))\\s*",
85
+ "captures": {
86
+ "7": {
87
+ "name": "punctuation.definition.string.end.yaml"
88
+ },
89
+ "3": {
90
+ "name": "punctuation.separator.key-value.yaml"
91
+ },
92
+ "11": {
93
+ "name": "string.unquoted.yaml"
94
+ },
95
+ "4": {
96
+ "name": "punctuation.definition.entry.yaml"
97
+ },
98
+ "8": {
99
+ "name": "string.quoted.single.yaml"
100
+ },
101
+ "9": {
102
+ "name": "punctuation.definition.string.begin.yaml"
103
+ },
104
+ "5": {
105
+ "name": "string.quoted.double.yaml"
106
+ },
107
+ "1": {
108
+ "name": "punctuation.definition.entry.yaml"
109
+ },
110
+ "6": {
111
+ "name": "punctuation.definition.string.begin.yaml"
112
+ },
113
+ "10": {
114
+ "name": "punctuation.definition.string.end.yaml"
115
+ },
116
+ "2": {
117
+ "name": "entity.name.tag.yaml"
118
+ }
119
+ },
120
+ "name": "string.unquoted.yaml"
121
+ },
122
+ {
123
+ "match": "(?:(?:(-\\s*)?(\\w+\\s*(:)))|(-))\\s*([0-9]{4}-[0-9]{2}-[0-9]{2})\\s*$",
124
+ "captures": {
125
+ "3": {
126
+ "name": "punctuation.separator.key-value.yaml"
127
+ },
128
+ "4": {
129
+ "name": "punctuation.definition.entry.yaml"
130
+ },
131
+ "1": {
132
+ "name": "punctuation.definition.entry.yaml"
133
+ },
134
+ "2": {
135
+ "name": "entity.name.tag.yaml"
136
+ }
137
+ },
138
+ "name": "constant.other.date.yaml"
139
+ },
140
+ {
141
+ "match": "(\\w.*?)(:)\\s*((\\!\\!)omap)?",
142
+ "captures": {
143
+ "3": {
144
+ "name": "keyword.other.omap.yaml"
145
+ },
146
+ "4": {
147
+ "name": "punctuation.definition.keyword.yaml"
148
+ },
149
+ "1": {
150
+ "name": "entity.name.tag.yaml"
151
+ },
152
+ "2": {
153
+ "name": "punctuation.separator.key-value.yaml"
154
+ }
155
+ },
156
+ "name": "meta.tag.yaml"
157
+ },
158
+ {
159
+ "match": "(\\&|\\*)\\w.*?$",
160
+ "captures": {
161
+ "1": {
162
+ "name": "punctuation.definition.variable.yaml"
163
+ }
164
+ },
165
+ "name": "variable.other.yaml"
166
+ },
167
+ {
168
+ "end": "\"",
169
+ "begin": "\"",
170
+ "beginCaptures": {
171
+ "0": {
172
+ "name": "punctuation.definition.string.begin.yaml"
173
+ }
174
+ },
175
+ "patterns": [
176
+ {
177
+ "include": "#escaped_char"
178
+ },
179
+ {
180
+ "include": "#erb"
181
+ }
182
+ ],
183
+ "endCaptures": {
184
+ "0": {
185
+ "name": "punctuation.definition.string.end.yaml"
186
+ }
187
+ },
188
+ "name": "string.quoted.double.yaml"
189
+ },
190
+ {
191
+ "end": "'",
192
+ "begin": "'",
193
+ "beginCaptures": {
194
+ "0": {
195
+ "name": "punctuation.definition.string.begin.yaml"
196
+ }
197
+ },
198
+ "patterns": [
199
+ {
200
+ "include": "#escaped_char"
201
+ },
202
+ {
203
+ "include": "#erb"
204
+ }
205
+ ],
206
+ "endCaptures": {
207
+ "0": {
208
+ "name": "punctuation.definition.string.end.yaml"
209
+ }
210
+ },
211
+ "name": "string.quoted.single.yaml"
212
+ },
213
+ {
214
+ "end": "`",
215
+ "begin": "`",
216
+ "beginCaptures": {
217
+ "0": {
218
+ "name": "punctuation.definition.string.begin.yaml"
219
+ }
220
+ },
221
+ "patterns": [
222
+ {
223
+ "include": "#escaped_char"
224
+ },
225
+ {
226
+ "include": "#erb"
227
+ }
228
+ ],
229
+ "endCaptures": {
230
+ "0": {
231
+ "name": "punctuation.definition.string.end.yaml"
232
+ }
233
+ },
234
+ "name": "string.interpolated.yaml"
235
+ },
236
+ {
237
+ "match": "(\\<\\<): ((\\*).*)$",
238
+ "captures": {
239
+ "3": {
240
+ "name": "punctuation.definition.keyword.yaml"
241
+ },
242
+ "1": {
243
+ "name": "entity.name.tag.yaml"
244
+ },
245
+ "2": {
246
+ "name": "keyword.operator.merge-key.yaml"
247
+ }
248
+ },
249
+ "name": "keyword.operator.merge-key.yaml"
250
+ },
251
+ {
252
+ "match": "( |\t)+$",
253
+ "disabled": "1",
254
+ "name": "invalid.deprecated.trailing-whitespace.yaml"
255
+ },
256
+ {
257
+ "match": "(?<!\\$)(#)(?!\\{).*$\\n?",
258
+ "captures": {
259
+ "1": {
260
+ "name": "punctuation.definition.comment.yaml"
261
+ }
262
+ },
263
+ "name": "comment.line.number-sign.yaml"
264
+ },
265
+ {
266
+ "match": "-",
267
+ "name": "keyword.operator.symbol"
268
+ },
269
+ {
270
+ "end": "(?=[^\\t])",
271
+ "begin": "^(?=\\t)",
272
+ "patterns": [
273
+ {
274
+ "match": "(\\t)(\\t)?",
275
+ "captures": {
276
+ "1": {
277
+ "name": "meta.odd-tab"
278
+ },
279
+ "2": {
280
+ "name": "meta.even-tab"
281
+ }
282
+ }
283
+ }
284
+ ],
285
+ "name": "meta.leading-tabs.yaml"
286
+ }
287
+ ], "uuid": "1876aa1d-ff42-4994-b552-663473607454"
288
+ }
data/tools/regem.sh ADDED
@@ -0,0 +1,9 @@
1
+ #!/bin/bash
2
+
3
+ gem uninstall hiera-eyaml --executables
4
+ RAKE_OUT=`rake build`
5
+ echo ${RAKE_OUT}
6
+ VERSION=`echo ${RAKE_OUT} | awk '{print $2}'`
7
+ echo Installing version: ${VERSION} ...
8
+ gem install pkg/hiera-eyaml-${VERSION}.gem
9
+ eyaml -v
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clarenceb-hiera-eyaml
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 2.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Tom Poulton
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-01-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: trollop
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '2.0'
21
+ none: false
22
+ requirement: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ none: false
28
+ prerelease: false
29
+ type: :runtime
30
+ - !ruby/object:Gem::Dependency
31
+ name: highline
32
+ version_requirements: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: 1.6.19
37
+ none: false
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: 1.6.19
43
+ none: false
44
+ prerelease: false
45
+ type: :runtime
46
+ description: 'Hiera backend for decrypting encrypted yaml properties (Fix for Issue
47
+ #62)'
48
+ email:
49
+ executables:
50
+ - eyaml
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - .travis.yml
56
+ - Gemfile
57
+ - Gemfile.lock
58
+ - LICENSE.txt
59
+ - PLUGINS.md
60
+ - README.md
61
+ - Rakefile
62
+ - bin/eyaml
63
+ - hiera-eyaml.gemspec
64
+ - lib/hiera/backend/eyaml.rb
65
+ - lib/hiera/backend/eyaml/CLI.rb
66
+ - lib/hiera/backend/eyaml/commands.rb
67
+ - lib/hiera/backend/eyaml/encryptor.rb
68
+ - lib/hiera/backend/eyaml/encryptors/pkcs7.rb
69
+ - lib/hiera/backend/eyaml/options.rb
70
+ - lib/hiera/backend/eyaml/parser/encrypted_tokens.rb
71
+ - lib/hiera/backend/eyaml/parser/parser.rb
72
+ - lib/hiera/backend/eyaml/parser/token.rb
73
+ - lib/hiera/backend/eyaml/plugins.rb
74
+ - lib/hiera/backend/eyaml/subcommand.rb
75
+ - lib/hiera/backend/eyaml/subcommands/createkeys.rb
76
+ - lib/hiera/backend/eyaml/subcommands/decrypt.rb
77
+ - lib/hiera/backend/eyaml/subcommands/edit.rb
78
+ - lib/hiera/backend/eyaml/subcommands/encrypt.rb
79
+ - lib/hiera/backend/eyaml/subcommands/help.rb
80
+ - lib/hiera/backend/eyaml/subcommands/recrypt.rb
81
+ - lib/hiera/backend/eyaml/subcommands/unknown_command.rb
82
+ - lib/hiera/backend/eyaml/subcommands/version.rb
83
+ - lib/hiera/backend/eyaml/utils.rb
84
+ - lib/hiera/backend/eyaml_backend.rb
85
+ - sublime_text/README.md
86
+ - sublime_text/eyaml.sublime-package
87
+ - sublime_text/eyaml.syntax_definition.json
88
+ - tools/regem.sh
89
+ homepage: https://github.com/clarenceb/hiera-eyaml
90
+ licenses:
91
+ - MIT
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ none: false
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ none: false
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 1.8.24
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: OpenSSL Encryption backend for Hiera
114
+ test_files: []