jerakia 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jerakia.rb +4 -5
- data/lib/jerakia/answer.rb +33 -3
- data/lib/jerakia/cli.rb +3 -1
- data/lib/jerakia/cli/lookup.rb +3 -3
- data/lib/jerakia/cli/secret.rb +58 -0
- data/lib/jerakia/datasource.rb +73 -32
- data/lib/jerakia/datasource/dummy.rb +6 -10
- data/lib/jerakia/datasource/file.rb +77 -63
- data/lib/jerakia/datasource/file/json.rb +9 -11
- data/lib/jerakia/datasource/file/yaml.rb +12 -14
- data/lib/jerakia/dsl/lookup.rb +15 -17
- data/lib/jerakia/dsl/policy.rb +11 -8
- data/lib/jerakia/encryption.rb +60 -0
- data/lib/jerakia/encryption/vault.rb +168 -0
- data/lib/jerakia/error.rb +10 -0
- data/lib/jerakia/launcher.rb +18 -6
- data/lib/jerakia/log.rb +2 -18
- data/lib/jerakia/lookup.rb +0 -24
- data/lib/jerakia/policy.rb +31 -58
- data/lib/jerakia/response/filter.rb +2 -1
- data/lib/jerakia/response/filter/encryption.rb +21 -38
- data/lib/jerakia/schema.rb +3 -3
- data/lib/jerakia/util/http.rb +51 -0
- data/lib/jerakia/version.rb +1 -1
- metadata +6 -7
- data/lib/hiera/backend/jerakia_backend.rb +0 -59
- data/lib/jerakia/datasource/file_new.rb +0 -82
- data/lib/jerakia/policy/registry.rb +0 -23
- data/lib/puppet/indirector/data_binding/jerakia.rb +0 -33
- data/lib/puppet/indirector/data_binding/jerakia_rest.rb +0 -44
data/lib/jerakia/log.rb
CHANGED
@@ -2,12 +2,12 @@ class Jerakia::Log < Jerakia
|
|
2
2
|
require 'logger'
|
3
3
|
def initialize(level = :info, file = '/var/log/jerakia.log')
|
4
4
|
begin
|
5
|
-
@@logger
|
5
|
+
@@logger = Logger.new(file)
|
6
6
|
rescue Errno::EACCES => e
|
7
7
|
raise Jerakia::Error, "Error opening log file, #{e.message}"
|
8
8
|
end
|
9
9
|
|
10
|
-
@@level
|
10
|
+
@@level = level
|
11
11
|
case @@level
|
12
12
|
when :verbose
|
13
13
|
@@logger.level = Logger::INFO
|
@@ -42,20 +42,4 @@ class Jerakia::Log < Jerakia
|
|
42
42
|
@@logger.fatal msg
|
43
43
|
end
|
44
44
|
|
45
|
-
# def self.fatal(msg)
|
46
|
-
# self.new.fatal msg
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# def self.error(msg)
|
50
|
-
# self.new.error msg
|
51
|
-
# end
|
52
|
-
#
|
53
|
-
# def self.debug(msg)
|
54
|
-
# self.new.debug msg
|
55
|
-
# end
|
56
|
-
#
|
57
|
-
## def self.info(msg)
|
58
|
-
# puts @@logger
|
59
|
-
# self.new.info msg
|
60
|
-
# end
|
61
45
|
end
|
data/lib/jerakia/lookup.rb
CHANGED
@@ -14,7 +14,6 @@ class Jerakia::Lookup
|
|
14
14
|
attr_reader :output_filters
|
15
15
|
attr_reader :name
|
16
16
|
attr_reader :pluginfactory
|
17
|
-
attr_reader :datasource
|
18
17
|
|
19
18
|
def initialize(name, opts, req, scope)
|
20
19
|
@name = name
|
@@ -58,18 +57,6 @@ class Jerakia::Lookup
|
|
58
57
|
pluginfactory
|
59
58
|
end
|
60
59
|
|
61
|
-
def get_datasource
|
62
|
-
@datasource
|
63
|
-
end
|
64
|
-
|
65
|
-
def datasource(source, opts = {})
|
66
|
-
@datasource = Jerakia::Datasource.new(source, self, opts)
|
67
|
-
end
|
68
|
-
|
69
|
-
# If set, Jerakia will pass each Jerakia::Response object
|
70
|
-
# to an output filter plugin
|
71
|
-
#
|
72
|
-
|
73
60
|
def scope
|
74
61
|
scope_object.value
|
75
62
|
end
|
@@ -131,15 +118,4 @@ class Jerakia::Lookup
|
|
131
118
|
end
|
132
119
|
end
|
133
120
|
|
134
|
-
def run
|
135
|
-
Jerakia.log.verbose("lookup: #{@name} key: #{@request.key} namespace: #{@request.namespace.join('/')}")
|
136
|
-
@datasource.run
|
137
|
-
response = @datasource.response
|
138
|
-
@output_filters.each do |filter|
|
139
|
-
response.filter! filter[:name], filter[:opts]
|
140
|
-
end
|
141
|
-
response
|
142
|
-
end
|
143
|
-
|
144
|
-
private
|
145
121
|
end
|
data/lib/jerakia/policy.rb
CHANGED
@@ -1,85 +1,58 @@
|
|
1
1
|
require 'jerakia/launcher'
|
2
2
|
require 'jerakia/answer'
|
3
3
|
require 'jerakia/schema'
|
4
|
+
require 'jerakia/datasource'
|
4
5
|
|
5
6
|
class Jerakia
|
6
7
|
class Policy
|
7
8
|
attr_accessor :lookups
|
8
|
-
attr_reader :
|
9
|
-
attr_reader :
|
10
|
-
attr_reader :lookup_proceed
|
11
|
-
attr_reader :schema
|
12
|
-
attr_reader :request
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :datasources
|
13
11
|
|
14
12
|
# _opts currently does not get used, but is included here as a placeholder
|
15
13
|
# for allowing policies to be declared with options;
|
16
14
|
# policy :foo, :option => :value do
|
17
15
|
#
|
18
|
-
def initialize(
|
19
|
-
|
20
|
-
schema_config = Jerakia.config[:schema] || {}
|
21
|
-
@schema = Jerakia::Schema.new(req, schema_config)
|
22
|
-
end
|
23
|
-
|
16
|
+
def initialize(name, _opts)
|
17
|
+
@name = name
|
24
18
|
@lookups = []
|
25
|
-
@
|
26
|
-
@answer = Jerakia::Answer.new(req.lookup_type)
|
27
|
-
@scope = Jerakia::Scope.new(req)
|
28
|
-
@lookup_proceed = true
|
19
|
+
@datasources = {}
|
29
20
|
end
|
30
21
|
|
31
|
-
def
|
32
|
-
Marshal.load(Marshal.dump(request))
|
33
|
-
end
|
22
|
+
def run(request)
|
34
23
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
24
|
+
if request.use_schema && Jerakia.config[:enable_schema]
|
25
|
+
schema_config = Jerakia.config[:schema] || {}
|
26
|
+
@schema = Jerakia::Schema.new(request, schema_config)
|
27
|
+
end
|
40
28
|
|
41
|
-
|
42
|
-
|
29
|
+
scope = Jerakia::Scope.new(request)
|
30
|
+
answer = Jerakia::Answer.new(request.lookup_type, request.merge)
|
43
31
|
|
44
|
-
|
45
|
-
|
46
|
-
|
32
|
+
response_entries = []
|
33
|
+
lookups.each do |lookup|
|
34
|
+
lookup_instance = lookup.call clone_request(request), scope
|
35
|
+
next unless lookup_instance.valid? && lookup_instance.proceed?
|
36
|
+
register_datasource lookup_instance.datasource[:name]
|
37
|
+
responses = Jerakia::Datasource.run(lookup_instance)
|
38
|
+
lookup_instance.output_filters.each do |filter|
|
39
|
+
Jerakia.log.debug("Using output filter #{filter[:name]}")
|
40
|
+
responses.filter! filter[:name], filter[:opts]
|
41
|
+
end
|
42
|
+
lookup_answers = responses.entries.map { |r| r}
|
47
43
|
response_entries << lookup_answers if lookup_answers
|
48
44
|
end
|
49
|
-
|
50
|
-
|
51
|
-
consolidate_answer
|
45
|
+
answer.process_response(response_entries)
|
46
|
+
return answer
|
52
47
|
end
|
53
48
|
|
54
|
-
|
55
|
-
|
56
|
-
# Process the response depending on the requests lookup_type
|
57
|
-
# if it is a :first lookup then we only want to set the result
|
58
|
-
# once, if it's cascading, we should ammend the payload array
|
59
|
-
#
|
60
|
-
def process_response(res)
|
61
|
-
case request.lookup_type
|
62
|
-
when :first
|
63
|
-
@answer.payload ||= res[:value]
|
64
|
-
@answer.datatype ||= res[:datatype]
|
65
|
-
when :cascade
|
66
|
-
@answer.payload << res[:value]
|
67
|
-
end
|
49
|
+
def register_datasource(datasource)
|
50
|
+
Jerakia::Datasource.load_datasource(datasource)
|
68
51
|
end
|
69
52
|
|
70
|
-
|
71
|
-
|
72
|
-
# requested.
|
73
|
-
#
|
74
|
-
def consolidate_answer
|
75
|
-
if request.lookup_type == :cascade && @answer.payload.is_a?(Array)
|
76
|
-
case request.merge
|
77
|
-
when :array
|
78
|
-
@answer.flatten_payload!
|
79
|
-
when :hash, :deep_hash
|
80
|
-
@answer.merge_payload!(request.merge)
|
81
|
-
end
|
82
|
-
end
|
53
|
+
def clone_request(request)
|
54
|
+
Marshal.load(Marshal.dump(request))
|
83
55
|
end
|
56
|
+
|
84
57
|
end
|
85
58
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
class Jerakia::Response
|
2
2
|
module Filter
|
3
|
-
def filter!(name, opts)
|
3
|
+
def filter!(name, opts = {})
|
4
4
|
Jerakia::Util.autoload('response/filter', name)
|
5
|
+
Jerakia.log.debug("Invoking output filter #{name}")
|
5
6
|
instance_eval "extend Jerakia::Response::Filter::#{name.to_s.capitalize}"
|
6
7
|
instance_eval "self.filter_#{name} (#{opts})"
|
7
8
|
end
|
@@ -1,51 +1,34 @@
|
|
1
|
-
|
2
|
-
# The MIT License (MIT)
|
3
|
-
#
|
4
|
-
# Copyright (c) 2013 Tom Poulton
|
5
|
-
#
|
6
|
-
# Other code Copyright (c) 2014 Craig Dunn, Apache 2.0 License.
|
7
|
-
#
|
8
|
-
|
9
|
-
require 'hiera/backend/eyaml/encryptor'
|
10
|
-
require 'hiera/backend/eyaml/utils'
|
11
|
-
require 'hiera/backend/eyaml/options'
|
12
|
-
require 'hiera/backend/eyaml/parser/parser'
|
13
|
-
require 'hiera/filecache'
|
14
|
-
|
15
|
-
require 'yaml'
|
1
|
+
require 'jerakia/encryption'
|
16
2
|
|
17
3
|
class Jerakia::Response
|
18
4
|
module Filter
|
19
5
|
module Encryption
|
20
6
|
def filter_encryption(_opts = {})
|
21
|
-
|
22
|
-
|
23
|
-
|
7
|
+
Jerakia.log.debug("Encryption filter started")
|
8
|
+
provider = Jerakia::Encryption.handler
|
9
|
+
|
10
|
+
unless provider.loaded?
|
11
|
+
raise Jerakia::Error, 'Cannot load encryption output filter, no encryption provider configured'
|
12
|
+
end
|
13
|
+
unless provider.respond_to?('signiture')
|
14
|
+
raise Jerakia::Error, 'Encryption provider did not provide a signiture method, cannot run output filter'
|
24
15
|
end
|
25
|
-
end
|
26
16
|
|
27
|
-
|
28
|
-
|
29
|
-
public_key = config['eyaml']['public_key']
|
30
|
-
private_key = config['eyaml']['private_key']
|
31
|
-
Hiera::Backend::Eyaml::Options[:pkcs7_private_key] = private_key
|
32
|
-
Hiera::Backend::Eyaml::Options[:pkcs7_public_key] = public_key
|
33
|
-
parser = Hiera::Backend::Eyaml::Parser::ParserFactory.hiera_backend_parser
|
17
|
+
signiture = provider.signiture
|
18
|
+
raise Jerakia::Error, "Encryption provider signiture is not a Regexp" unless signiture.is_a?(Regexp)
|
34
19
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
20
|
+
# Match the signiture of the provider (from the signiture method) against the string
|
21
|
+
# if the string matches the regex then call the decrypt method of the encryption
|
22
|
+
# provider
|
23
|
+
#
|
24
|
+
parse_values do |val|
|
25
|
+
if val =~ signiture
|
26
|
+
decrypted = provider.decrypt(val)
|
27
|
+
val.clear.insert(0, decrypted)
|
28
|
+
end
|
29
|
+
val
|
43
30
|
end
|
44
31
|
end
|
45
|
-
|
46
|
-
def encrypted?(data)
|
47
|
-
/.*ENC\[.*?\]/ =~ data ? true : false
|
48
|
-
end
|
49
32
|
end
|
50
33
|
end
|
51
34
|
end
|
data/lib/jerakia/schema.rb
CHANGED
@@ -11,21 +11,21 @@ class Jerakia::Schema
|
|
11
11
|
)
|
12
12
|
|
13
13
|
Jerakia.log.debug("Schema lookup invoked for #{request.key} namespace: #{request.namespace}")
|
14
|
-
schema_lookup = Jerakia::Launcher.new(schema_request)
|
15
14
|
|
16
15
|
begin
|
17
|
-
|
16
|
+
schema_policy = Jerakia::Launcher.evaluate do
|
18
17
|
policy :schema do
|
19
18
|
lookup :schema do
|
20
19
|
datasource *schema_datasource
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
23
|
+
schema_lookup = schema_policy.run(schema_request)
|
24
24
|
rescue Jerakia::Error => e
|
25
25
|
raise Jerakia::SchemaError, "Schema lookup for #{request.key} failed: #{e.message}"
|
26
26
|
end
|
27
27
|
|
28
|
-
@schema_data = schema_lookup.
|
28
|
+
@schema_data = schema_lookup.payload || {}
|
29
29
|
|
30
30
|
# Validate the returned data from the schema
|
31
31
|
raise Jerakia::SchemaError, "Schema must return a hash for key #{request.key}" unless @schema_data.is_a?(Hash)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require 'openssl'
|
4
|
+
|
5
|
+
class Jerakia
|
6
|
+
module Util
|
7
|
+
class Http
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def post(uri_str, data={}, headers={}, options={})
|
12
|
+
uri = URI.parse(uri_str)
|
13
|
+
request = Net::HTTP::Post.new(uri.path)
|
14
|
+
request.body = data.to_json
|
15
|
+
http_send(uri, request, headers, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
def put(uri_str, data={}, headers={}, options={})
|
19
|
+
uri = URI.parse(uri_str)
|
20
|
+
request = Net::HTTP::Put.new(uri.path)
|
21
|
+
request.body = data.to_json
|
22
|
+
http_send(uri, request, headers, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def http_send(uri, request, headers={}, options={})
|
27
|
+
request.add_field('Content-Type', options[:content_type]) if options[:content_type]
|
28
|
+
|
29
|
+
headers.each do |header, value|
|
30
|
+
request.add_field(header, value)
|
31
|
+
end
|
32
|
+
|
33
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
34
|
+
if options[:ssl]
|
35
|
+
http.use_ssl = true
|
36
|
+
http.verify_mode = options[:ssl_verify] ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
37
|
+
http.cert = OpenSSL::X509::Certificate.new(options[:ssl_cert]) if options[:ssl_cert]
|
38
|
+
http.key = OpenSSL::PKey::RSA.new(options[:ssl_key]) if options[:ssl_key]
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
response = http.request(request)
|
43
|
+
return response
|
44
|
+
rescue => e
|
45
|
+
raise Jerakia::HTTPError, e.message
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/jerakia/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jerakia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Dunn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -116,7 +116,6 @@ extensions: []
|
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
118
|
- bin/jerakia
|
119
|
-
- lib/hiera/backend/jerakia_backend.rb
|
120
119
|
- lib/jerakia.rb
|
121
120
|
- lib/jerakia/answer.rb
|
122
121
|
- lib/jerakia/cache.rb
|
@@ -124,6 +123,7 @@ files:
|
|
124
123
|
- lib/jerakia/cache/file.rb
|
125
124
|
- lib/jerakia/cli.rb
|
126
125
|
- lib/jerakia/cli/lookup.rb
|
126
|
+
- lib/jerakia/cli/secret.rb
|
127
127
|
- lib/jerakia/cli/server.rb
|
128
128
|
- lib/jerakia/cli/token.rb
|
129
129
|
- lib/jerakia/config.rb
|
@@ -132,10 +132,11 @@ files:
|
|
132
132
|
- lib/jerakia/datasource/file.rb
|
133
133
|
- lib/jerakia/datasource/file/json.rb
|
134
134
|
- lib/jerakia/datasource/file/yaml.rb
|
135
|
-
- lib/jerakia/datasource/file_new.rb
|
136
135
|
- lib/jerakia/datasource/http.rb
|
137
136
|
- lib/jerakia/dsl/lookup.rb
|
138
137
|
- lib/jerakia/dsl/policy.rb
|
138
|
+
- lib/jerakia/encryption.rb
|
139
|
+
- lib/jerakia/encryption/vault.rb
|
139
140
|
- lib/jerakia/error.rb
|
140
141
|
- lib/jerakia/launcher.rb
|
141
142
|
- lib/jerakia/log.rb
|
@@ -145,7 +146,6 @@ files:
|
|
145
146
|
- lib/jerakia/lookup/plugin_config.rb
|
146
147
|
- lib/jerakia/lookup/pluginfactory.rb
|
147
148
|
- lib/jerakia/policy.rb
|
148
|
-
- lib/jerakia/policy/registry.rb
|
149
149
|
- lib/jerakia/request.rb
|
150
150
|
- lib/jerakia/response.rb
|
151
151
|
- lib/jerakia/response/filter.rb
|
@@ -162,9 +162,8 @@ files:
|
|
162
162
|
- lib/jerakia/server/auth/token.rb
|
163
163
|
- lib/jerakia/server/rest.rb
|
164
164
|
- lib/jerakia/util.rb
|
165
|
+
- lib/jerakia/util/http.rb
|
165
166
|
- lib/jerakia/version.rb
|
166
|
-
- lib/puppet/indirector/data_binding/jerakia.rb
|
167
|
-
- lib/puppet/indirector/data_binding/jerakia_rest.rb
|
168
167
|
homepage: http://jerakia.io
|
169
168
|
licenses:
|
170
169
|
- Apache 2.0
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'puppet'
|
2
|
-
require 'puppet/resource'
|
3
|
-
|
4
|
-
class Hiera
|
5
|
-
module Backend
|
6
|
-
class Jerakia_backend
|
7
|
-
def initialize(config = nil)
|
8
|
-
require 'jerakia'
|
9
|
-
@config = config || Hiera::Config[:jerakia] || {}
|
10
|
-
@policy = @config[:policy] || 'default'
|
11
|
-
@jerakia = ::Jerakia.new(@config)
|
12
|
-
Jerakia.log.debug("[hiera] hiera backend loaded with policy #{@policy}")
|
13
|
-
end
|
14
|
-
|
15
|
-
def lookup(key, scope, _order_override, resolution_type)
|
16
|
-
lookup_type = :first
|
17
|
-
merge_type = :none
|
18
|
-
|
19
|
-
case resolution_type
|
20
|
-
when :array
|
21
|
-
lookup_type = :cascade
|
22
|
-
merge_type = :array
|
23
|
-
when :hash
|
24
|
-
lookup_type = :cascade
|
25
|
-
merge_type = :hash
|
26
|
-
end
|
27
|
-
|
28
|
-
namespace = []
|
29
|
-
|
30
|
-
if key.include?('::')
|
31
|
-
lookup_key = key.split('::')
|
32
|
-
key = lookup_key.pop
|
33
|
-
namespace = lookup_key
|
34
|
-
end
|
35
|
-
|
36
|
-
Jerakia.log.debug("[hiera] backend invoked for key #{key} using namespace #{namespace}")
|
37
|
-
|
38
|
-
metadata = {}
|
39
|
-
metadata = if scope.is_a?(Hash)
|
40
|
-
scope.reject { |_k, v| v.is_a?(Puppet::Resource) }
|
41
|
-
else
|
42
|
-
scope.real.to_hash.reject { |_k, v| v.is_a?(Puppet::Resource) }
|
43
|
-
end
|
44
|
-
|
45
|
-
request = Jerakia::Request.new(
|
46
|
-
:key => key,
|
47
|
-
:namespace => namespace,
|
48
|
-
:policy => metadata['jerakia_policy'] || @policy,
|
49
|
-
:lookup_type => lookup_type,
|
50
|
-
:merge => merge_type,
|
51
|
-
:metadata => metadata
|
52
|
-
)
|
53
|
-
|
54
|
-
answer = @jerakia.lookup(request)
|
55
|
-
answer.payload
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|