langrove 0.0.4.5 → 0.0.5.3
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.
- data/.rvmrc +29 -38
- data/Gemfile +13 -7
- data/Gemfile.lock +35 -32
- data/Guardfile +11 -0
- data/README.md +34 -0
- data/Rakefile +8 -6
- data/bin/README.md +3 -0
- data/bin/langrove +1 -2
- data/langrove.gemspec +35 -0
- data/lib/langrove/README.md +82 -0
- data/lib/langrove/adaptor/README.md +92 -0
- data/lib/langrove/adaptor/adaptor_base.rb +123 -0
- data/lib/langrove/adaptor/base.rb +12 -2
- data/lib/langrove/adaptor/default.rb +8 -0
- data/lib/langrove/adaptor/event_machine_adaptor.rb +152 -0
- data/lib/langrove/adaptor/query_adaptor.rb +271 -0
- data/lib/langrove/behaviour/README.md +170 -0
- data/lib/langrove/behaviour/assessable.rb +63 -0
- data/lib/langrove/behaviour/base.rb +16 -0
- data/lib/langrove/behaviour/behaviour_base.rb +341 -0
- data/lib/langrove/behaviour/enqueueable.rb +104 -0
- data/lib/langrove/behaviour/notifiable.rb +48 -0
- data/lib/langrove/behaviour/persistable.rb +89 -0
- data/lib/langrove/behaviour/preloadable.rb +63 -0
- data/lib/langrove/daemon/README.md +7 -0
- data/lib/langrove/daemon/base.rb +9 -2
- data/lib/langrove/daemon/daemon_base.rb +330 -0
- data/lib/langrove/daemon/default.rb +3 -0
- data/lib/langrove/ext/README.md +48 -0
- data/lib/langrove/ext/class_loader.rb +9 -66
- data/lib/langrove/ext/config_item.rb +31 -23
- data/lib/langrove/ext/config_loader.rb +42 -8
- data/lib/langrove/ext/fake_config.rb +121 -0
- data/lib/langrove/ext/fake_logger.rb +50 -7
- data/lib/langrove/ext/fake_root.rb +38 -0
- data/lib/langrove/ext/hash.rb +56 -0
- data/lib/langrove/ext/i.rb +43 -0
- data/lib/langrove/ext/log_monitor.rb +272 -0
- data/lib/langrove/ext/module_loader.rb +52 -0
- data/lib/langrove/ext/recursive_string.rb +94 -0
- data/lib/langrove/ext/spec_helper.rb +84 -0
- data/lib/langrove/ext.rb +8 -2
- data/lib/langrove/handler/README.md +161 -0
- data/lib/langrove/handler/base.rb +29 -2
- data/lib/langrove/handler/default.rb +4 -0
- data/lib/langrove/handler/deferred.rb +105 -0
- data/lib/langrove/handler/handler_base.rb +242 -0
- data/lib/langrove/handler/http_servlet.rb +58 -0
- data/lib/langrove/handler/socket.rb +21 -0
- data/lib/langrove/handler/socket_base.rb +127 -0
- data/lib/langrove/handler/socket_multiplexer.rb +438 -0
- data/lib/langrove/handler/web_socket.rb +41 -0
- data/lib/langrove/plugin/README.md +76 -0
- data/lib/langrove/plugin/assessor.rb +363 -0
- data/lib/langrove/plugin/base.rb +18 -0
- data/lib/langrove/plugin/buffered_persistor.rb +97 -0
- data/lib/langrove/plugin/enqueuer.rb +186 -0
- data/lib/langrove/plugin/notifier.rb +144 -0
- data/lib/langrove/plugin/persistor.rb +360 -0
- data/lib/langrove/plugin/plugin_base.rb +79 -0
- data/lib/langrove/plugin/yaml_file.md +5 -0
- data/lib/langrove/plugin/yaml_file.rb +261 -0
- data/lib/langrove/protocol/README.md +102 -0
- data/lib/langrove/protocol/base.rb +10 -2
- data/lib/langrove/protocol/default.rb +3 -0
- data/lib/langrove/protocol/protocol_base.rb +60 -0
- data/lib/langrove/protocol/syslog.rb +34 -27
- data/lib/langrove/root/README.md +17 -0
- data/lib/langrove/root/base.rb +11 -0
- data/lib/langrove/root/config.rb +163 -0
- data/lib/langrove/root/root_base.rb +259 -0
- data/lib/langrove/server/README.md +7 -0
- data/lib/langrove/server/base.rb +9 -0
- data/lib/langrove/server/default.rb +3 -0
- data/lib/langrove/server/server_base.rb +301 -0
- data/lib/langrove/version.rb +3 -1
- data/lib/langrove.rb +44 -1
- data/spec/langrove/adaptor/adaptor_base_spec.rb +33 -0
- data/spec/langrove/adaptor/event_machine_adaptor_spec.rb +62 -0
- data/spec/langrove/adaptor/query_adaptor_spec.rb +94 -0
- data/spec/langrove/behaviour/assessable_spec.rb +42 -0
- data/spec/langrove/behaviour/behaviour_base_spec.rb +396 -0
- data/spec/langrove/behaviour/enqueueable_spec.rb +19 -0
- data/spec/langrove/behaviour/notifiable_spec.rb +6 -0
- data/spec/langrove/behaviour/persistable_spec.rb +19 -0
- data/spec/langrove/behaviour/preloadable_spec.rb +19 -0
- data/spec/langrove/daemon/base_spec.rb +6 -0
- data/spec/langrove/daemon/daemon_base_spec.rb +253 -0
- data/spec/langrove/ext/class_loader_spec.rb +9 -12
- data/spec/langrove/ext/fake_config_spec.rb +50 -0
- data/spec/langrove/ext/fake_logger_spec.rb +12 -0
- data/spec/langrove/ext/fake_root_spec.rb +19 -0
- data/spec/langrove/ext/hash_spec.rb +54 -0
- data/spec/langrove/ext/i_spec.rb +11 -0
- data/spec/langrove/ext/log_monitor_spec.rb +254 -0
- data/spec/langrove/ext/module_loader_spec.rb +70 -0
- data/spec/langrove/ext/recursive_string_spec.rb +132 -0
- data/{functional/config/environments/development.rb → spec/langrove/ext/spec_helper_spec.rb} +0 -0
- data/spec/langrove/handler/deferred_spec.rb +9 -0
- data/spec/langrove/handler/handler_base_spec.rb +134 -0
- data/spec/langrove/handler/socket_base_spec.rb +76 -0
- data/spec/langrove/handler/socket_multiplexer_spec.rb +480 -0
- data/spec/langrove/handler/socket_spec.rb +6 -0
- data/spec/langrove/handler/web_socket_spec.rb +19 -0
- data/spec/langrove/plugin/assessor_spec.rb +278 -0
- data/spec/langrove/plugin/buffered_persistor_spec.rb +94 -0
- data/spec/langrove/plugin/enqueuer_spec.rb +136 -0
- data/spec/langrove/plugin/notifier_spec.rb +107 -0
- data/spec/langrove/plugin/persistor_spec.rb +300 -0
- data/spec/langrove/plugin/plugin_base_spec.rb +86 -0
- data/spec/langrove/plugin/yaml_file_spec.rb +348 -0
- data/spec/langrove/protocol/protocol_base_spec.rb +19 -0
- data/spec/langrove/protocol/syslog_spec.rb +5 -2
- data/spec/langrove/root/config_spec.rb +103 -0
- data/spec/langrove/root/root_base_spec.rb +93 -0
- data/spec/langrove/server/server_base_spec.rb +414 -0
- data/spec/spec_helper.rb +38 -0
- metadata +157 -92
- data/.watchr +0 -27
- data/functional/config/boot.rb +0 -64
- data/functional/config/daemons.yml +0 -13
- data/functional/config/environment.rb +0 -28
- data/functional/config/environments/production.rb +0 -0
- data/functional/config/environments/test.rb +0 -0
- data/functional/lib/client/socket_to_file.rb +0 -47
- data/functional/lib/daemon/datagram.rb +0 -21
- data/functional/lib/protocol/socket_to_file.rb +0 -55
- data/functional/libexec/daemon.rb +0 -68
- data/functional/tmp/README +0 -1
- data/lib/langrove/_base.rb +0 -28
- data/lib/langrove/adaptor_base.rb +0 -116
- data/lib/langrove/client/base.rb +0 -2
- data/lib/langrove/client/datagram.rb +0 -25
- data/lib/langrove/client_base.rb +0 -92
- data/lib/langrove/daemon_base.rb +0 -281
- data/lib/langrove/ext/find.rb +0 -90
- data/lib/langrove/ext/persistable.rb +0 -103
- data/lib/langrove/handler_base.rb +0 -148
- data/lib/langrove/job/base.rb +0 -1
- data/lib/langrove/job_base.rb +0 -24
- data/lib/langrove/protocol_base.rb +0 -32
- data/spec/functional/daemon/datagram_spec.rb +0 -121
- data/spec/langrove/adaptor_base_spec.rb +0 -63
- data/spec/langrove/client/datagram_spec.rb +0 -1
- data/spec/langrove/client_base_spec.rb +0 -5
- data/spec/langrove/daemon_base_spec.rb +0 -154
- data/spec/langrove/ext/find_spec.rb +0 -53
- data/spec/langrove/ext/persistable_spec.rb +0 -117
- data/spec/langrove/handler_base_spec.rb +0 -103
- data/spec/langrove/job_base_spec.rb +0 -28
- data/spec/langrove/protocol_base_spec.rb +0 -6
- data/spec/todo_spec.rb +0 -12
- data/tmp/README +0 -2
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
require 'eventmachine'
|
|
2
|
+
|
|
3
|
+
module LanGrove
|
|
4
|
+
|
|
5
|
+
module Adaptor
|
|
6
|
+
|
|
7
|
+
class EventMachineAdaptor < Base
|
|
8
|
+
|
|
9
|
+
def stop
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# OVERRIDE
|
|
13
|
+
#
|
|
14
|
+
# Daemon has been called to stop
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def reload
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# OVERRIDE
|
|
23
|
+
#
|
|
24
|
+
# Daemon has been called to HUP
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def initialize( root, config, deamon_name )
|
|
30
|
+
|
|
31
|
+
super
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def validate_config
|
|
36
|
+
|
|
37
|
+
@type = :event_machine_adaptor
|
|
38
|
+
|
|
39
|
+
@connect = :tcp
|
|
40
|
+
@iface = '127.0.0.1'
|
|
41
|
+
@port = 12701
|
|
42
|
+
|
|
43
|
+
if @config
|
|
44
|
+
|
|
45
|
+
@iface = @config[ :iface ] if @config.has_key? :iface
|
|
46
|
+
@port = @config[ :port ] if @config.has_key? :port
|
|
47
|
+
@connect = @config[ :connect ].to_sym if @config.has_key? :connect
|
|
48
|
+
@soc_opts = @config[ :socket_options ] if @config.has_key? :socket_options
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
unless @soc_opts.nil?
|
|
53
|
+
|
|
54
|
+
unless @soc_opts[ :tls_options ].nil?
|
|
55
|
+
|
|
56
|
+
validate_tls_options( @soc_opts[ :tls_options ] )
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
else
|
|
61
|
+
|
|
62
|
+
@soc_opts = {}
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# Assign the call signature to eventmachine's
|
|
68
|
+
# TCP or UDP servers.
|
|
69
|
+
#
|
|
70
|
+
@em_server_type = case @connect
|
|
71
|
+
|
|
72
|
+
when :tcp
|
|
73
|
+
|
|
74
|
+
:start_server
|
|
75
|
+
|
|
76
|
+
when :udp
|
|
77
|
+
|
|
78
|
+
:open_datagram_socket
|
|
79
|
+
|
|
80
|
+
else
|
|
81
|
+
|
|
82
|
+
:start_server
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def stop_adaptor
|
|
90
|
+
|
|
91
|
+
stop
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def reload_adaptor
|
|
96
|
+
|
|
97
|
+
reload
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def validate_tls_options( options )
|
|
102
|
+
|
|
103
|
+
unless options[ :private_key_file ].nil?
|
|
104
|
+
|
|
105
|
+
options[ :private_key_file ] = path( options[ :private_key_file ] )
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
unless options[ :cert_chain_file ].nil?
|
|
110
|
+
|
|
111
|
+
options[ :cert_chain_file ] = path( options[ :cert_chain_file ] )
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def connector( params, &block )
|
|
118
|
+
|
|
119
|
+
handler = params[ :handler ]
|
|
120
|
+
|
|
121
|
+
handler_class = handler[:class]
|
|
122
|
+
handler_class = @demux.handler unless @demux.nil?
|
|
123
|
+
|
|
124
|
+
@logger.info "Starting listen at #{@connect} #{@iface}:#{@port}"
|
|
125
|
+
|
|
126
|
+
EventMachine::send(
|
|
127
|
+
|
|
128
|
+
@em_server_type,
|
|
129
|
+
@iface,
|
|
130
|
+
@port,
|
|
131
|
+
handler_class,
|
|
132
|
+
@soc_opts
|
|
133
|
+
|
|
134
|
+
) do |connected_handler|
|
|
135
|
+
|
|
136
|
+
yield connected_handler if block
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def path( partial )
|
|
143
|
+
|
|
144
|
+
return "#{DAEMON_ROOT}/#{partial}"
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
module LanGrove
|
|
2
|
+
|
|
3
|
+
module Adaptor
|
|
4
|
+
|
|
5
|
+
class QueryAdaptor < LanGrove::Adaptor::EventMachineAdaptor
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Used to periodically query a datasource,
|
|
9
|
+
# Yields rows as handlers into the daemon's
|
|
10
|
+
# event pipeline
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
def stop
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# OVERRIDE
|
|
17
|
+
#
|
|
18
|
+
# Daemon has been called to stop
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def reload
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# OVERRIDE
|
|
27
|
+
#
|
|
28
|
+
# Daemon has been called to HUP
|
|
29
|
+
#
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def validate_config
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# OVERRIDE
|
|
37
|
+
#
|
|
38
|
+
# To validate implementation specific config
|
|
39
|
+
#
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def connect
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# OVERRIDE
|
|
47
|
+
#
|
|
48
|
+
# To connect to the DataSource
|
|
49
|
+
#
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def running?
|
|
54
|
+
|
|
55
|
+
#
|
|
56
|
+
# OVERRIDE
|
|
57
|
+
#
|
|
58
|
+
# (optional)
|
|
59
|
+
#
|
|
60
|
+
# Because the query may run asyncronously and
|
|
61
|
+
# emply callbacks, this flag should be set so
|
|
62
|
+
# that it can be determined if a query is active
|
|
63
|
+
# in the background.
|
|
64
|
+
#
|
|
65
|
+
# Only required if it is necessary to ensure that
|
|
66
|
+
# never more than 1 concurrent query is running.
|
|
67
|
+
#
|
|
68
|
+
false
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def stop_adaptor
|
|
73
|
+
|
|
74
|
+
stop
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def reload_adaptor
|
|
79
|
+
|
|
80
|
+
reload
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def query( &block )
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# OVERRIDE
|
|
88
|
+
#
|
|
89
|
+
# To perform the query and yield resulting 'rows'
|
|
90
|
+
#
|
|
91
|
+
# - Should yield one hash of key/value pairs
|
|
92
|
+
# per 'row'
|
|
93
|
+
#
|
|
94
|
+
|
|
95
|
+
raise LanGrove::PluginException.new(
|
|
96
|
+
|
|
97
|
+
"#{self.class}.query( ... ) - missing implementation."
|
|
98
|
+
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def initialize( root, config, deamon_name )
|
|
106
|
+
|
|
107
|
+
super
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
# :run_interval:
|
|
111
|
+
#
|
|
112
|
+
# A value in seconds between calling the query.
|
|
113
|
+
#
|
|
114
|
+
# If the previous run is not finished a new run
|
|
115
|
+
# will not start if the running?() method is
|
|
116
|
+
# implemented.
|
|
117
|
+
#
|
|
118
|
+
# The run will be skipped and another :interval:
|
|
119
|
+
# period will pass before the next run is
|
|
120
|
+
# attempted.
|
|
121
|
+
#
|
|
122
|
+
@run_interval = @config[:run_interval]
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
#
|
|
126
|
+
# :run_once:
|
|
127
|
+
#
|
|
128
|
+
# If true will run the query only once and then
|
|
129
|
+
# exit the Daemon.
|
|
130
|
+
#
|
|
131
|
+
@run_once = false
|
|
132
|
+
@run_once = @config[:run_once]
|
|
133
|
+
@done_once = false
|
|
134
|
+
|
|
135
|
+
#
|
|
136
|
+
# :run_immediately:
|
|
137
|
+
#
|
|
138
|
+
# If true (the default) will run the query at Daemon
|
|
139
|
+
# start. Otherwise the run will wait :interval: seconds
|
|
140
|
+
# after daemon start.
|
|
141
|
+
#
|
|
142
|
+
@run_immediately = @config[:run_immediately]
|
|
143
|
+
@run_immediately = true if @run_immediately.nil?
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
config_exception(
|
|
147
|
+
|
|
148
|
+
"#{self.class} requires subconfig with :run_interval:"
|
|
149
|
+
|
|
150
|
+
) if (
|
|
151
|
+
|
|
152
|
+
@run_interval.nil? or
|
|
153
|
+
not @run_interval.is_a?( Integer )
|
|
154
|
+
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
@query = @config[:query]
|
|
158
|
+
|
|
159
|
+
config_exception(
|
|
160
|
+
|
|
161
|
+
"#{self.class} requires :query: subconfig"
|
|
162
|
+
|
|
163
|
+
) if @query.nil?
|
|
164
|
+
|
|
165
|
+
validate_config
|
|
166
|
+
|
|
167
|
+
connect
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def connector( params, &block )
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# Override Handler type if it
|
|
175
|
+
# is the default (Handler::Socket)
|
|
176
|
+
#
|
|
177
|
+
# Does not override if the Handler
|
|
178
|
+
# is user specified.
|
|
179
|
+
#
|
|
180
|
+
if params[:handler][:class] == LanGrove::Handler::Socket
|
|
181
|
+
|
|
182
|
+
params[:handler][:class] = LanGrove::Handler::Base
|
|
183
|
+
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
if @run_immediately
|
|
187
|
+
|
|
188
|
+
do_query( params, &block )
|
|
189
|
+
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
EM.add_periodic_timer( @run_interval ) do
|
|
193
|
+
|
|
194
|
+
do_query( params, &block )
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def do_query( params, &block )
|
|
201
|
+
|
|
202
|
+
if running?
|
|
203
|
+
|
|
204
|
+
@logger.info "#{self.class} already running query"
|
|
205
|
+
|
|
206
|
+
return
|
|
207
|
+
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
if @run_once and @done_once
|
|
211
|
+
|
|
212
|
+
@logger.warn "#{self.class} set to :run_once:"
|
|
213
|
+
Process.kill( 'TERM', Process.pid )
|
|
214
|
+
return
|
|
215
|
+
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
#
|
|
219
|
+
# The query may be long blocking
|
|
220
|
+
# so defer to allow the reactor
|
|
221
|
+
# to proceed
|
|
222
|
+
#
|
|
223
|
+
operation = proc do
|
|
224
|
+
|
|
225
|
+
query do |record|
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# Initialize a new Handler
|
|
229
|
+
#
|
|
230
|
+
handler = params[:handler][:class].new
|
|
231
|
+
|
|
232
|
+
#
|
|
233
|
+
# Yield the handler into the daemon,
|
|
234
|
+
# this will traverse the assignment
|
|
235
|
+
# pipeline resulting in the handler
|
|
236
|
+
# interacting with all configured
|
|
237
|
+
# server behaviours
|
|
238
|
+
#
|
|
239
|
+
yield handler if block
|
|
240
|
+
|
|
241
|
+
#
|
|
242
|
+
# Pass the record in along the 'reveive'
|
|
243
|
+
# along with associated event triggers.
|
|
244
|
+
#
|
|
245
|
+
# (For behaviours)
|
|
246
|
+
#
|
|
247
|
+
@root.trigger( handler, :handler, :receive )
|
|
248
|
+
|
|
249
|
+
handler.receive( record )
|
|
250
|
+
|
|
251
|
+
@root.trigger( handler, :handler, :after_receive )
|
|
252
|
+
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
callback = proc do |result|
|
|
258
|
+
|
|
259
|
+
@done_once = true
|
|
260
|
+
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
EM.defer( operation, callback )
|
|
264
|
+
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
end
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
<pre>
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# behave |verb| ~ a present tense behad
|
|
5
|
+
#
|
|
6
|
+
# eg. The ability to sing was being had,
|
|
7
|
+
#
|
|
8
|
+
# By this one time,
|
|
9
|
+
#
|
|
10
|
+
# At band camp.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
</pre>
|
|
14
|
+
|
|
15
|
+
LanGrove::Behaviour::Base
|
|
16
|
+
=========================
|
|
17
|
+
|
|
18
|
+
Defines the interface between the Daemon's [Primary Components](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove#primary-components) and the [Plugins](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin) that perform the Behaviour specified actions upon them.
|
|
19
|
+
|
|
20
|
+
Behaviour Triggers
|
|
21
|
+
------------------
|
|
22
|
+
|
|
23
|
+
Behaviours are assigned to action at configurable trigger points in each Daemon module's life cycle.
|
|
24
|
+
|
|
25
|
+
### [Server](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/server) Triggers
|
|
26
|
+
|
|
27
|
+
* :server_start
|
|
28
|
+
* :server_stop
|
|
29
|
+
* :server_reload
|
|
30
|
+
|
|
31
|
+
### [Handler](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler) Triggers
|
|
32
|
+
|
|
33
|
+
* :handler_start
|
|
34
|
+
* :handler_stop
|
|
35
|
+
* :handler_reload
|
|
36
|
+
* :handler_connect
|
|
37
|
+
* :handler_after_connect
|
|
38
|
+
* :handler_disconnect
|
|
39
|
+
* :handler_after_disconnect
|
|
40
|
+
* :handler_first_message
|
|
41
|
+
* :hander_receive
|
|
42
|
+
* :handler_after_receive
|
|
43
|
+
* :handler_error
|
|
44
|
+
|
|
45
|
+
### [Adaptor](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/adaptor) Triggers
|
|
46
|
+
|
|
47
|
+
* none
|
|
48
|
+
|
|
49
|
+
### [Protocol](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/protocol) Triggers
|
|
50
|
+
|
|
51
|
+
* none
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
Function
|
|
55
|
+
--------
|
|
56
|
+
|
|
57
|
+
* Behaviour triggers fire via the [Daemon Root](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/root) module.
|
|
58
|
+
* The triggers are called by the Module undergoing the associated event.
|
|
59
|
+
* The call carries reference to the Module
|
|
60
|
+
* The listening behaviour passes the Module reference onward to the [Plugin](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin) configured to perform the action.
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
Configuration
|
|
64
|
+
=============
|
|
65
|
+
|
|
66
|
+
* Behaviours are assigned to triggers in the :server: subconfig branch.
|
|
67
|
+
* Behaviours are assigned a [Plugin](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
Behaviours
|
|
71
|
+
----------
|
|
72
|
+
|
|
73
|
+
### Persistable
|
|
74
|
+
|
|
75
|
+
Requires a [Persistor](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin#persistor) Plugin
|
|
76
|
+
|
|
77
|
+
Creates the ability to store and fetch the contents of the [Handler's Capsule](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#the-capsule)
|
|
78
|
+
|
|
79
|
+
<pre>
|
|
80
|
+
|
|
81
|
+
:plugins:
|
|
82
|
+
:save_my_handler_state:
|
|
83
|
+
:class: ...
|
|
84
|
+
...
|
|
85
|
+
...
|
|
86
|
+
|
|
87
|
+
:daemons:
|
|
88
|
+
:my_daemon
|
|
89
|
+
...
|
|
90
|
+
...
|
|
91
|
+
:server:
|
|
92
|
+
:behaviours:
|
|
93
|
+
:persistable:
|
|
94
|
+
:plugin: :save_my_handler_state
|
|
95
|
+
:at:
|
|
96
|
+
:handler_after_receive:
|
|
97
|
+
:handler_disconnect:
|
|
98
|
+
...
|
|
99
|
+
...
|
|
100
|
+
|
|
101
|
+
</pre>
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
### Preloadable
|
|
105
|
+
|
|
106
|
+
Requires a [Persistor](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin#persistor) Plugin
|
|
107
|
+
|
|
108
|
+
Currently only works with a [Multiplexing Socket Handler](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#socket-multiplexer)
|
|
109
|
+
|
|
110
|
+
Creates the ability to fetch all previously persisted [Handler Capsules](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#the-capsule) ahead of goind to listen on the socket.
|
|
111
|
+
|
|
112
|
+
<pre>
|
|
113
|
+
|
|
114
|
+
:plugins:
|
|
115
|
+
:my_persistor:
|
|
116
|
+
:class: ...
|
|
117
|
+
...
|
|
118
|
+
...
|
|
119
|
+
|
|
120
|
+
:daemons:
|
|
121
|
+
:my_daemon
|
|
122
|
+
...
|
|
123
|
+
:handler:
|
|
124
|
+
:class: SocketMultiplexer
|
|
125
|
+
:proxy_by: :unique_thing
|
|
126
|
+
:proxy_to:
|
|
127
|
+
:handler:
|
|
128
|
+
:class: ...
|
|
129
|
+
|
|
130
|
+
...
|
|
131
|
+
:server:
|
|
132
|
+
:behaviours:
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# acts on the nested handler
|
|
136
|
+
# to store each handler after a modification
|
|
137
|
+
#
|
|
138
|
+
:persistable:
|
|
139
|
+
:plugin: :my_persistor
|
|
140
|
+
:at:
|
|
141
|
+
:handler_afer_receive
|
|
142
|
+
|
|
143
|
+
#
|
|
144
|
+
# acts on the multiplexer
|
|
145
|
+
# to reload all handler's state at daemon start
|
|
146
|
+
#
|
|
147
|
+
:preloadable:
|
|
148
|
+
:plugin: :my_persistor
|
|
149
|
+
:at:
|
|
150
|
+
:multiplexer_start:
|
|
151
|
+
...
|
|
152
|
+
...
|
|
153
|
+
|
|
154
|
+
</pre>
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
### Enqueueable
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
Requires an [Enqueuer](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin#enqueuer) Plugin
|
|
161
|
+
|
|
162
|
+
Enqueues a Job onto a specified Queue with the [Handler's Capsule](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#the-capsule) as payload.
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
<pre>
|
|
167
|
+
|
|
168
|
+
...pending: config...
|
|
169
|
+
|
|
170
|
+
</pre>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
ASSESSABLE_VERSION = 0
|
|
2
|
+
|
|
3
|
+
module LanGrove
|
|
4
|
+
|
|
5
|
+
module Behaviour
|
|
6
|
+
|
|
7
|
+
class Assessable < Base
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Assessable provides a second persistance for a 'previous' capsule,
|
|
11
|
+
# with a built in DELTA detector.
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
def initialize( root, config, name )
|
|
15
|
+
|
|
16
|
+
@requires = {
|
|
17
|
+
|
|
18
|
+
#
|
|
19
|
+
# The Assessor plugin should contain an embedded Persistor plugin.
|
|
20
|
+
#
|
|
21
|
+
:assessor => {
|
|
22
|
+
|
|
23
|
+
:actions => [
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Assessor should implement:
|
|
27
|
+
#
|
|
28
|
+
# (In addition to having access to store() and fetch() from
|
|
29
|
+
# the nested Persistor)
|
|
30
|
+
#
|
|
31
|
+
# <Plugin>.assess( handler )
|
|
32
|
+
#
|
|
33
|
+
# - Should use the handler.key to collect from a
|
|
34
|
+
# second persistance the 'previous' capsule
|
|
35
|
+
# contents and - upon comparison with the supplied
|
|
36
|
+
# handler.capsule (the latest)
|
|
37
|
+
#
|
|
38
|
+
# -- emit Notifications on each DELTA
|
|
39
|
+
# -- store the new capsule as the 'new previous'
|
|
40
|
+
#
|
|
41
|
+
# - Success assumed.
|
|
42
|
+
#
|
|
43
|
+
# - (on failure) Should THROW
|
|
44
|
+
#
|
|
45
|
+
:assess
|
|
46
|
+
|
|
47
|
+
],
|
|
48
|
+
|
|
49
|
+
:version => ASSESSABLE_VERSION
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
} if @requires.nil?
|
|
54
|
+
|
|
55
|
+
super
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module LanGrove
|
|
2
|
+
|
|
3
|
+
module Behaviour
|
|
4
|
+
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
require 'langrove/behaviour/behaviour_base'
|
|
10
|
+
|
|
11
|
+
require 'langrove/behaviour/persistable'
|
|
12
|
+
require 'langrove/behaviour/enqueueable'
|
|
13
|
+
require 'langrove/behaviour/preloadable'
|
|
14
|
+
require 'langrove/behaviour/assessable'
|
|
15
|
+
require 'langrove/behaviour/notifiable'
|
|
16
|
+
#require 'langrove/behaviour/terminatable'
|