smith 0.6.1 → 0.6.2

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: 95209344632520fac5a790a8efa4cfd91a52ddb2
4
- data.tar.gz: 562bb8a1c8bd5371fdf3d74765f8c069b88f0fa0
3
+ metadata.gz: 9812b89c515ed71a2291f67b53a4c40c519f2afa
4
+ data.tar.gz: 76b9705aa9b00595d735750b240a594f7bedf79d
5
5
  SHA512:
6
- metadata.gz: 2a8202bf141e34265c7254ba6dfef92d7798b8d6bd9ff7b0bc903060a27d11d86d38ba8f1b1be7aede80932f10eee31f1fd21cdb1d22655e1ffc212b039543c2
7
- data.tar.gz: a5e5d205a49c1fd10ada42bf317fe17bde5cf12d375746133b909ea87892ecd7b35462f6b6c9cb8e8267872503799a8ee99ab6acaa921cac287221369d383718
6
+ metadata.gz: efb0730d32b544d91a744fa37f714222d073f19bb94b5474f5e21f8399f5a88ee2e5ba6d8d422691a5a6c1db9d2889ef0674bd48128b683d27eaf2f63f2cad88
7
+ data.tar.gz: 347b181a6d0980241797c67501ae4c42aa2a479f51577a5e41d5786de4099f6771a44bd695a7972acdca3c6fcfc45b96cf05376dcc0cbe2f7891faf6d105326a
data/bin/smithctl CHANGED
@@ -39,7 +39,7 @@ module Smith
39
39
 
40
40
  def agency_command(command, args, &blk)
41
41
  Messaging::Sender.new(QueueDefinitions::Agency_control) do |sender|
42
- sender.on_timeout(5) { |message_id| blk.call("Timeout. Is the agency still running?") }
42
+ sender.on_timeout(@timeout) { |message_id| blk.call("Timeout. Is the agency still running?") }
43
43
 
44
44
  sender.on_reply(:auto_ack => true) do |reply_payload, r|
45
45
  blk.call(reply_payload[:response])
data/lib/smith.rb CHANGED
@@ -75,6 +75,7 @@ module Smith
75
75
  end
76
76
 
77
77
  def start(opts={}, &block)
78
+
78
79
  if EM.epoll? && Smith.config.eventmachine.epoll
79
80
  logger.debug { "Using epoll for I/O event notification." }
80
81
  EM.epoll
@@ -95,33 +96,27 @@ module Smith
95
96
  @connection = connection
96
97
 
97
98
  connection.on_connection do
98
- broker = connection.broker.properties
99
- endpoint = connection.broker_endpoint
100
- logger.info { "Connected to: AMQP Broker: #{endpoint}, (#{broker['product']}/v#{broker['version']})" } unless opts[:quiet]
99
+ logger.info { "Connected to: AMQP Broker: #{broker_identifier(connection)}" } unless opts[:quiet]
101
100
  end
102
101
 
102
+ # FIXME This should go in the config.
103
+ reconnection_delay = 5
104
+
103
105
  connection.on_tcp_connection_loss do |connection, settings|
104
- EM.next_tick do
105
- logger.error { "TCP connection error. Attempting restart" }
106
- connection.reconnect
107
- end
106
+ logger.info { "Reconnecting to AMQP Broker: #{broker_identifier(connection)} in #{reconnection_delay}s" }
107
+ connection.reconnect(false, reconnection_delay)
108
108
  end
109
109
 
110
- connection.after_recovery do
111
- logger.info { "Connection to AMQP server restored" }
110
+ connection.after_recovery do |connection|
111
+ logger.info { "Connection with AMQP Broker restored: #{broker_identifier(connection)}" } unless opts[:quiet]
112
112
  end
113
113
 
114
114
  connection.on_error do |connection, connection_close|
115
- case connection_close.reply_code
116
- when 320
117
- logger.warn { "AMQP server shutdown. Waiting." }
115
+ # If the broker is gracefully shutdown we get a 320. Log a nice message.
116
+ if connection_close.reply_code == 320
117
+ logger.warn { "AMQP Broker shutdown: #{broker_identifier(connection)}" }
118
118
  else
119
- if @handler
120
- @handler.call(connection, reason)
121
- else
122
- logger.error { "AMQP Server error: #{connection_close.reply_code}: #{connection_close.reply_text}" }
123
- EM.stop_event_loop
124
- end
119
+ logger.warn { connection_close.reply_text }
125
120
  end
126
121
  end
127
122
 
@@ -190,6 +185,11 @@ module Smith
190
185
  end
191
186
  end
192
187
 
188
+ def broker_identifier(connection)
189
+ broker = connection.broker.properties
190
+ "#{connection.broker_endpoint}, (#{broker['product']}/v#{broker['version']})"
191
+ end
192
+
193
193
  def check_path(path, create=false)
194
194
  unless path.exist?
195
195
  error_message = "Path does not exist: #{path}"
@@ -26,7 +26,7 @@ module Smith
26
26
  end
27
27
 
28
28
  def long_format(a)
29
- a.map do |a|
29
+ a.sort { |a, b| a.name <=> b.name }.map do |a|
30
30
  [a.state, a.uuid, a.pid, (a.started_at) ? format_time(a.started_at) : '', (!(a.stopped? || a.null?) && !a.alive?) ? '(agent dead)' : "", a.name]
31
31
  end
32
32
  end
@@ -4,14 +4,21 @@ module Smith
4
4
  module Commands
5
5
  class Firehose < CommandBase
6
6
  def execute
7
- queue_name = target.first
7
+ queue_name = target.first || '#'
8
8
  AMQP::Channel.new(Smith.connection) do |channel,ok|
9
9
  channel.topic('amq.rabbitmq.trace', :durable => true) do |exchange|
10
10
  channel.queue('smith.firehose', :durable => true) do |queue|
11
- queue.bind(exchange, :routing_key => "publish.#{Smith.config.smith.namespace}.#{queue_name}").subscribe do |m,p|
12
- clazz = @acl_type_cache.get_by_hash(m.headers['properties']['type'])
13
- message = clazz.new.parse_from_string(data)
14
- puts (options[:json_given]) ? message.to_json : message.inspect
11
+ if correct_direction?
12
+ routing_key = "#{options[:direction]}.#{Smith.config.smith.namespace}.#{queue_name}"
13
+
14
+ queue.bind(exchange, :routing_key => routing_key).subscribe do |m, payload|
15
+ acl_type_cache = AclTypeCache.instance
16
+ clazz = acl_type_cache.get_by_hash(m.headers['properties']['type'])
17
+ message = {options[:direction] => clazz.new.parse_from_string(payload)}
18
+ puts (options[:json_given]) ? message.to_json : message.inspect
19
+ end
20
+ else
21
+ responder.succeed("--direction must be either deliver or publish")
15
22
  end
16
23
  end
17
24
  end
@@ -24,7 +31,12 @@ module Smith
24
31
  " You _must_ run 'rabbitmqctl trace_on' for this to work."]
25
32
  banner b.join("\n")
26
33
 
27
- opt :json , "return the JSON representation of the message", :short => :j
34
+ opt :json, "return the JSON representation of the message", :short => :j
35
+ opt :direction, "Show messages that are leaving the broker [deliver|publish]", :short => :d, :type => :string, :default => 'deliver'
36
+ end
37
+
38
+ def correct_direction?
39
+ options[:direction] == 'deliver' || options[:direction] == 'publish'
28
40
  end
29
41
  end
30
42
  end
data/lib/smith/config.rb CHANGED
@@ -149,7 +149,7 @@ module Smith
149
149
  if conf.exist?
150
150
  return conf
151
151
  else
152
- if path == Pathname.new(ENV['HOME'])
152
+ if path == Pathname.new(ENV['HOME']) || path.root?
153
153
  raise ConfigNotFoundError, "Cannot find a usable config file."
154
154
  end
155
155
  find_config_file(path.dirname)
data/lib/smith/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Smith
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Heycock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-30 00:00:00.000000000 Z
11
+ date: 2014-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amqp
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: daemons
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.1.4
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.1.4
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: eventmachine
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
  - !ruby/object:Gem::Dependency
56
56
  name: extlib
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.9.15
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.9.15
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: logging
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: 1.6.1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.6.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: protobuf
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - '='
88
88
  - !ruby/object:Gem::Version
89
89
  version: 2.7.7
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - '='
95
95
  - !ruby/object:Gem::Version
96
96
  version: 2.7.7
97
97
  - !ruby/object:Gem::Dependency
@@ -112,70 +112,70 @@ dependencies:
112
112
  name: trollop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: 1.16.2
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.16.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: multi_json
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: 1.3.2
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: 1.3.2
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: ruby_parser
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - '>='
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: 3.2.2
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - '>='
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: 3.2.2
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: tdb
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - '>='
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - '>='
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: murmurhash3
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - '>='
171
+ - - ">="
172
172
  - !ruby/object:Gem::Version
173
173
  version: '0'
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - '>='
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  description: Simple multi-agent framework. It uses AMQP for it's messaging layer.
@@ -195,22 +195,22 @@ files:
195
195
  - lib/smith/commands/agency/metadata.rb
196
196
  - lib/smith/commands/agency/version.rb
197
197
  - lib/smith/commands/agency/kill.rb
198
- - lib/smith/commands/agency/list.rb
199
- - lib/smith/commands/agency/logger.rb
200
198
  - lib/smith/commands/agency/object_count.rb
201
199
  - lib/smith/commands/agency/restart.rb
202
200
  - lib/smith/commands/agency/start.rb
203
201
  - lib/smith/commands/agency/stop.rb
202
+ - lib/smith/commands/agency/logger.rb
203
+ - lib/smith/commands/agency/list.rb
204
204
  - lib/smith/commands/smithctl/commands.rb
205
205
  - lib/smith/commands/smithctl/pop.rb
206
206
  - lib/smith/commands/smithctl/rm.rb
207
207
  - lib/smith/commands/smithctl/subscribe.rb
208
208
  - lib/smith/commands/smithctl/acl.rb
209
209
  - lib/smith/commands/smithctl/dump.rb
210
- - lib/smith/commands/smithctl/firehose.rb
211
210
  - lib/smith/commands/smithctl/push.rb
212
211
  - lib/smith/commands/smithctl/status.rb
213
212
  - lib/smith/commands/smithctl/top.rb
213
+ - lib/smith/commands/smithctl/firehose.rb
214
214
  - lib/smith/commands/template.rb
215
215
  - lib/smith/commands/common.rb
216
216
  - lib/smith/messaging/acl/agent_command.proto
@@ -226,36 +226,37 @@ files:
226
226
  - lib/smith/messaging/amqp_options.rb
227
227
  - lib/smith/messaging/message_counter.rb
228
228
  - lib/smith/messaging/queue_factory.rb
229
- - lib/smith/messaging/acl_type_cache.rb
230
229
  - lib/smith/messaging/factory.rb
231
230
  - lib/smith/messaging/queue.rb
231
+ - lib/smith/messaging/requeue.rb
232
+ - lib/smith/messaging/util.rb
233
+ - lib/smith/messaging/acl_type_cache.rb
232
234
  - lib/smith/messaging/queue_definition.rb
233
235
  - lib/smith/messaging/receiver.rb
234
- - lib/smith/messaging/requeue.rb
235
236
  - lib/smith/messaging/sender.rb
236
- - lib/smith/messaging/util.rb
237
237
  - lib/smith/agent_config.rb
238
238
  - lib/smith/object_count.rb
239
239
  - lib/smith/amqp_errors.rb
240
240
  - lib/smith/command_base.rb
241
- - lib/smith/acl_compiler.rb
241
+ - lib/smith/bootstrap.rb
242
+ - lib/smith/config.rb
243
+ - lib/smith/queue_definitions.rb
242
244
  - lib/smith/acl_parser.rb
243
245
  - lib/smith/agent.rb
244
246
  - lib/smith/agent_cache.rb
245
247
  - lib/smith/agent_monitoring.rb
246
248
  - lib/smith/agent_process.rb
247
- - lib/smith/bootstrap.rb
248
249
  - lib/smith/cache.rb
249
- - lib/smith/command.rb
250
- - lib/smith/config.rb
251
- - lib/smith/daemon.rb
252
250
  - lib/smith/exceptions.rb
253
251
  - lib/smith/logger.rb
254
- - lib/smith/queue_definitions.rb
252
+ - lib/smith/acl_compiler.rb
253
+ - lib/smith/command.rb
254
+ - lib/smith/daemon.rb
255
255
  - lib/smith/version.rb
256
256
  - lib/smith.rb
257
257
  homepage: http://github.com/filterfish/smith2
258
- licenses: []
258
+ licenses:
259
+ - GPL-3
259
260
  metadata: {}
260
261
  post_install_message:
261
262
  rdoc_options: []
@@ -263,12 +264,12 @@ require_paths:
263
264
  - lib
264
265
  required_ruby_version: !ruby/object:Gem::Requirement
265
266
  requirements:
266
- - - '>='
267
+ - - ">="
267
268
  - !ruby/object:Gem::Version
268
269
  version: '0'
269
270
  required_rubygems_version: !ruby/object:Gem::Requirement
270
271
  requirements:
271
- - - '>='
272
+ - - ">="
272
273
  - !ruby/object:Gem::Version
273
274
  version: '0'
274
275
  requirements: []