jerakia 1.1.2 → 1.2.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 +4 -4
- data/lib/hiera/backend/jerakia_backend.rb +13 -14
- data/lib/jerakia/answer.rb +28 -27
- data/lib/jerakia/cache/entry.rb +2 -6
- data/lib/jerakia/cache/file.rb +53 -23
- data/lib/jerakia/cache.rb +44 -11
- data/lib/jerakia/cli/lookup.rb +124 -0
- data/lib/jerakia/cli/server.rb +50 -0
- data/lib/jerakia/cli/token.rb +64 -0
- data/lib/jerakia/cli.rb +7 -117
- data/lib/jerakia/config.rb +5 -5
- data/lib/jerakia/datasource/dummy.rb +1 -6
- data/lib/jerakia/datasource/file/json.rb +1 -3
- data/lib/jerakia/datasource/file/yaml.rb +1 -3
- data/lib/jerakia/datasource/file.rb +21 -44
- data/lib/jerakia/datasource/http.rb +17 -23
- data/lib/jerakia/datasource.rb +37 -36
- data/lib/jerakia/dsl/lookup.rb +4 -6
- data/lib/jerakia/dsl/policy.rb +11 -12
- data/lib/jerakia/error.rb +0 -5
- data/lib/jerakia/launcher.rb +26 -30
- data/lib/jerakia/log.rb +21 -22
- data/lib/jerakia/lookup/plugin/hiera.rb +3 -4
- data/lib/jerakia/lookup/plugin.rb +5 -6
- data/lib/jerakia/lookup/plugin_config.rb +31 -0
- data/lib/jerakia/lookup/pluginfactory.rb +30 -36
- data/lib/jerakia/lookup.rb +31 -32
- data/lib/jerakia/policy.rb +60 -45
- data/lib/jerakia/request.rb +3 -2
- data/lib/jerakia/response/filter/encryption.rb +7 -12
- data/lib/jerakia/response/filter/strsub.rb +4 -9
- data/lib/jerakia/response/filter.rb +5 -5
- data/lib/jerakia/response.rb +7 -13
- data/lib/jerakia/schema.rb +23 -35
- data/lib/jerakia/scope/metadata.rb +0 -1
- data/lib/jerakia/scope/puppetdb.rb +38 -0
- data/lib/jerakia/scope/server.rb +60 -0
- data/lib/jerakia/scope/yaml.rb +3 -4
- data/lib/jerakia/scope.rb +0 -2
- data/lib/jerakia/server/auth/token.rb +35 -0
- data/lib/jerakia/server/auth.rb +72 -0
- data/lib/jerakia/server/rest.rb +140 -0
- data/lib/jerakia/server.rb +41 -0
- data/lib/jerakia/util.rb +6 -7
- data/lib/jerakia/version.rb +1 -3
- data/lib/jerakia.rb +58 -40
- data/lib/puppet/indirector/data_binding/jerakia.rb +9 -11
- data/lib/puppet/indirector/data_binding/jerakia_rest.rb +11 -13
- metadata +78 -11
data/lib/jerakia/schema.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
1
|
class Jerakia::Schema
|
2
|
-
|
3
2
|
# Arguments: request(Jerakia::Request), opts(Hash)
|
4
3
|
#
|
5
|
-
def initialize(request,opts)
|
6
|
-
schema_datasource=datasource(opts)
|
7
|
-
schema_request=Jerakia::Request.new(
|
4
|
+
def initialize(request, opts)
|
5
|
+
schema_datasource = datasource(opts)
|
6
|
+
schema_request = Jerakia::Request.new(
|
8
7
|
:metadata => request.metadata,
|
9
8
|
:key => request.key,
|
10
9
|
:namespace => request.namespace,
|
11
|
-
:use_schema => false
|
10
|
+
:use_schema => false
|
12
11
|
)
|
13
12
|
|
14
13
|
Jerakia.log.debug("Schema lookup invoked for #{request.key} namespace: #{request.namespace}")
|
15
|
-
schema_lookup = Jerakia::Launcher.new(schema_request)
|
16
|
-
|
14
|
+
schema_lookup = Jerakia::Launcher.new(schema_request)
|
17
15
|
|
18
16
|
begin
|
19
17
|
schema_lookup.evaluate do
|
@@ -27,58 +25,48 @@ class Jerakia::Schema
|
|
27
25
|
raise Jerakia::SchemaError, "Schema lookup for #{request.key} failed: #{e.message}"
|
28
26
|
end
|
29
27
|
|
30
|
-
|
31
28
|
@schema_data = schema_lookup.answer.payload || {}
|
32
29
|
|
33
30
|
# Validate the returned data from the schema
|
34
31
|
raise Jerakia::SchemaError, "Schema must return a hash for key #{request.key}" unless @schema_data.is_a?(Hash)
|
35
32
|
|
36
|
-
valid_opts =
|
33
|
+
valid_opts = %w(alias cascade merge)
|
37
34
|
@schema_data.keys.each do |key|
|
38
35
|
unless valid_opts.include?(key)
|
39
36
|
raise Jerakia::SchemaError, "Unknown schema option #{key} for key #{request.key}"
|
40
37
|
end
|
41
38
|
end
|
42
39
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
40
|
Jerakia.log.debug("Schema returned #{@schema_data}")
|
47
41
|
|
48
|
-
if salias = @schema_data[
|
49
|
-
Jerakia.log.debug("Schema alias found to #{@schema_data[
|
50
|
-
request.namespace=Array(salias[
|
51
|
-
request.key = salias[
|
42
|
+
if salias = @schema_data['alias']
|
43
|
+
Jerakia.log.debug("Schema alias found to #{@schema_data['alias']}")
|
44
|
+
request.namespace = Array(salias['namespace']) if salias['namespace']
|
45
|
+
request.key = salias['key'] if salias['key']
|
52
46
|
end
|
53
47
|
|
54
|
-
|
55
|
-
if @schema_data["cascade"]
|
48
|
+
if @schema_data['cascade']
|
56
49
|
Jerakia.log.debug("Overriding lookup_type from #{request.lookup_type} to :cascade")
|
57
|
-
request.lookup_type= :cascade
|
50
|
+
request.lookup_type = :cascade
|
58
51
|
end
|
59
52
|
|
60
|
-
if @schema_data[
|
61
|
-
if
|
62
|
-
request.merge = @schema_data[
|
53
|
+
if @schema_data['merge']
|
54
|
+
if %w(array hash deep_hash).include?(@schema_data['merge'])
|
55
|
+
request.merge = @schema_data['merge'].to_sym
|
63
56
|
else
|
64
|
-
raise Jerakia::SchemaError, "Invalid merge type #{@schema_data['merge']} found in schema for key #{request.key}"
|
57
|
+
raise Jerakia::SchemaError, "Invalid merge type #{@schema_data['merge']} found in schema for key #{request.key}"
|
65
58
|
end
|
66
59
|
end
|
67
|
-
|
68
60
|
end
|
69
61
|
|
70
|
-
def datasource(opts={})
|
71
|
-
[
|
62
|
+
def datasource(opts = {})
|
63
|
+
[
|
72
64
|
:file, {
|
73
|
-
:docroot => opts[
|
74
|
-
:format => opts[
|
75
|
-
:enable_caching => opts[
|
76
|
-
:searchpath => [
|
65
|
+
:docroot => opts['docroot'] || '/var/lib/jerakia/schema',
|
66
|
+
:format => opts['format'] || :json,
|
67
|
+
:enable_caching => opts['enable_caching'] || true,
|
68
|
+
:searchpath => ['']
|
77
69
|
}
|
78
|
-
]
|
70
|
+
]
|
79
71
|
end
|
80
|
-
|
81
|
-
|
82
72
|
end
|
83
|
-
|
84
|
-
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'lookup_http'
|
2
|
+
class Jerakia::Scope
|
3
|
+
module Puppetdb
|
4
|
+
def create
|
5
|
+
yaml_file = request.scope_options['file'] || './jerakia_scope.yaml'
|
6
|
+
puppetdb_host = request.scope_options['puppetdb_host'] || 'localhost'
|
7
|
+
puppetdb_port = request.scope_options['puppetdb_port'] || 8080
|
8
|
+
puppetdb_api = request.scope_options['puppetdb_api'] || 4
|
9
|
+
node = request.scope_options['node']
|
10
|
+
|
11
|
+
raise Jerakia::Error, "Must pass the option node to the puppetdb scope handler" unless node
|
12
|
+
|
13
|
+
connection_opts = {
|
14
|
+
:host => puppetdb_host,
|
15
|
+
:port => puppetdb_port,
|
16
|
+
:output => 'json',
|
17
|
+
:ignore_404 => true
|
18
|
+
}.merge(request.scope_options['puppetdb_http_opts'] || {})
|
19
|
+
|
20
|
+
puppetdb_con = LookupHttp.new(connection_opts)
|
21
|
+
|
22
|
+
case puppetdb_api
|
23
|
+
when 4
|
24
|
+
path = "/pdb/query/v4/nodes/#{node}/facts"
|
25
|
+
else
|
26
|
+
raise Jerakia::Error, "Unsupported PuppetDB API version, #{puppetdb_api}"
|
27
|
+
end
|
28
|
+
|
29
|
+
Jerakia.log.debug("Sending HTTP query to PuppetDB #{puppetdb_host}:#{puppetdb_port} at path #{path}")
|
30
|
+
|
31
|
+
response = puppetdb_con.get_parsed(path)
|
32
|
+
|
33
|
+
raise Jerakia::Error, "PuppetDB returned no data for node #{node}" unless response.is_a?(Array)
|
34
|
+
|
35
|
+
response.each { |r| value[r['name'].to_sym] = r['value'] }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'data_mapper'
|
3
|
+
# The server scope handler can store and retrieve scope data server side
|
4
|
+
#
|
5
|
+
class Jerakia::Scope
|
6
|
+
module Server
|
7
|
+
class Database
|
8
|
+
DataMapper.setup(:scope, "sqlite://#{Jerakia.config[:databasedir]}/scope.db")
|
9
|
+
|
10
|
+
class Resource
|
11
|
+
include DataMapper::Resource
|
12
|
+
|
13
|
+
|
14
|
+
def self.default_repository_name
|
15
|
+
:scope
|
16
|
+
end
|
17
|
+
|
18
|
+
property :id, Serial, :key => true
|
19
|
+
property :identifier, String, :index => true
|
20
|
+
property :realm, String, :index => true
|
21
|
+
property :uuid, String
|
22
|
+
property :scope, Object
|
23
|
+
end
|
24
|
+
|
25
|
+
DataMapper.repository(:scope).auto_upgrade!
|
26
|
+
DataMapper.repository(:scope).auto_migrate!
|
27
|
+
end
|
28
|
+
|
29
|
+
def create
|
30
|
+
realm = request.scope_options['realm']
|
31
|
+
identifier = request.scope_options['identifier']
|
32
|
+
|
33
|
+
raise Jerakia::Error, "Must supply realm and identifier for server scope handler" unless realm and identifier
|
34
|
+
resource = Jerakia::Scope::Server.find(realm, identifier)
|
35
|
+
raise Jerakia::Error, "No scope data found for realm:#{realm} identifier:#{identifier}" if resource.nil?
|
36
|
+
scope = resource.scope
|
37
|
+
raise Jerakia::Error, "Scope did not return a hash for realm:#{realm} identifier:#{identifier}" unless scope.is_a?(Hash)
|
38
|
+
@value = Hash[ scope.map { |k,v| [ k.to_sym, v ] } ]
|
39
|
+
end
|
40
|
+
|
41
|
+
class << self
|
42
|
+
def find(realm, identifier)
|
43
|
+
Database::Resource.first(:identifier => identifier, :realm => realm)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def store(realm, identifier, scope)
|
48
|
+
uuid = SecureRandom.uuid
|
49
|
+
entry = find(realm, identifier)
|
50
|
+
if entry.nil?
|
51
|
+
Database::Resource.create(:identifier => identifier, :realm => realm, :scope => scope, :uuid => uuid)
|
52
|
+
else
|
53
|
+
entry.update({:scope => scope, :uuid => uuid})
|
54
|
+
entry.save
|
55
|
+
end
|
56
|
+
uuid
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/jerakia/scope/yaml.rb
CHANGED
@@ -2,13 +2,12 @@
|
|
2
2
|
class Jerakia::Scope
|
3
3
|
module Yaml
|
4
4
|
def create
|
5
|
-
yaml_file = request.scope_options[
|
6
|
-
raise Jerakia::Error, "Scope file #{yaml_file} not found" unless File.
|
5
|
+
yaml_file = request.scope_options['file'] || './jerakia_scope.yaml'
|
6
|
+
raise Jerakia::Error, "Scope file #{yaml_file} not found" unless File.exist?(yaml_file)
|
7
7
|
data = YAML.load(File.read(yaml_file))
|
8
|
-
data.each do |key,val|
|
8
|
+
data.each do |key, val|
|
9
9
|
value[key.to_sym] = val
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
data/lib/jerakia/scope.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'data_mapper'
|
2
|
+
require 'dm-sqlite-adapter'
|
3
|
+
require 'bcrypt'
|
4
|
+
require 'jerakia'
|
5
|
+
require 'jerakia/config'
|
6
|
+
class Jerakia
|
7
|
+
class Server
|
8
|
+
class Auth
|
9
|
+
|
10
|
+
Jerakia.log.debug("Authentication database sqlite://#{Jerakia.config[:vardir]}/tokens.db")
|
11
|
+
|
12
|
+
DataMapper.setup(:tokens, "sqlite://#{Jerakia.config[:databasedir]}/tokens.db")
|
13
|
+
|
14
|
+
class Token
|
15
|
+
|
16
|
+
include DataMapper::Resource
|
17
|
+
include BCrypt
|
18
|
+
|
19
|
+
def self.default_repository_name
|
20
|
+
:tokens
|
21
|
+
end
|
22
|
+
|
23
|
+
property :api_id, String, :key => true
|
24
|
+
property :token, BCryptHash
|
25
|
+
property :active, Boolean, :default => true
|
26
|
+
property :last_seen, DateTime, :default => DateTime.now
|
27
|
+
end
|
28
|
+
|
29
|
+
DataMapper.finalize
|
30
|
+
DataMapper.auto_upgrade!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'jerakia/server/auth/token'
|
2
|
+
require 'securerandom'
|
3
|
+
|
4
|
+
class Jerakia
|
5
|
+
class Server
|
6
|
+
class Auth
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def generate_token
|
11
|
+
SecureRandom.hex(40)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def get_entry(api_id)
|
16
|
+
Jerakia::Server::Auth::Token.get(api_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def update(api_id, fields)
|
20
|
+
entry = get_entry(api_id)
|
21
|
+
entry.update(fields)
|
22
|
+
entry.save
|
23
|
+
end
|
24
|
+
|
25
|
+
def seen!(api_id)
|
26
|
+
update(api_id, { :last_seen => DateTime.now })
|
27
|
+
end
|
28
|
+
|
29
|
+
def disable(api_id)
|
30
|
+
update(api_id, { :active => false })
|
31
|
+
end
|
32
|
+
|
33
|
+
def enable(api_id)
|
34
|
+
update(api_id, { :active => true })
|
35
|
+
end
|
36
|
+
|
37
|
+
def destroy(api_id)
|
38
|
+
entry = get_entry(api_id)
|
39
|
+
entry.destroy
|
40
|
+
end
|
41
|
+
|
42
|
+
def exists?(api_id)
|
43
|
+
get_entry(api_id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def create(api_id)
|
47
|
+
raise Jerakia::Error, "API ID #{api_id} already exists" if exists?(api_id)
|
48
|
+
token = generate_token
|
49
|
+
entry = Jerakia::Server::Auth::Token.new(:api_id => api_id, :token => token)
|
50
|
+
entry.save
|
51
|
+
api_id + ":" + token
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_tokens
|
55
|
+
Jerakia::Server::Auth::Token.find
|
56
|
+
end
|
57
|
+
|
58
|
+
def authenticate(token_string)
|
59
|
+
api_id, token = token_string.split(/:/)
|
60
|
+
entry = get_entry(api_id)
|
61
|
+
return false if entry.nil?
|
62
|
+
if entry.token == token and entry.active
|
63
|
+
seen!(api_id)
|
64
|
+
true
|
65
|
+
else
|
66
|
+
false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'jerakia'
|
3
|
+
require 'jerakia/server/auth'
|
4
|
+
require 'json'
|
5
|
+
require 'jerakia/scope/server'
|
6
|
+
|
7
|
+
class Jerakia
|
8
|
+
class Server
|
9
|
+
class Rest < Sinatra::Base
|
10
|
+
|
11
|
+
def self.jerakia
|
12
|
+
Jerakia::Server.jerakia
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@authorized_tokens={}
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def jerakia
|
21
|
+
self.class.jerakia
|
22
|
+
end
|
23
|
+
|
24
|
+
def auth_denied
|
25
|
+
request_failed('unauthorized', 401)
|
26
|
+
end
|
27
|
+
|
28
|
+
def token_ttl
|
29
|
+
Jerakia::Server.config["token_ttl"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def token_valid?(token)
|
33
|
+
return false unless @authorized_tokens[token].is_a?(Time)
|
34
|
+
(Time.now - @authorized_tokens[token]) < token_ttl.to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
def authenticate!
|
38
|
+
token = env['HTTP_X_AUTHENTICATION']
|
39
|
+
auth_denied if token.nil?
|
40
|
+
return true if token_valid?(token)
|
41
|
+
unless Jerakia::Server::Auth.authenticate(token)
|
42
|
+
auth_denied
|
43
|
+
end
|
44
|
+
@authorized_tokens[token] = Time.now
|
45
|
+
end
|
46
|
+
|
47
|
+
before do
|
48
|
+
content_type 'application/json'
|
49
|
+
end
|
50
|
+
|
51
|
+
get '/' do
|
52
|
+
auth_denied
|
53
|
+
end
|
54
|
+
|
55
|
+
def request_failed(message, status_code=501)
|
56
|
+
halt(status_code, {
|
57
|
+
:status => 'failed',
|
58
|
+
:message => message,
|
59
|
+
}.to_json)
|
60
|
+
end
|
61
|
+
|
62
|
+
def mandatory_params(mandatory, params)
|
63
|
+
mandatory.each do |m|
|
64
|
+
unless params.include?(m)
|
65
|
+
request_failed("Must include parameter #{m} in request", 400)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
get '/v1/lookup' do
|
71
|
+
request_failed("Keyless lookups not supported in this version of Jerakia")
|
72
|
+
end
|
73
|
+
|
74
|
+
get '/v1/lookup/:key' do
|
75
|
+
mandatory_params(['namespace'], params)
|
76
|
+
request_opts = {
|
77
|
+
:key => params['key'],
|
78
|
+
:namespace => params['namespace'].split(/\//),
|
79
|
+
}
|
80
|
+
|
81
|
+
metadata = params.select { |k,v| k =~ /^metadata_.*/ }
|
82
|
+
scope_opts = params.select { |k,v| k =~ /^scope_.*/ }
|
83
|
+
|
84
|
+
request_opts[:metadata] = Hash[metadata.map { |k,v| [k.gsub(/^metadata_/, ""), v] }]
|
85
|
+
request_opts[:scope_options] = Hash[scope_opts.map { |k,v| [k.gsub(/^scope_/, ""), v] }]
|
86
|
+
|
87
|
+
|
88
|
+
request_opts[:policy] = params['policy'].to_sym if params['policy']
|
89
|
+
request_opts[:lookup_type] = params['lookup_type'].to_sym if params['lookup_type']
|
90
|
+
request_opts[:merge] = params['merge'].to_sym if params['merge']
|
91
|
+
request_opts[:scope] = params['scope'].to_sym if params['scope']
|
92
|
+
request_opts[:use_schema] = false if params['use_schema'] == 'false'
|
93
|
+
|
94
|
+
begin
|
95
|
+
request = Jerakia::Request.new(request_opts)
|
96
|
+
answer = jerakia.lookup(request)
|
97
|
+
rescue Jerakia::Error => e
|
98
|
+
request_failed(e.message, 501)
|
99
|
+
end
|
100
|
+
{
|
101
|
+
:status => 'ok',
|
102
|
+
:payload => answer.payload
|
103
|
+
}.to_json
|
104
|
+
end
|
105
|
+
|
106
|
+
get '/v1/scope/:realm/:identifier' do
|
107
|
+
resource = Jerakia::Scope::Server.find(params['realm'], params['identifier'])
|
108
|
+
if resource.nil?
|
109
|
+
halt(404, { :status => 'failed', :message => "No scope data found" }.to_json)
|
110
|
+
else
|
111
|
+
{
|
112
|
+
:status => 'ok',
|
113
|
+
:payload => resource.scope
|
114
|
+
}.to_json
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
put '/v1/scope/:realm/:identifier' do
|
119
|
+
scope = JSON.parse(request.body.read)
|
120
|
+
uuid = Jerakia::Scope::Server.store(params['realm'], params['identifier'], scope)
|
121
|
+
{
|
122
|
+
:status => 'ok',
|
123
|
+
:uuid => uuid
|
124
|
+
}.to_json
|
125
|
+
end
|
126
|
+
|
127
|
+
get '/v1/scope/:realm/:identifier/uuid' do
|
128
|
+
resource = Jerakia::Scope::Server.find(params['realm'], params['identifier'])
|
129
|
+
if resource.nil?
|
130
|
+
request_failed('No scope data found', 404)
|
131
|
+
else
|
132
|
+
{
|
133
|
+
:status => 'ok',
|
134
|
+
:uuid => resource.uuid
|
135
|
+
}.to_json
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'jerakia'
|
3
|
+
require 'thin'
|
4
|
+
class Jerakia
|
5
|
+
class Server
|
6
|
+
|
7
|
+
def jerakia
|
8
|
+
self.class.jerakia
|
9
|
+
end
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
@jerakia = nil
|
14
|
+
@config = {}
|
15
|
+
|
16
|
+
attr_reader :config
|
17
|
+
|
18
|
+
def default_config
|
19
|
+
{
|
20
|
+
'bind' => '127.0.0.1',
|
21
|
+
'port' => '9843',
|
22
|
+
'token_ttl' => 300,
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def jerakia
|
27
|
+
@jerakia
|
28
|
+
end
|
29
|
+
|
30
|
+
def start(opts)
|
31
|
+
@jerakia = Jerakia.new(opts)
|
32
|
+
require 'jerakia/server/rest'
|
33
|
+
@config = default_config.merge(Jerakia.config[:server] || {})
|
34
|
+
Thin::Logging.logger=Jerakia.log.logger
|
35
|
+
Jerakia::Server::Rest.set :bind, @config['bind']
|
36
|
+
Jerakia::Server::Rest.set :port, @config['port']
|
37
|
+
Jerakia::Server::Rest.run!
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/jerakia/util.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
class Jerakia
|
2
2
|
module Util
|
3
3
|
class << self
|
4
|
-
def autoload(path,mod)
|
4
|
+
def autoload(path, mod)
|
5
5
|
Jerakia.log.debug "autoloading #{path} #{mod}"
|
6
|
-
require "jerakia/#{path}/#{mod
|
6
|
+
require "jerakia/#{path}/#{mod}"
|
7
7
|
end
|
8
8
|
|
9
9
|
def walk(data)
|
@@ -21,7 +21,7 @@ class Jerakia
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def walk_hash(data)
|
24
|
-
data.
|
24
|
+
data.each_with_object({}) do |(_k, v), h|
|
25
25
|
if v.is_a?(Hash)
|
26
26
|
walk_hash(v) { |x| yield x }
|
27
27
|
elsif v.is_a?(Array)
|
@@ -29,9 +29,9 @@ class Jerakia
|
|
29
29
|
else
|
30
30
|
yield v
|
31
31
|
end
|
32
|
-
|
32
|
+
h
|
33
33
|
end
|
34
|
-
|
34
|
+
data
|
35
35
|
end
|
36
36
|
|
37
37
|
def walk_array(data)
|
@@ -44,9 +44,8 @@ class Jerakia
|
|
44
44
|
yield element
|
45
45
|
end
|
46
46
|
element
|
47
|
-
|
47
|
+
end
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
data/lib/jerakia/version.rb
CHANGED