jackal 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/jackal/callback.rb +14 -11
- data/lib/jackal/loader.rb +6 -2
- data/lib/jackal/utils.rb +14 -5
- data/lib/jackal/utils/config.rb +28 -3
- data/lib/jackal/utils/process.rb +22 -7
- data/lib/jackal/utils/spec/helpers.rb +1 -1
- data/lib/jackal/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87d40ed9a2151a4e456b7a80a817e81856b471b5
|
4
|
+
data.tar.gz: cfda4c42c5e359630c8d296c1f8be8f4fbb1956a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3b2963e4f7f5ee5078665980843904fd17afd1edd04b1ff1865e6bbfa109826fb688f1a68645d0f11e8465c549337cd7450de81f578070ccd2e0477c021645b
|
7
|
+
data.tar.gz: d2dc8f35b125bdf42beb18a30786d9396adcf5e67d1b17e7a059fa50a19310c8353c51555f1c30c639e7b6455e4b3f188262ff2f3b0dd27812683b55045ebb2d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# v0.3.0
|
2
|
+
* Force source looping on `Callback#completed`
|
3
|
+
* Move HTTP hook configuration within jackal namespace
|
4
|
+
* Add support for using `spawn` on a per-process basis
|
5
|
+
* Link owner callback into formatters
|
6
|
+
|
1
7
|
# v0.2.4
|
2
8
|
* Fix nesting for orphan callback setup
|
3
9
|
* Add constant and memoization helpers into `Callback`
|
data/lib/jackal/callback.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'jackal'
|
2
|
+
require 'pp'
|
2
3
|
|
3
4
|
module Jackal
|
4
5
|
# Jackal customized callback
|
@@ -22,7 +23,7 @@ module Jackal
|
|
22
23
|
super
|
23
24
|
if(service_config[:formatters])
|
24
25
|
@formatters = service_config[:formatters].map do |klass_name|
|
25
|
-
constantize(klass_name).new
|
26
|
+
constantize(klass_name).new(self)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -40,7 +41,7 @@ module Jackal
|
|
40
41
|
# @return [Utils::Process]
|
41
42
|
def process_manager
|
42
43
|
memoize(:process_manager) do
|
43
|
-
Utils::Process.new
|
44
|
+
Utils::Process.new(app_config.fetch(:process_manager, Smash.new))
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
@@ -77,13 +78,13 @@ module Jackal
|
|
77
78
|
def failed(payload, message, reason='No reason provided')
|
78
79
|
error "Processing of #{message} failed! Reason: #{reason}"
|
79
80
|
message.confirm!
|
80
|
-
|
81
|
-
source = Carnivore::Supervisor.supervisor[
|
81
|
+
dest = destination(:error, payload)
|
82
|
+
source = Carnivore::Supervisor.supervisor[dest]
|
82
83
|
if(source)
|
83
84
|
error "Sending #{message} to error handler: #{source}"
|
84
85
|
source.transmit(payload)
|
85
86
|
else
|
86
|
-
error "No error source found for generated source path: #{
|
87
|
+
error "No error source found for generated source path: #{dest}"
|
87
88
|
info "Processing of message #{message} has completed. Message now discarded."
|
88
89
|
end
|
89
90
|
end
|
@@ -95,21 +96,23 @@ module Jackal
|
|
95
96
|
def completed(payload, message)
|
96
97
|
message.confirm!
|
97
98
|
info "Processing of #{message} complete on this callback"
|
98
|
-
forward(payload)
|
99
|
+
forward(payload, source.name)
|
99
100
|
end
|
100
101
|
|
101
102
|
# Forward payload to output source
|
102
103
|
#
|
103
104
|
# @param payload [Hash]
|
104
|
-
def forward(payload)
|
105
|
-
|
106
|
-
|
105
|
+
def forward(payload, dest=nil)
|
106
|
+
unless(dest)
|
107
|
+
dest = destination(:output, payload)
|
108
|
+
end
|
109
|
+
source = Carnivore::Supervisor.supervisor[dest]
|
107
110
|
if(source)
|
108
111
|
info "Forwarding payload to output destination... (#{source})"
|
109
|
-
debug "Forwarded payload: #{payload.
|
112
|
+
debug "Forwarded payload: #{payload.pretty_inspect}"
|
110
113
|
source.transmit(payload)
|
111
114
|
else
|
112
|
-
warn "No destination source found for generated source path: #{
|
115
|
+
warn "No destination source found for generated source path: #{dest}"
|
113
116
|
info "Processing of message has completed. Message now discarded."
|
114
117
|
end
|
115
118
|
end
|
data/lib/jackal/loader.rb
CHANGED
@@ -10,8 +10,12 @@ module Jackal
|
|
10
10
|
# @param opts [Hash]
|
11
11
|
def run!(opts)
|
12
12
|
|
13
|
-
if(ENV['JACKAL_TESTING_MODE']
|
14
|
-
|
13
|
+
if(ENV['JACKAL_TESTING_MODE'])
|
14
|
+
if(!opts[:config])
|
15
|
+
Carnivore.configure!(:verify)
|
16
|
+
else
|
17
|
+
Carnivore.configure!(opts[:config], :force)
|
18
|
+
end
|
15
19
|
else
|
16
20
|
Carnivore.configure!(opts[:config])
|
17
21
|
Carnivore::Config.immutable!
|
data/lib/jackal/utils.rb
CHANGED
@@ -4,6 +4,12 @@ module Jackal
|
|
4
4
|
# Helper utilities
|
5
5
|
module Utils
|
6
6
|
|
7
|
+
# Valid configuration paths for hook configuration
|
8
|
+
HTTP_HOOK_CONFIG = [
|
9
|
+
[:http_hook],
|
10
|
+
[:jackal, :http_hook]
|
11
|
+
]
|
12
|
+
|
7
13
|
autoload :Spec, 'jackal/utils/spec'
|
8
14
|
autoload :Payload, 'jackal/utils/payload'
|
9
15
|
autoload :Config, 'jackal/utils/config'
|
@@ -16,18 +22,21 @@ module Jackal
|
|
16
22
|
|
17
23
|
class << self
|
18
24
|
|
19
|
-
# Load
|
25
|
+
# Load the HTTP Hook if configured
|
20
26
|
#
|
21
27
|
# @return [TrueClass, FalseClass]
|
22
28
|
def load_http_hook
|
23
|
-
|
29
|
+
hook_config = HTTP_HOOK_CONFIG.map do |path|
|
30
|
+
Carnivore::Config.get(*path)
|
31
|
+
end.compact.first
|
32
|
+
if(hook_config)
|
24
33
|
Carnivore.configure do
|
25
34
|
Carnivore::Source.build(
|
26
35
|
:type => :http_endpoints,
|
27
36
|
:args => {
|
28
|
-
:name => :
|
29
|
-
:bind =>
|
30
|
-
:port =>
|
37
|
+
:name => :jackal_http_hook,
|
38
|
+
:bind => hook_config.fetch(:bind, "0.0.0.0"),
|
39
|
+
:port => hook_config.fetch(:port, 8989)
|
31
40
|
}
|
32
41
|
)
|
33
42
|
end
|
data/lib/jackal/utils/config.rb
CHANGED
@@ -4,6 +4,20 @@ module Jackal
|
|
4
4
|
module Utils
|
5
5
|
module Config
|
6
6
|
|
7
|
+
# Load extra modules automatically
|
8
|
+
def self.included(klass)
|
9
|
+
klass.class_eval do
|
10
|
+
include Bogo::AnimalStrings
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Load extra modules automatically
|
15
|
+
def self.extended(klass)
|
16
|
+
klass.class_eval do
|
17
|
+
extend Bogo::AnimalStrings
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
7
21
|
# @return [Symbol] name of service
|
8
22
|
def service_name(class_name = self.class.name)
|
9
23
|
config_path(class_name).last.to_sym
|
@@ -12,7 +26,7 @@ module Jackal
|
|
12
26
|
# @return [Array] key path in configuration
|
13
27
|
def config_path(class_name = self.class.name)
|
14
28
|
class_name.split('::')[0,2].map do |string|
|
15
|
-
string
|
29
|
+
snake(string)
|
16
30
|
end
|
17
31
|
end
|
18
32
|
|
@@ -21,6 +35,16 @@ module Jackal
|
|
21
35
|
config_path.join('_')
|
22
36
|
end
|
23
37
|
|
38
|
+
# @return [Smash] application configuration
|
39
|
+
def app_config
|
40
|
+
Carnivore::Config.fetch(
|
41
|
+
snake(
|
42
|
+
self.class.name.split('::').first
|
43
|
+
),
|
44
|
+
Smash.new
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
24
48
|
# @return [Smash] service configuration
|
25
49
|
def service_config
|
26
50
|
Carnivore::Config.get(*config_path) || Smash.new
|
@@ -31,11 +55,12 @@ module Jackal
|
|
31
55
|
service_config[:config] || Smash.new
|
32
56
|
end
|
33
57
|
|
34
|
-
#
|
58
|
+
# Generate destination key based on direction
|
35
59
|
#
|
36
60
|
# @param direction [Symbol, String]
|
61
|
+
# @param payload [Smash]
|
37
62
|
# @return [Symbol]
|
38
|
-
def destination(direction
|
63
|
+
def destination(direction, payload)
|
39
64
|
[source_prefix, direction].map(&:to_s).join('_').to_sym
|
40
65
|
end
|
41
66
|
|
data/lib/jackal/utils/process.rb
CHANGED
@@ -8,15 +8,24 @@ module Jackal
|
|
8
8
|
module Utils
|
9
9
|
class Process
|
10
10
|
|
11
|
+
# Default path for IO tmp files
|
12
|
+
DEFAULT_STORAGE_DIRECTORY = '/tmp/jackal-process-manager'
|
13
|
+
|
14
|
+
# @return [Smash] manager configuration
|
15
|
+
attr_reader :configuration
|
16
|
+
# @return [String] storage directory path
|
17
|
+
attr_reader :storage_directory
|
18
|
+
|
11
19
|
# Create new instance
|
12
20
|
#
|
21
|
+
# @param config [Smash] process manager configuration
|
13
22
|
# @return [self]
|
14
|
-
def initialize
|
15
|
-
@
|
16
|
-
|
17
|
-
|
23
|
+
def initialize(config={})
|
24
|
+
@configuration = config.to_smash
|
25
|
+
@storage_directory = configuration.fetch(
|
26
|
+
:storage_directory, DEFAULT_STORAGE_DIRECTORY
|
18
27
|
)
|
19
|
-
FileUtils.mkdir_p(
|
28
|
+
FileUtils.mkdir_p(storage_directory)
|
20
29
|
end
|
21
30
|
|
22
31
|
# Create new process
|
@@ -30,7 +39,13 @@ module Jackal
|
|
30
39
|
command = Shellwords.shellsplit(command.first)
|
31
40
|
end
|
32
41
|
if(block_given?)
|
33
|
-
|
42
|
+
if(configuration[:spawn])
|
43
|
+
yield ChildProcess::Unix::PosixSpawnProcess.new(command)
|
44
|
+
else
|
45
|
+
yield ChildProcess.build(*command)
|
46
|
+
end
|
47
|
+
else
|
48
|
+
raise ArgumentError.new('Expecting block but no block provided!')
|
34
49
|
end
|
35
50
|
true
|
36
51
|
end
|
@@ -40,7 +55,7 @@ module Jackal
|
|
40
55
|
# @param args [String] argument list joined for filename
|
41
56
|
# @return [IO]
|
42
57
|
def create_io_tmp(*args)
|
43
|
-
path = File.join(
|
58
|
+
path = File.join(storage_directory, args.join('-'))
|
44
59
|
FileUtils.mkdir_p(File.dirname(path))
|
45
60
|
t_file = File.open(path, 'w+')
|
46
61
|
t_file.sync
|
@@ -40,7 +40,7 @@ def payload_for(style, args={})
|
|
40
40
|
if(args[:nest])
|
41
41
|
Jackal::Utils.new_payload(:test, args[:nest] => MultiJson.load(File.read(path)))
|
42
42
|
else
|
43
|
-
Jackal::Utils.new_payload(:test, File.read(path))
|
43
|
+
Jackal::Utils.new_payload(:test, MultiJson.load(File.read(path)))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
else
|
data/lib/jackal/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jackal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Roberts
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: carnivore
|