clarenceb-hiera-eyaml 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []