smith 0.6.7 → 0.6.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ac264c23960916b555109d48e592a8560447182f
4
- data.tar.gz: 424cd6d244fbdce54cffce746aeb4f81635515e8
3
+ metadata.gz: 611c4332fcd1fcb21d1cb27a7792a4d2fb995454
4
+ data.tar.gz: f011eccef4892c74c23f1b37d717a5b3ad1f02e6
5
5
  SHA512:
6
- metadata.gz: 9e73b594b540c6d136a5e9ed783531aa378603b28a0f1caa408e40a0f412d7583437b42b21fbcb14ec7566a6f339183a20f5dc51b7e823ea8970dd5ff8b98ff9
7
- data.tar.gz: 894a371746a71b6af111614db36c5a6f9f58e6f070f2bbb2b1e16f6eba97904d16f1fd334e56ea335bd4058de372adff0b7123c4365eb8b1dfd206a750d3cfc0
6
+ metadata.gz: bb5a684361c835dadcd48020ec179739196535db0574c53c9cbd1268234947a356dcfa90788d8cb68288b3dd090e7028ff8b008d2017497f68fa913c18fca207
7
+ data.tar.gz: 1a0503cf8910994d9ae66865857aedf74b54e54aec1e390ba5c6c315084b8bfdf19e91d2694fa94a74cfe1bca53c3550a6ab82f9bab23fa7c01048fb3a84f3f4
data/bin/agency CHANGED
@@ -32,13 +32,6 @@ module Smith
32
32
  logger.info { "Shutting down" }
33
33
  end
34
34
 
35
- # Setup signal handlers to clean up.
36
- %w{TERM INT QUIT}.each do |sig|
37
- trap sig, proc {
38
- logger.info { "Shutting down" }
39
- @agency.stop
40
- }
41
- end
42
35
  end
43
36
 
44
37
  def run
@@ -49,6 +42,14 @@ module Smith
49
42
 
50
43
  Smith.compile_acls
51
44
  Smith.start do
45
+
46
+ signal_handler = SelfPipe.new(self)
47
+ # Setup signal handlers to clean up.
48
+
49
+ %w{TERM INT QUIT}.each do |sig|
50
+ signal_handler.install_signal_handler(sig) { @agency.stop }
51
+ end
52
+
52
53
  # This block is here so the that the shutdown hook added in
53
54
  # Smith.start runs last. Yes I know this is leaky but that's how
54
55
  # it is at the moment.
data/bin/smithctl CHANGED
@@ -94,6 +94,14 @@ Usage:
94
94
  control = SmithControl.new(opts)
95
95
 
96
96
  Smith.start do
97
+
98
+ signal_handler = SelfPipe.new(self)
99
+ # Setup signal handlers to clean up.
100
+
101
+ %w{TERM INT QUIT}.each do |sig|
102
+ signal_handler.install_signal_handler(sig) { @agency.stop }
103
+ end
104
+
97
105
  control.send_command(command, args) do |result|
98
106
  puts result if result && !result.empty?
99
107
  Smith.stop(true)
data/lib/smith.rb CHANGED
@@ -209,6 +209,7 @@ module Smith
209
209
  end
210
210
 
211
211
  require 'smith/utils'
212
+ require 'smith/self_pipe'
212
213
  require 'smith/amqp_errors'
213
214
  require 'smith/object_count'
214
215
  require 'smith/cache'
data/lib/smith/agent.rb CHANGED
@@ -15,7 +15,8 @@ module Smith
15
15
 
16
16
  @factory = QueueFactory.new
17
17
 
18
- setup_signal_handlers
18
+ @signal_handler = SelfPipe.new(self)
19
+
19
20
  setup_control_queue
20
21
 
21
22
  @start_time = Time.now
@@ -25,6 +26,7 @@ module Smith
25
26
  @on_stopping = proc {|completion| completion.succeed }
26
27
  @on_starting = proc {|completion| completion.succeed }
27
28
  @on_running = proc {|completion| completion.succeed }
29
+ @on_exception = proc {}
28
30
 
29
31
  @on_starting_completion = EM::Completion.new.tap do |c|
30
32
  c.completion do |completion|
@@ -67,50 +69,27 @@ module Smith
67
69
  @on_running = blk
68
70
  end
69
71
 
72
+ # The agent may hook into this if they want to do something on exception.
73
+ # It should be noted that, since an exception occured, the reactor will not
74
+ # be running at this point. Even if we restarted the reactor before calling
75
+ # this it would be a different reactor than existed when assigning the
76
+ # block so this would potentially lead to confusion. If the agent really
77
+ # needs the reactor to do something it can always restart the reactor
78
+ # itself.
79
+ #
80
+ # @param blk [Block] This block will be passed the exception as an
81
+ # argument.
82
+ def on_exception(&blk)
83
+ @on_exception = blk
84
+ end
85
+
70
86
  # Override this method to implement your own agent.
71
87
  def run
72
88
  raise ArgumentError, "You must override this method"
73
89
  end
74
90
 
75
- # Set up the mechanics required to implement the self pipe trick.
76
- def setup_signal_handlers
77
- @signal_handlers = Hash.new { |h,k| h[k] = Array.new }
78
- @signal_handler_queue = []
79
- @signal_handler_pipe_reader, @signal_handler_pipe_writer = IO.pipe
80
-
81
- # The Module declaration here will only close over local variables so we
82
- # need to assign self to a local variable to get access to the agent itself.
83
- agent = self
84
-
85
- EM.attach(@signal_handler_pipe_reader, Module.new {
86
- define_method :receive_data do |_|
87
-
88
- handlers = agent.instance_variable_get(:@signal_handlers)
89
- queue = agent.instance_variable_get(:@signal_handler_queue)
90
- signal = queue.pop
91
-
92
- # agent.send(:logger).debug { "Running signal handlers for agent: #{agent.name}: #{signal}" }
93
- handlers[signal].each { |handler| handler.call(signal) }
94
- end
95
- })
96
- end
97
-
98
- # Adds a signal handler proc to the list of signal_handlers. When
99
- # a signal is received all signal handlers are called in reverse order.
100
- # @param signal [Integer] the signal number.
101
- # @param position [Symbol] [:first|:last] where on the signal handler stack
102
- # to put the handler proc.
103
- # @see Signal.list for a full list of available signals on a system.
104
91
  def install_signal_handler(signal, position=:end, &blk)
105
- raise ArgumentError, "Unknown position: #{position}" if ![:beginning, :end].include?(position)
106
- logger.debug { "Installing signal handler for #{signal}" }
107
-
108
- @signal_handlers[signal].insert((position == :beginning) ? 0 : -1, blk)
109
-
110
- Signal.trap(signal) {
111
- @signal_handler_pipe_writer.write_nonblock('.')
112
- @signal_handler_queue << signal
113
- }
92
+ @signal_handler.install_signal_handler(signal, position=:end, &blk)
114
93
  end
115
94
 
116
95
  def state
@@ -239,5 +218,9 @@ module Smith
239
218
  def control_queue_def
240
219
  @control_queue_def ||= QueueDefinitions::Agent_control.call(uuid)
241
220
  end
221
+
222
+ def __exception_handler(exception)
223
+ @on_exception.call(exception)
224
+ end
242
225
  end
243
226
  end
@@ -65,7 +65,9 @@ module Smith
65
65
  # be running. So it must be restarted and then shutdown again
66
66
  # See the note at the in main.
67
67
  def terminate!(exception=nil)
68
- logger.error { format_exception(exception) } if exception
68
+
69
+ @agent.__send__(:__exception_handler, exception)
70
+ logger.error { format_exception(exception) }
69
71
  logger.error { "Terminating: #{@agent_uuid}." }
70
72
 
71
73
  if Smith.running?
@@ -1,7 +1,13 @@
1
1
  # -*- encoding: utf-8 -*-
2
+
3
+ require_relative '../common'
4
+
2
5
  module Smith
3
6
  module Commands
4
7
  class List < CommandBase
8
+
9
+ include Common
10
+
5
11
  def execute
6
12
  if target.size > 0
7
13
  selected_agents = agents.find_by_name(target)
@@ -9,6 +15,11 @@ module Smith
9
15
  selected_agents = (options[:all]) ? agents.to_a : agents.state(:running)
10
16
  end
11
17
 
18
+ if options[:group]
19
+ group_names = agent_group(options[:group])
20
+ selected_agents = selected_agents.select { |a| group_names.include?(a.name) }
21
+ end
22
+
12
23
  responder.succeed((selected_agents.empty?) ? '' : format(selected_agents, options[:long]))
13
24
  end
14
25
 
@@ -51,6 +62,7 @@ module Smith
51
62
  banner "List the running agents."
52
63
 
53
64
  opt :long, "the number of times to send the message", :short => :l
65
+ opt :group, "list only agents in this group", :type => :string, :short => :g
54
66
  opt :one_column, "the number of times to send the message", :short => :s
55
67
  opt :all, "show all agents in all states", :short => :a
56
68
 
@@ -0,0 +1,55 @@
1
+ module Smith
2
+ class SelfPipe
3
+
4
+ include Smith::Logger
5
+
6
+ def initialize(agent)
7
+ @agent = agent
8
+
9
+ @signal_handlers = Hash.new { |h,k| h[k] = Array.new }
10
+ @signal_handler_queue = []
11
+ @signal_handler_pipe_reader, @signal_handler_pipe_writer = IO.pipe
12
+
13
+ setup_signal_handlers
14
+ end
15
+
16
+ # Adds a signal handler proc to the list of signal_handlers. When
17
+ # a signal is received all signal handlers are called in reverse order.
18
+ #
19
+ # @param signal [Integer] the signal number.
20
+ # @param position [Symbol] [:first|:last] where on the signal handler stack
21
+ # to put the handler proc.
22
+ #
23
+ # @see Signal.list for a full list of available signals on a system.
24
+ def install_signal_handler(signal, position=:end, &blk)
25
+ raise ArgumentError, "Unknown position: #{position}" if ![:beginning, :end].include?(position)
26
+ logger.debug { "Installing signal handler for #{signal}" }
27
+
28
+ @signal_handlers[signal].insert((position == :beginning) ? 0 : -1, blk)
29
+
30
+ Signal.trap(signal) {
31
+ @signal_handler_pipe_writer.write_nonblock('.')
32
+ @signal_handler_queue << signal
33
+ }
34
+ end
35
+
36
+ # Set up the mechanics required to implement the self pipe trick.
37
+ def setup_signal_handlers
38
+ # The Module declaration here will only close over local variables so we
39
+ # need to assign self to a local variable to get access to the agent itself.
40
+ clazz = self
41
+
42
+ EM.attach(@signal_handler_pipe_reader, Module.new {
43
+ define_method :receive_data do |_|
44
+
45
+ handlers = clazz.instance_variable_get(:@signal_handlers)
46
+ queue = clazz.instance_variable_get(:@signal_handler_queue)
47
+ signal = queue.pop
48
+
49
+ clazz.send(:logger).debug { "Running signal handlers for: #{signal}" }
50
+ handlers[signal].each { |handler| handler.call(signal) }
51
+ end
52
+ })
53
+ end
54
+ end
55
+ end
data/lib/smith/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Smith
2
- VERSION = "0.6.7"
2
+ VERSION = "0.6.9"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.7
4
+ version: 0.6.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Heycock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-30 00:00:00.000000000 Z
11
+ date: 2015-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -254,6 +254,7 @@ files:
254
254
  - lib/smith/messaging/util.rb
255
255
  - lib/smith/object_count.rb
256
256
  - lib/smith/queue_definitions.rb
257
+ - lib/smith/self_pipe.rb
257
258
  - lib/smith/utils.rb
258
259
  - lib/smith/version.rb
259
260
  homepage: http://github.com/filterfish/smith2
@@ -276,9 +277,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
276
277
  version: '0'
277
278
  requirements: []
278
279
  rubyforge_project: smith
279
- rubygems_version: 2.2.2
280
+ rubygems_version: 2.4.5
280
281
  signing_key:
281
282
  specification_version: 4
282
283
  summary: Multi-agent framework
283
284
  test_files: []
284
- has_rdoc: false