jerakia 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|