jerakia 1.0.1 → 1.1.0
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 +13 -5
- data/lib/jerakia/cli.rb +34 -22
- data/lib/jerakia/config.rb +5 -1
- data/lib/jerakia/datasource/file/json.rb +5 -1
- data/lib/jerakia/datasource/file/yaml.rb +5 -1
- data/lib/jerakia/datasource/file.rb +6 -1
- data/lib/jerakia/datasource.rb +9 -5
- data/lib/jerakia/dsl/lookup.rb +67 -0
- data/lib/jerakia/dsl/policy.rb +59 -0
- data/lib/jerakia/error.rb +21 -0
- data/lib/jerakia/launcher.rb +15 -13
- data/lib/jerakia/log.rb +6 -1
- data/lib/jerakia/lookup/pluginfactory.rb +7 -1
- data/lib/jerakia/lookup.rb +29 -13
- data/lib/jerakia/policy.rb +29 -38
- data/lib/jerakia/schema.rb +35 -6
- data/lib/jerakia/scope/yaml.rb +1 -1
- data/lib/jerakia/version.rb +1 -1
- data/lib/jerakia.rb +21 -7
- metadata +10 -9
- data/lib/jerakia/datamodel.rb +0 -9
- data/lib/jerakia/test.pp +0 -302
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MzQ2YTJkNGRkY2ViNGVmMjFlNWFlYjlkYmE4OTY2NzY2YTE1NjQ0YQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YWJmMWVmZjUzYzk2OTFjZDZmM2MzYmEzZTY1NGU5NWZmMjU3Yjc2OA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NWQ0ZjNkMmRhNTQ2NGM2MDdiNzE2ZjY2NDA2MTAxNmE2MmI1ZTY0MGFiZjMz
|
10
|
+
M2FjZTg3Mzk2OTcwY2FmMWVhNWJmMDIzYTk3MjgyMzRlMmQ4MGQ4MTU5MmMx
|
11
|
+
MzJhNDMwN2NlZTUxYzMyMmViOTMyMDA0M2UwYWFmYWQzZjdkM2U=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODVlMWY3NjMyYmUwMDI2NjkwNTRmMzYxYjIyYzRkYzQ4NjE1NDgyNWNhMDBi
|
14
|
+
YTRkMjM3MjkxNmNhOTk0MzE4NTZlNDhhN2QwOGY2YzUwZTY5NmUzMDRhZTQz
|
15
|
+
NDk5MmVmMDQ3ZDM1MDgwMTA2ZGExYjE0NzU1MDRiM2MxNDIzYTc=
|
data/lib/jerakia/cli.rb
CHANGED
@@ -50,6 +50,9 @@ class Jerakia
|
|
50
50
|
aliases: :D,
|
51
51
|
type: :boolean,
|
52
52
|
desc: 'Debug information to console, implies --log-level debug'
|
53
|
+
option :trace,
|
54
|
+
type: :boolean,
|
55
|
+
desc: 'Output stacktrace to stdout'
|
53
56
|
option :metadata,
|
54
57
|
aliases: :d,
|
55
58
|
type: :hash,
|
@@ -80,29 +83,38 @@ class Jerakia
|
|
80
83
|
loglevel = options[:log_level]
|
81
84
|
end
|
82
85
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
86
|
+
begin
|
87
|
+
|
88
|
+
jac = Jerakia.new({
|
89
|
+
:config => options[:config],
|
90
|
+
:logfile => logfile,
|
91
|
+
:loglevel => loglevel,
|
92
|
+
:trace => options[:trace],
|
93
|
+
})
|
94
|
+
req = Jerakia::Request.new(
|
95
|
+
:key => key,
|
96
|
+
:namespace => options[:namespace].split(/::/),
|
97
|
+
:policy => options[:policy].to_sym,
|
98
|
+
:lookup_type => options[:type].to_sym,
|
99
|
+
:merge => options[:merge_type].to_sym,
|
100
|
+
:metadata => options[:metadata] || {},
|
101
|
+
:scope => options[:scope].to_sym,
|
102
|
+
:scope_options => options[:scope_options],
|
103
|
+
:use_schema => options[:schema],
|
104
|
+
)
|
105
|
+
|
99
106
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
107
|
+
answer = jac.lookup(req)
|
108
|
+
case options[:output]
|
109
|
+
when 'json'
|
110
|
+
puts answer.payload.to_json
|
111
|
+
when 'yaml'
|
112
|
+
puts answer.payload.to_yaml
|
113
|
+
end
|
114
|
+
rescue Jerakia::Error => e
|
115
|
+
STDERR.puts "Error(#{e.class}): #{e.message}"
|
116
|
+
STDERR.puts e.backtrace.join("\n") if options[:trace]
|
117
|
+
exit 1
|
106
118
|
end
|
107
119
|
end
|
108
120
|
|
data/lib/jerakia/config.rb
CHANGED
@@ -5,7 +5,11 @@ class Jerakia::Config
|
|
5
5
|
attr_reader :server_url
|
6
6
|
|
7
7
|
def self.load_from_file(file = '/etc/jerakia/jerakia.yaml')
|
8
|
-
|
8
|
+
begin
|
9
|
+
new YAML.load_file(file)
|
10
|
+
rescue Psych::SyntaxError => e
|
11
|
+
raise Jerakia::FileParseError, "Could not parse config file #{file}, #{e.message}"
|
12
|
+
end
|
9
13
|
end
|
10
14
|
|
11
15
|
def initialize(config = {})
|
@@ -8,7 +8,11 @@ class Jerakia::Datasource
|
|
8
8
|
require 'json'
|
9
9
|
def convert(data)
|
10
10
|
return {} if data.empty?
|
11
|
-
|
11
|
+
begin
|
12
|
+
JSON.load(data)
|
13
|
+
rescue JSON::ParserError => e
|
14
|
+
raise Jerakia::FileParseError, "Could not parse JSON content, #{e.message}"
|
15
|
+
end
|
12
16
|
end
|
13
17
|
end
|
14
18
|
end
|
@@ -8,7 +8,11 @@ class Jerakia::Datasource
|
|
8
8
|
require 'yaml'
|
9
9
|
def convert(data)
|
10
10
|
return {} if data.empty?
|
11
|
-
|
11
|
+
begin
|
12
|
+
YAML.load(data)
|
13
|
+
rescue Psych::SyntaxError => e
|
14
|
+
raise Jerakia::FileParseError, "Error parsing YAML document: #{e.message}"
|
15
|
+
end
|
12
16
|
end
|
13
17
|
end
|
14
18
|
end
|
@@ -67,7 +67,12 @@ class Jerakia::Datasource
|
|
67
67
|
raw_data << get_file_with_cache(f)
|
68
68
|
end
|
69
69
|
|
70
|
-
|
70
|
+
begin
|
71
|
+
file_format.convert(raw_data)
|
72
|
+
rescue Jerakia::FileParseError => e
|
73
|
+
raise Jerakia::FileParseError, "While parsing #{diskname}: #{e.message}"
|
74
|
+
end
|
75
|
+
|
71
76
|
end
|
72
77
|
|
73
78
|
|
data/lib/jerakia/datasource.rb
CHANGED
@@ -11,9 +11,12 @@ class Jerakia::Datasource
|
|
11
11
|
@options = opts
|
12
12
|
@lookup = lookup
|
13
13
|
@name = name
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
begin
|
15
|
+
require "jerakia/datasource/#{name.to_s}"
|
16
|
+
eval "extend Jerakia::Datasource::#{name.to_s.capitalize}"
|
17
|
+
rescue LoadError => e
|
18
|
+
raise Jerakia::Error, "Cannot load datasource #{name.to_s} in lookup #{lookup.name}, #{e.message}"
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
|
@@ -26,11 +29,12 @@ class Jerakia::Datasource
|
|
26
29
|
@options[opt] ||= data[:default] || nil
|
27
30
|
Jerakia.log.debug("[#{whoami}]: options[#{opt}] to #{options[opt]} [#{options[opt].class}]")
|
28
31
|
if @options[opt].nil?
|
29
|
-
Jerakia
|
32
|
+
raise Jerakia::PolicyError, "#{opt} option must be supplied for datasource #{@name} in lookup #{lookup.name}" if data[:mandatory]
|
30
33
|
else
|
31
34
|
if data[:type]
|
32
35
|
if Array(data[:type]).select { |t| @options[opt].is_a?(t) }.empty?
|
33
|
-
Jerakia
|
36
|
+
raise Jerakia::PolicyError,
|
37
|
+
"#{opt} is a #{@options[opt].class} but must be a #{data[:type].to_s} for datasource #{@name} in lookup #{lookup.name}"
|
34
38
|
end
|
35
39
|
end
|
36
40
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class Jerakia
|
2
|
+
module Dsl
|
3
|
+
class Lookup
|
4
|
+
|
5
|
+
attr_reader :policy
|
6
|
+
attr_reader :request
|
7
|
+
attr_accessor :lookup
|
8
|
+
|
9
|
+
def initialize(name, policy, opts={})
|
10
|
+
@policy = policy
|
11
|
+
@request = policy.clone_request
|
12
|
+
scope = policy.scope
|
13
|
+
@lookup = Jerakia::Lookup.new(name, opts, @request, scope)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.evaluate(name, policy, opts, &block)
|
17
|
+
lookup_block = new(name, policy, opts)
|
18
|
+
lookup_block.instance_eval &block
|
19
|
+
policy.submit_lookup(lookup_block.lookup)
|
20
|
+
end
|
21
|
+
|
22
|
+
# define the data source for the lookup
|
23
|
+
# @api: public
|
24
|
+
def datasource(name, opts={})
|
25
|
+
datasource = Jerakia::Datasource.new(name, lookup, opts)
|
26
|
+
lookup.datasource=(datasource)
|
27
|
+
end
|
28
|
+
|
29
|
+
# give access to the lookup scope object
|
30
|
+
# @api: public
|
31
|
+
def scope
|
32
|
+
lookup.scope
|
33
|
+
end
|
34
|
+
|
35
|
+
# pass through exposed functions from the main lookup object
|
36
|
+
# @api: public
|
37
|
+
def confine(*args)
|
38
|
+
lookup.confine(*args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def exclude(*args)
|
42
|
+
lookup.exclude(*args)
|
43
|
+
end
|
44
|
+
|
45
|
+
def invalidate
|
46
|
+
lookup.invalidate
|
47
|
+
end
|
48
|
+
|
49
|
+
def stop
|
50
|
+
lookup.stop
|
51
|
+
end
|
52
|
+
|
53
|
+
def continue
|
54
|
+
lookup.continue
|
55
|
+
end
|
56
|
+
|
57
|
+
def output_filter(*args)
|
58
|
+
lookup.output_filter(*args)
|
59
|
+
end
|
60
|
+
|
61
|
+
def plugin
|
62
|
+
lookup.plugin
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class Jerakia
|
2
|
+
module Dsl
|
3
|
+
class Policy
|
4
|
+
|
5
|
+
def self.evaluate_file(filename, request)
|
6
|
+
policy = new(request)
|
7
|
+
policy.evaluate_file(filename)
|
8
|
+
policy.instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.evaluate(request, &block)
|
12
|
+
policy = new(request)
|
13
|
+
policy.instance_eval &block
|
14
|
+
policy.instance
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :request
|
18
|
+
attr_reader :instance
|
19
|
+
|
20
|
+
def initialize(req)
|
21
|
+
@request=req
|
22
|
+
end
|
23
|
+
|
24
|
+
def evaluate_file(filename)
|
25
|
+
begin
|
26
|
+
policydata=Jerakia.filecache(filename)
|
27
|
+
rescue Jerakia::Error => e
|
28
|
+
raise Jerakia::PolicyError, "Could not load policy file, #{e.message}"
|
29
|
+
end
|
30
|
+
instance_eval policydata
|
31
|
+
end
|
32
|
+
|
33
|
+
def policy(name, opts={}, &block)
|
34
|
+
@instance = Jerakia::Policy.new(name, opts, request)
|
35
|
+
Jerakia::Dsl::Policyblock.evaluate(instance,&block)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class Policyblock
|
41
|
+
|
42
|
+
attr_accessor :policy
|
43
|
+
|
44
|
+
def initialize(policy)
|
45
|
+
@policy = policy
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.evaluate(policy, &block)
|
49
|
+
policyblock = new(policy)
|
50
|
+
policyblock.instance_eval &block
|
51
|
+
end
|
52
|
+
|
53
|
+
def lookup(name, opts={}, &block)
|
54
|
+
Jerakia::Dsl::Lookup.evaluate(name, policy, opts, &block)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Jerakia
|
2
|
+
class Error < RuntimeError
|
3
|
+
|
4
|
+
def initialize(msg)
|
5
|
+
super(msg)
|
6
|
+
end
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
class PolicyError < Jerakia::Error
|
13
|
+
end
|
14
|
+
|
15
|
+
class SchemaError < Jerakia::Error
|
16
|
+
end
|
17
|
+
|
18
|
+
class FileParseError < Jerakia::Error
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
data/lib/jerakia/launcher.rb
CHANGED
@@ -1,32 +1,34 @@
|
|
1
1
|
# Here we take a request object and read in the policy file
|
2
2
|
# which is evalulated in this instance
|
3
3
|
#
|
4
|
+
require 'jerakia/dsl/policy'
|
5
|
+
require 'jerakia/dsl/lookup'
|
6
|
+
|
4
7
|
class Jerakia::Launcher
|
5
8
|
|
6
9
|
attr_reader :request
|
7
10
|
attr_reader :answer
|
8
|
-
|
11
|
+
|
12
|
+
def initialize(req)
|
9
13
|
@request = req
|
10
|
-
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def evaluate(&block)
|
18
|
+
policy = Jerakia::Dsl::Policy.evaluate(request, &block)
|
19
|
+
policy.fire!
|
20
|
+
@answer = policy.answer
|
11
21
|
end
|
12
22
|
|
13
23
|
def invoke_from_file
|
14
24
|
policy_name=request.policy.to_s
|
15
|
-
Jerakia.log.debug "Invoked lookup for #{
|
25
|
+
Jerakia.log.debug "Invoked lookup for #{request.key} using policy #{policy_name}"
|
16
26
|
filename=File.join(Jerakia.config.policydir, "#{policy_name}.rb")
|
17
|
-
|
18
|
-
policydata=Jerakia.filecache(filename)
|
19
|
-
rescue Exception => e
|
20
|
-
Jerakia.crit("Problem loading policy from #{filename}")
|
21
|
-
end
|
22
|
-
instance_eval policydata
|
23
|
-
end
|
24
|
-
|
25
|
-
def policy(name, opts={}, req=@request, &block)
|
26
|
-
policy = Jerakia::Policy.new(name, opts, req, &block)
|
27
|
+
policy = Jerakia::Dsl::Policy.evaluate_file(filename, request)
|
27
28
|
policy.fire!
|
28
29
|
@answer = policy.answer
|
29
30
|
end
|
31
|
+
|
30
32
|
end
|
31
33
|
|
32
34
|
|
data/lib/jerakia/log.rb
CHANGED
@@ -2,7 +2,12 @@ class Jerakia::Log < Jerakia
|
|
2
2
|
|
3
3
|
require 'logger'
|
4
4
|
def initialize(level=:info,file='/var/log/jerakia.log')
|
5
|
-
|
5
|
+
begin
|
6
|
+
@@logger ||= Logger.new(file)
|
7
|
+
rescue Errno::EACCES => e
|
8
|
+
raise Jerakia::Error, "Error opening log file, #{e.message}"
|
9
|
+
end
|
10
|
+
|
6
11
|
@@level ||= level
|
7
12
|
case @@level
|
8
13
|
when :verbose
|
@@ -11,7 +11,13 @@ class Jerakia::Lookup::PluginFactory
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def register(name,plugin)
|
14
|
-
|
14
|
+
begin
|
15
|
+
require "jerakia/lookup/plugin/#{name}"
|
16
|
+
rescue LoadError => e
|
17
|
+
raise Jerakia::Error, "Cannot load plugin #{name}, #{e.message}"
|
18
|
+
end
|
19
|
+
|
20
|
+
|
15
21
|
plugin.activate(name)
|
16
22
|
create_plugin_method(name) do
|
17
23
|
plugin
|
data/lib/jerakia/lookup.rb
CHANGED
@@ -5,16 +5,17 @@ class Jerakia::Lookup
|
|
5
5
|
require 'jerakia/lookup/pluginfactory'
|
6
6
|
|
7
7
|
attr_accessor :request
|
8
|
-
|
9
|
-
|
8
|
+
attr_accessor :datasource
|
9
|
+
attr_accessor :valid
|
10
|
+
attr_accessor :proceed
|
10
11
|
attr_reader :lookuptype
|
11
12
|
attr_reader :scope_object
|
12
13
|
attr_reader :output_filters
|
13
14
|
attr_reader :name
|
14
|
-
attr_reader :proceed
|
15
15
|
attr_reader :pluginfactory
|
16
|
+
attr_reader :datasource
|
16
17
|
|
17
|
-
def initialize(name,opts,req,scope
|
18
|
+
def initialize(name,opts,req,scope)
|
18
19
|
|
19
20
|
@name=name
|
20
21
|
@request=req
|
@@ -24,23 +25,36 @@ class Jerakia::Lookup
|
|
24
25
|
@proceed=true
|
25
26
|
@pluginfactory = Jerakia::Lookup::PluginFactory.new
|
26
27
|
|
28
|
+
|
29
|
+
# Validate options passed to the lookup
|
30
|
+
#
|
31
|
+
valid_opts = [ :use ]
|
32
|
+
|
33
|
+
opts.keys.each do |opt_key|
|
34
|
+
unless valid_opts.include?(opt_key)
|
35
|
+
raise Jerakia::PolicyError, "Unknown option #{opt_key} for lookup #{name}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
27
40
|
if opts[:use]
|
28
41
|
Array(opts[:use]).flatten.each do |plugin|
|
29
42
|
plugin_load(plugin)
|
30
43
|
end
|
31
44
|
end
|
32
|
-
|
33
|
-
instance_eval &block
|
34
|
-
|
35
45
|
end
|
36
46
|
|
37
47
|
def plugin_load(plugin)
|
38
48
|
Jerakia.log.debug("Loading plugin #{plugin}")
|
39
|
-
|
49
|
+
pluginfactory.register(plugin, Jerakia::Lookup::Plugin.new(self))
|
40
50
|
end
|
41
51
|
|
42
52
|
def plugin
|
43
|
-
|
53
|
+
pluginfactory
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_datasource
|
57
|
+
@datasource
|
44
58
|
end
|
45
59
|
|
46
60
|
def datasource(source, opts={})
|
@@ -52,7 +66,7 @@ class Jerakia::Lookup
|
|
52
66
|
#
|
53
67
|
|
54
68
|
def scope
|
55
|
-
|
69
|
+
scope_object.value
|
56
70
|
end
|
57
71
|
|
58
72
|
|
@@ -61,7 +75,7 @@ class Jerakia::Lookup
|
|
61
75
|
end
|
62
76
|
|
63
77
|
def proceed?
|
64
|
-
|
78
|
+
proceed
|
65
79
|
end
|
66
80
|
|
67
81
|
## lookup function: stop
|
@@ -88,11 +102,11 @@ class Jerakia::Lookup
|
|
88
102
|
# Setting invalidate will mean this lookup will be skipped in the policy
|
89
103
|
#
|
90
104
|
def invalidate
|
91
|
-
@valid=false
|
105
|
+
@valid = false
|
92
106
|
end
|
93
107
|
|
94
108
|
def valid?
|
95
|
-
|
109
|
+
valid
|
96
110
|
end
|
97
111
|
|
98
112
|
|
@@ -126,5 +140,7 @@ class Jerakia::Lookup
|
|
126
140
|
end
|
127
141
|
|
128
142
|
|
143
|
+
private
|
144
|
+
|
129
145
|
end
|
130
146
|
|
data/lib/jerakia/policy.rb
CHANGED
@@ -1,80 +1,71 @@
|
|
1
1
|
require 'jerakia/launcher'
|
2
|
+
require 'jerakia/answer'
|
3
|
+
require 'jerakia/schema'
|
2
4
|
|
3
5
|
class Jerakia::Policy
|
4
|
-
require 'jerakia/answer'
|
5
|
-
require 'jerakia/schema'
|
6
6
|
|
7
7
|
attr_accessor :lookups
|
8
|
-
attr_reader :routes
|
9
8
|
attr_reader :answer
|
10
9
|
attr_reader :scope
|
11
10
|
attr_reader :lookup_proceed
|
12
11
|
attr_reader :schema
|
12
|
+
attr_reader :request
|
13
13
|
|
14
|
-
def initialize(name, opts={}, req
|
14
|
+
def initialize(name, opts={}, req)
|
15
15
|
|
16
16
|
if req.use_schema and Jerakia.config[:enable_schema]
|
17
17
|
schema_config = Jerakia.config[:schema] || {}
|
18
18
|
@schema = Jerakia::Schema.new(req, schema_config)
|
19
19
|
end
|
20
|
+
|
21
|
+
|
20
22
|
@lookups=[]
|
21
|
-
@routes={}
|
22
23
|
@request=req
|
23
24
|
@answer=Jerakia::Answer.new(req.lookup_type)
|
24
25
|
@scope=Jerakia::Scope.new(req)
|
25
26
|
@lookup_proceed = true
|
26
|
-
begin
|
27
|
-
instance_eval &block
|
28
|
-
rescue => e
|
29
|
-
Jerakia.fatal "Error processing policy file", e
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def request
|
35
|
-
@request
|
36
27
|
end
|
37
28
|
|
38
29
|
def clone_request
|
39
|
-
request.clone
|
30
|
+
copy_request = request.clone
|
31
|
+
return copy_request
|
40
32
|
end
|
41
33
|
|
42
|
-
|
43
|
-
|
44
|
-
# We specifically clone the request object to allow plugins to modify the
|
45
|
-
# request payload for the scope of this lookup only.
|
46
|
-
#
|
47
|
-
lookup = Jerakia::Lookup.new(name,opts,clone_request,scope,&block)
|
48
|
-
Jerakia.log.debug("Proceed to next lookup #{lookup.proceed?}")
|
49
|
-
|
34
|
+
def submit_lookup(lookup)
|
35
|
+
raise Jerakia::PolicyError, "Lookup #{lookup.name} has no datasource defined" unless lookup.get_datasource
|
50
36
|
@lookups << lookup if lookup.valid? and @lookup_proceed
|
51
37
|
@lookup_proceed = false if !lookup.proceed? and lookup.valid?
|
52
|
-
|
53
38
|
end
|
54
39
|
|
55
40
|
def fire!
|
41
|
+
response_entries = []
|
42
|
+
|
56
43
|
@lookups.each do |l|
|
57
44
|
responses = l.run
|
58
|
-
responses.entries.
|
59
|
-
|
60
|
-
|
45
|
+
lookup_answers = responses.entries.map { |r| r }
|
46
|
+
response_entries << lookup_answers if lookup_answers
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
response_entries.flatten.each do |res|
|
51
|
+
case request.lookup_type
|
52
|
+
when :first
|
61
53
|
@answer.payload ||= res[:value]
|
62
54
|
@answer.datatype ||= res[:datatype]
|
63
|
-
|
55
|
+
when :cascade
|
64
56
|
@answer.payload << res[:value]
|
65
|
-
end
|
66
57
|
end
|
58
|
+
end
|
67
59
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
60
|
+
if request.lookup_type == :cascade && @answer.payload.is_a?(Array)
|
61
|
+
case request.merge
|
62
|
+
when :array
|
63
|
+
@answer.flatten_payload!
|
64
|
+
when :hash,:deep_hash
|
65
|
+
@answer.merge_payload!(request.merge)
|
75
66
|
end
|
76
|
-
|
77
67
|
end
|
68
|
+
|
78
69
|
end
|
79
70
|
end
|
80
71
|
|
data/lib/jerakia/schema.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
class Jerakia::Schema
|
2
2
|
|
3
|
+
# Arguments: request(Jerakia::Request), opts(Hash)
|
4
|
+
#
|
3
5
|
def initialize(request,opts)
|
4
6
|
schema_datasource=datasource(opts)
|
5
7
|
schema_request=Jerakia::Request.new(
|
@@ -9,15 +11,38 @@ class Jerakia::Schema
|
|
9
11
|
:use_schema => false,
|
10
12
|
)
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
Jerakia.log.debug("Schema lookup invoked for #{request.key} namespace: #{request.namespace}")
|
15
|
+
schema_lookup = Jerakia::Launcher.new(schema_request)
|
16
|
+
|
17
|
+
|
18
|
+
begin
|
19
|
+
schema_lookup.evaluate do
|
20
|
+
policy :schema do
|
21
|
+
lookup :schema do
|
22
|
+
datasource *schema_datasource
|
23
|
+
end
|
16
24
|
end
|
17
25
|
end
|
26
|
+
rescue Jerakia::Error => e
|
27
|
+
raise Jerakia::SchemaError, "Schema lookup for #{request.key} failed: #{e.message}"
|
18
28
|
end
|
19
29
|
|
30
|
+
|
20
31
|
@schema_data = schema_lookup.answer.payload || {}
|
32
|
+
|
33
|
+
# Validate the returned data from the schema
|
34
|
+
raise Jerakia::SchemaError, "Schema must return a hash for key #{request.key}" unless @schema_data.is_a?(Hash)
|
35
|
+
|
36
|
+
valid_opts = [ "alias", "cascade", "merge" ]
|
37
|
+
@schema_data.keys.each do |key|
|
38
|
+
unless valid_opts.include?(key)
|
39
|
+
raise Jerakia::SchemaError, "Unknown schema option #{key} for key #{request.key}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
21
46
|
Jerakia.log.debug("Schema returned #{@schema_data}")
|
22
47
|
|
23
48
|
if salias = @schema_data["alias"]
|
@@ -32,8 +57,12 @@ class Jerakia::Schema
|
|
32
57
|
request.lookup_type= :cascade
|
33
58
|
end
|
34
59
|
|
35
|
-
if
|
36
|
-
|
60
|
+
if @schema_data["merge"]
|
61
|
+
if ["array", "hash", "deep_hash"].include?(@schema_data["merge"])
|
62
|
+
request.merge = @schema_data["merge"].to_sym
|
63
|
+
else
|
64
|
+
raise Jerakia::SchemaError, "Invalid merge type #{@schema_data['merge']} found in schema for key #{request.key}"
|
65
|
+
end
|
37
66
|
end
|
38
67
|
|
39
68
|
end
|
data/lib/jerakia/scope/yaml.rb
CHANGED
@@ -3,7 +3,7 @@ class Jerakia::Scope
|
|
3
3
|
module Yaml
|
4
4
|
def create
|
5
5
|
yaml_file = request.scope_options["file"] || "./jerakia_scope.yaml"
|
6
|
-
Jerakia
|
6
|
+
raise Jerakia::Error, "Scope file #{yaml_file} not found" unless File.exists?(yaml_file)
|
7
7
|
data = YAML.load(File.read(yaml_file))
|
8
8
|
data.each do |key,val|
|
9
9
|
value[key.to_sym] = val
|
data/lib/jerakia/version.rb
CHANGED
data/lib/jerakia.rb
CHANGED
@@ -9,11 +9,15 @@ class Jerakia
|
|
9
9
|
require 'jerakia/launcher'
|
10
10
|
require 'jerakia/cache'
|
11
11
|
require 'jerakia/version'
|
12
|
+
require 'jerakia/error'
|
13
|
+
|
12
14
|
|
13
15
|
def initialize(options={})
|
16
|
+
|
14
17
|
configfile = options[:config] || ENV['JERAKIA_CONFIG'] || '/etc/jerakia/jerakia.yaml'
|
15
18
|
@@config = File.exist?(configfile) ? Jerakia::Config.load_from_file(configfile) : Jerakia::Config.new
|
16
19
|
|
20
|
+
|
17
21
|
if @@config[:plugindir]
|
18
22
|
$LOAD_PATH << @@config[:plugindir] unless $LOAD_PATH.include?(@@config[:plugindir])
|
19
23
|
end
|
@@ -21,12 +25,22 @@ class Jerakia
|
|
21
25
|
@@filecache = {}
|
22
26
|
loglevel = options[:loglevel] || @@config["loglevel"] || "info"
|
23
27
|
logfile = options[:logfile] || @@config["logfile"] || "/var/log/jerakia.log"
|
28
|
+
|
24
29
|
@@log = Jerakia::Log.new(loglevel.to_sym, logfile)
|
25
30
|
@@log.debug("Jerakia initialized")
|
31
|
+
|
32
|
+
Jerakia.log.verbose("Jerakia started. Version #{Jerakia::VERSION}")
|
26
33
|
end
|
27
34
|
|
28
35
|
def lookup(request)
|
29
|
-
|
36
|
+
begin
|
37
|
+
lookup_instance = Jerakia::Launcher.new(request)
|
38
|
+
lookup_instance.invoke_from_file
|
39
|
+
lookup_instance.answer
|
40
|
+
rescue Jerakia::Error => e
|
41
|
+
Jerakia.fatal(e.message, e)
|
42
|
+
end
|
43
|
+
|
30
44
|
end
|
31
45
|
|
32
46
|
def config
|
@@ -37,12 +51,15 @@ class Jerakia
|
|
37
51
|
stacktrace=e.backtrace.join("\n")
|
38
52
|
Jerakia.log.fatal msg
|
39
53
|
Jerakia.log.fatal "Full stacktrace output:\n#{$!}\n\n#{stacktrace}"
|
40
|
-
|
41
|
-
throw Exception
|
54
|
+
raise e
|
42
55
|
end
|
43
56
|
|
44
57
|
def self.filecache(name)
|
45
|
-
|
58
|
+
begin
|
59
|
+
@@filecache[name] ||= File.read(name)
|
60
|
+
rescue Errno::ENOENT => e
|
61
|
+
raise Jerakia::Error, "Could not read file #{name}, #{e.message}"
|
62
|
+
end
|
46
63
|
return @@filecache[name]
|
47
64
|
end
|
48
65
|
|
@@ -62,7 +79,4 @@ class Jerakia
|
|
62
79
|
@@log
|
63
80
|
end
|
64
81
|
|
65
|
-
def self.crit(msg)
|
66
|
-
fail msg
|
67
|
-
end
|
68
82
|
end
|
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: 1.0
|
4
|
+
version: 1.1.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: 2016-08-
|
11
|
+
date: 2016-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
name: lookup_http
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - '>='
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 1.0.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - '>='
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.0.0
|
55
55
|
description: Extendable and flexible data lookup system
|
@@ -68,13 +68,15 @@ files:
|
|
68
68
|
- lib/jerakia/cache/file.rb
|
69
69
|
- lib/jerakia/cli.rb
|
70
70
|
- lib/jerakia/config.rb
|
71
|
-
- lib/jerakia/datamodel.rb
|
72
71
|
- lib/jerakia/datasource.rb
|
73
72
|
- lib/jerakia/datasource/dummy.rb
|
74
73
|
- lib/jerakia/datasource/file.rb
|
75
74
|
- lib/jerakia/datasource/file/json.rb
|
76
75
|
- lib/jerakia/datasource/file/yaml.rb
|
77
76
|
- lib/jerakia/datasource/http.rb
|
77
|
+
- lib/jerakia/dsl/lookup.rb
|
78
|
+
- lib/jerakia/dsl/policy.rb
|
79
|
+
- lib/jerakia/error.rb
|
78
80
|
- lib/jerakia/launcher.rb
|
79
81
|
- lib/jerakia/log.rb
|
80
82
|
- lib/jerakia/lookup.rb
|
@@ -91,7 +93,6 @@ files:
|
|
91
93
|
- lib/jerakia/scope.rb
|
92
94
|
- lib/jerakia/scope/metadata.rb
|
93
95
|
- lib/jerakia/scope/yaml.rb
|
94
|
-
- lib/jerakia/test.pp
|
95
96
|
- lib/jerakia/util.rb
|
96
97
|
- lib/jerakia/version.rb
|
97
98
|
- lib/puppet/indirector/data_binding/jerakia.rb
|
@@ -106,17 +107,17 @@ require_paths:
|
|
106
107
|
- lib
|
107
108
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
109
|
requirements:
|
109
|
-
- - '>='
|
110
|
+
- - ! '>='
|
110
111
|
- !ruby/object:Gem::Version
|
111
112
|
version: '0'
|
112
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
114
|
requirements:
|
114
|
-
- - '>='
|
115
|
+
- - ! '>='
|
115
116
|
- !ruby/object:Gem::Version
|
116
117
|
version: '0'
|
117
118
|
requirements: []
|
118
119
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.2.
|
120
|
+
rubygems_version: 2.2.5
|
120
121
|
signing_key:
|
121
122
|
specification_version: 4
|
122
123
|
summary: Extendable and flexible ata lookup system
|
data/lib/jerakia/datamodel.rb
DELETED
data/lib/jerakia/test.pp
DELETED
@@ -1,302 +0,0 @@
|
|
1
|
-
class apache ( $port='foo' ,
|
2
|
-
$foo1='',
|
3
|
-
$foo2='',
|
4
|
-
$foo3='',
|
5
|
-
$foo4='',
|
6
|
-
$foo5='',
|
7
|
-
$foo6='',
|
8
|
-
$foo7='',
|
9
|
-
$foo8='',
|
10
|
-
$foo9='',
|
11
|
-
$foo10='',
|
12
|
-
$foo11='',
|
13
|
-
$foo12='',
|
14
|
-
$foo13='',
|
15
|
-
$foo14='',
|
16
|
-
$foo15='',
|
17
|
-
$foo16='',
|
18
|
-
$foo17='',
|
19
|
-
$foo18='',
|
20
|
-
$foo19='',
|
21
|
-
$foo20='',
|
22
|
-
$foo21='',
|
23
|
-
$foo22='',
|
24
|
-
$foo23='',
|
25
|
-
$foo24='',
|
26
|
-
$foo26='',
|
27
|
-
$bar1='',
|
28
|
-
$bar2='',
|
29
|
-
$bar3='',
|
30
|
-
$bar4='',
|
31
|
-
$bar5='',
|
32
|
-
$bar6='',
|
33
|
-
$bar7='',
|
34
|
-
$bar8='',
|
35
|
-
$bar9='',
|
36
|
-
$bar10='',
|
37
|
-
$bar11='',
|
38
|
-
$bar12='',
|
39
|
-
$bar13='',
|
40
|
-
$bar14='',
|
41
|
-
$bar15='',
|
42
|
-
$bar16='',
|
43
|
-
$bar17='',
|
44
|
-
$bar18='',
|
45
|
-
$bar19='',
|
46
|
-
$bar20='',
|
47
|
-
$bar21='',
|
48
|
-
$bar22='',
|
49
|
-
$bar23='',
|
50
|
-
$bar24='',
|
51
|
-
$foooo1='',
|
52
|
-
$foooo2='',
|
53
|
-
$foooo3='',
|
54
|
-
$foooo4='',
|
55
|
-
$foooo5='',
|
56
|
-
$foooo6='',
|
57
|
-
$foooo7='',
|
58
|
-
$foooo8='',
|
59
|
-
$foooo9='',
|
60
|
-
$foooo10='',
|
61
|
-
$foooo11='',
|
62
|
-
$foooo12='',
|
63
|
-
$foooo13='',
|
64
|
-
$foooo14='',
|
65
|
-
$foooo15='',
|
66
|
-
$foooo16='',
|
67
|
-
$foooo17='',
|
68
|
-
$foooo18='',
|
69
|
-
$foooo19='',
|
70
|
-
$foooo20='',
|
71
|
-
$foooo21='',
|
72
|
-
$foooo22='',
|
73
|
-
$foooo23='',
|
74
|
-
$foooo24='',
|
75
|
-
$foooo26='',
|
76
|
-
$baaar1='',
|
77
|
-
$baaar2='',
|
78
|
-
$baaar3='',
|
79
|
-
$baaar4='',
|
80
|
-
$baaar5='',
|
81
|
-
$baaar6='',
|
82
|
-
$baaar7='',
|
83
|
-
$baaar8='',
|
84
|
-
$baaar9='',
|
85
|
-
$baaar10='',
|
86
|
-
$baaar11='',
|
87
|
-
$baaar12='',
|
88
|
-
$baaar13='',
|
89
|
-
$baaar14='',
|
90
|
-
$baaar15='',
|
91
|
-
$baaar16='',
|
92
|
-
$baaar17='',
|
93
|
-
$baaar18='',
|
94
|
-
$baaar19='',
|
95
|
-
$baaar20='',
|
96
|
-
$baaar21='',
|
97
|
-
$baaar22='',
|
98
|
-
$baaar23='',
|
99
|
-
$baaar24='',
|
100
|
-
$fooz1='',
|
101
|
-
$fooz2='',
|
102
|
-
$fooz3='',
|
103
|
-
$fooz4='',
|
104
|
-
$fooz5='',
|
105
|
-
$fooz6='',
|
106
|
-
$fooz7='',
|
107
|
-
$fooz8='',
|
108
|
-
$fooz9='',
|
109
|
-
$fooz10='',
|
110
|
-
$fooz11='',
|
111
|
-
$fooz12='',
|
112
|
-
$fooz13='',
|
113
|
-
$fooz14='',
|
114
|
-
$fooz15='',
|
115
|
-
$fooz16='',
|
116
|
-
$fooz17='',
|
117
|
-
$fooz18='',
|
118
|
-
$fooz19='',
|
119
|
-
$fooz20='',
|
120
|
-
$fooz21='',
|
121
|
-
$fooz22='',
|
122
|
-
$fooz23='',
|
123
|
-
$fooz24='',
|
124
|
-
$fooz26='',
|
125
|
-
$barz1='',
|
126
|
-
$barz2='',
|
127
|
-
$barz3='',
|
128
|
-
$barz4='',
|
129
|
-
$barz5='',
|
130
|
-
$barz6='',
|
131
|
-
$barz7='',
|
132
|
-
$barz8='',
|
133
|
-
$barz9='',
|
134
|
-
$barz10='',
|
135
|
-
$barz11='',
|
136
|
-
$barz12='',
|
137
|
-
$barz13='',
|
138
|
-
$barz14='',
|
139
|
-
$barz15='',
|
140
|
-
$barz16='',
|
141
|
-
$barz17='',
|
142
|
-
$barz18='',
|
143
|
-
$barz19='',
|
144
|
-
$barz20='',
|
145
|
-
$barz21='',
|
146
|
-
$barz22='',
|
147
|
-
$barz23='',
|
148
|
-
$barz24='',
|
149
|
-
$foo10='',
|
150
|
-
$foo20='',
|
151
|
-
$foo30='',
|
152
|
-
$foo40='',
|
153
|
-
$foo50='',
|
154
|
-
$foo60='',
|
155
|
-
$foo70='',
|
156
|
-
$foo80='',
|
157
|
-
$foo90='',
|
158
|
-
$foo100='',
|
159
|
-
$foo110='',
|
160
|
-
$foo120='',
|
161
|
-
$foo130='',
|
162
|
-
$foo140='',
|
163
|
-
$foo150='',
|
164
|
-
$foo160='',
|
165
|
-
$foo170='',
|
166
|
-
$foo180='',
|
167
|
-
$foo190='',
|
168
|
-
$foo200='',
|
169
|
-
$foo210='',
|
170
|
-
$foo220='',
|
171
|
-
$foo230='',
|
172
|
-
$foo240='',
|
173
|
-
$foo260='',
|
174
|
-
$bar10='',
|
175
|
-
$bar20='',
|
176
|
-
$bar30='',
|
177
|
-
$bar40='',
|
178
|
-
$bar50='',
|
179
|
-
$bar60='',
|
180
|
-
$bar70='',
|
181
|
-
$bar80='',
|
182
|
-
$bar90='',
|
183
|
-
$bar100='',
|
184
|
-
$bar110='',
|
185
|
-
$bar120='',
|
186
|
-
$bar130='',
|
187
|
-
$bar140='',
|
188
|
-
$bar150='',
|
189
|
-
$bar160='',
|
190
|
-
$bar170='',
|
191
|
-
$bar180='',
|
192
|
-
$bar190='',
|
193
|
-
$bar200='',
|
194
|
-
$bar210='',
|
195
|
-
$bar220='',
|
196
|
-
$bar230='',
|
197
|
-
$bar240='',
|
198
|
-
$foooo10='',
|
199
|
-
$foooo20='',
|
200
|
-
$foooo30='',
|
201
|
-
$foooo40='',
|
202
|
-
$foooo50='',
|
203
|
-
$foooo60='',
|
204
|
-
$foooo70='',
|
205
|
-
$foooo80='',
|
206
|
-
$foooo90='',
|
207
|
-
$foooo100='',
|
208
|
-
$foooo110='',
|
209
|
-
$foooo120='',
|
210
|
-
$foooo130='',
|
211
|
-
$foooo140='',
|
212
|
-
$foooo150='',
|
213
|
-
$foooo160='',
|
214
|
-
$foooo170='',
|
215
|
-
$foooo180='',
|
216
|
-
$foooo190='',
|
217
|
-
$foooo200='',
|
218
|
-
$foooo210='',
|
219
|
-
$foooo220='',
|
220
|
-
$foooo230='',
|
221
|
-
$foooo240='',
|
222
|
-
$foooo260='',
|
223
|
-
$baaar10='',
|
224
|
-
$baaar20='',
|
225
|
-
$baaar30='',
|
226
|
-
$baaar40='',
|
227
|
-
$baaar50='',
|
228
|
-
$baaar60='',
|
229
|
-
$baaar70='',
|
230
|
-
$baaar80='',
|
231
|
-
$baaar90='',
|
232
|
-
$baaar100='',
|
233
|
-
$baaar110='',
|
234
|
-
$baaar120='',
|
235
|
-
$baaar130='',
|
236
|
-
$baaar140='',
|
237
|
-
$baaar150='',
|
238
|
-
$baaar160='',
|
239
|
-
$baaar170='',
|
240
|
-
$baaar180='',
|
241
|
-
$baaar190='',
|
242
|
-
$baaar200='',
|
243
|
-
$baaar210='',
|
244
|
-
$baaar220='',
|
245
|
-
$baaar230='',
|
246
|
-
$baaar240='',
|
247
|
-
$fooz10='',
|
248
|
-
$fooz20='',
|
249
|
-
$fooz30='',
|
250
|
-
$fooz40='',
|
251
|
-
$fooz50='',
|
252
|
-
$fooz60='',
|
253
|
-
$fooz70='',
|
254
|
-
$fooz80='',
|
255
|
-
$fooz90='',
|
256
|
-
$fooz100='',
|
257
|
-
$fooz110='',
|
258
|
-
$fooz120='',
|
259
|
-
$fooz130='',
|
260
|
-
$fooz140='',
|
261
|
-
$fooz150='',
|
262
|
-
$fooz160='',
|
263
|
-
$fooz170='',
|
264
|
-
$fooz180='',
|
265
|
-
$fooz190='',
|
266
|
-
$fooz200='',
|
267
|
-
$fooz210='',
|
268
|
-
$fooz220='',
|
269
|
-
$fooz230='',
|
270
|
-
$fooz240='',
|
271
|
-
$fooz260='',
|
272
|
-
$barz10='',
|
273
|
-
$barz20='',
|
274
|
-
$barz30='',
|
275
|
-
$barz40='',
|
276
|
-
$barz50='',
|
277
|
-
$barz60='',
|
278
|
-
$barz70='',
|
279
|
-
$barz80='',
|
280
|
-
$barz90='',
|
281
|
-
$barz100='',
|
282
|
-
$barz110='',
|
283
|
-
$barz120='',
|
284
|
-
$barz130='',
|
285
|
-
$barz140='',
|
286
|
-
$barz150='',
|
287
|
-
$barz160='',
|
288
|
-
$barz170='',
|
289
|
-
$barz180='',
|
290
|
-
$barz190='',
|
291
|
-
$barz200='',
|
292
|
-
$barz210='',
|
293
|
-
$barz220='',
|
294
|
-
$barz230='',
|
295
|
-
$barz240='',
|
296
|
-
) {
|
297
|
-
|
298
|
-
|
299
|
-
notify { $port: }
|
300
|
-
}
|
301
|
-
|
302
|
-
include apache
|