nanite 0.4.1.14 → 0.4.1.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -40,7 +40,7 @@ require 'nanite/security/static_certificate_store'
40
40
  require 'nanite/serializer'
41
41
 
42
42
  module Nanite
43
- VERSION = '0.4.1.14' unless defined?(Nanite::VERSION)
43
+ VERSION = '0.4.1.15' unless defined?(Nanite::VERSION)
44
44
 
45
45
  class MapperNotRunning < StandardError; end
46
46
 
@@ -67,7 +67,7 @@ module Nanite
67
67
  old_target = request.target
68
68
  request.target = target unless target == 'mapper-offline'
69
69
  Nanite::Log.debug("SEND #{request.to_s([:from, :tags, :target])}")
70
- amq.queue(target).publish(serializer.dump(request), :persistent => request.persistent)
70
+ amq.queue(target).publish(serializer.dump(request, enforce_format?(target)), :persistent => request.persistent)
71
71
  ensure
72
72
  request.target = old_target
73
73
  end
@@ -75,6 +75,10 @@ module Nanite
75
75
 
76
76
  protected
77
77
 
78
+ def enforce_format?(target)
79
+ target == 'mapper-offline' ? :insecure : nil
80
+ end
81
+
78
82
  # updates nanite information (last ping timestamps, status)
79
83
  # when heartbeat message is received
80
84
  def handle_ping(ping)
@@ -121,20 +121,13 @@ module Nanite
121
121
  @options[:log_path] = (@options[:log_dir] || @options[:root] || Dir.pwd)
122
122
  end
123
123
  @options.freeze
124
+ @offline_queue = 'mapper-offline'
124
125
  end
125
126
 
126
127
  def run
127
128
  setup_logging
128
129
  @serializer = Serializer.new(@options[:format])
129
- pid_file = PidFile.new(@identity, @options)
130
- pid_file.check
131
- if @options[:daemonize]
132
- daemonize(@identity, @options)
133
- pid_file.write
134
- at_exit { pid_file.remove }
135
- else
136
- trap("INT") {exit}
137
- end
130
+ setup_process
138
131
  @amq = start_amqp(@options)
139
132
  @job_warden = JobWarden.new(@serializer)
140
133
  setup_cluster
@@ -195,9 +188,9 @@ module Nanite
195
188
  job = job_warden.new_job(request, targets, intm_handler, blk)
196
189
  cluster.route(request, job.targets)
197
190
  job
198
- elsif opts.key?(:offline_failsafe) ? opts[:offline_failsafe] : options[:offline_failsafe]
191
+ elsif offline_failsafe?(opts)
199
192
  job_warden.new_job(request, [], intm_handler, blk)
200
- cluster.publish(request, 'mapper-offline')
193
+ cluster.publish(request, @offline_queue)
201
194
  :offline
202
195
  else
203
196
  false
@@ -234,14 +227,18 @@ module Nanite
234
227
  if !targets.empty?
235
228
  cluster.route(push, targets)
236
229
  true
237
- elsif opts.key?(:offline_failsafe) ? opts[:offline_failsafe] : options[:offline_failsafe]
238
- cluster.publish(push, 'mapper-offline')
230
+ elsif offline_failsafe?(opts)
231
+ cluster.publish(push, @offline_queue)
239
232
  :offline
240
233
  else
241
234
  false
242
235
  end
243
236
  end
244
237
 
238
+ def offline_failsafe?(opts)
239
+ opts.key?(:offline_failsafe) ? opts[:offline_failsafe] : options[:offline_failsafe]
240
+ end
241
+
245
242
  private
246
243
 
247
244
  def build_deliverable(deliverable_type, type, payload, opts)
@@ -262,11 +259,12 @@ module Nanite
262
259
  end
263
260
 
264
261
  def setup_offline_queue
265
- offline_queue = amq.queue('mapper-offline', :durable => true)
262
+ offline_queue = amq.queue(@offline_queue, :durable => true)
266
263
  offline_queue.subscribe(:ack => true) do |info, deliverable|
267
- deliverable = serializer.load(deliverable)
264
+ deliverable = serializer.load(deliverable, :insecure)
268
265
  targets = cluster.targets_for(deliverable)
269
266
  unless targets.empty?
267
+ Nanite::Log.debug("Recovering message from offline queue: #{deliverable.to_s([:from, :tags, :target])}")
270
268
  info.ack
271
269
  if deliverable.kind_of?(Request)
272
270
  if job = job_warden.jobs[deliverable.token]
@@ -303,6 +301,18 @@ module Nanite
303
301
  def setup_cluster
304
302
  @cluster = Cluster.new(@amq, @options[:agent_timeout], @options[:identity], @serializer, self, @options[:redis], @options[:callbacks])
305
303
  end
304
+
305
+ def setup_process
306
+ pid_file = PidFile.new(@identity, @options)
307
+ pid_file.check
308
+ if @options[:daemonize]
309
+ daemonize(@identity, @options)
310
+ pid_file.write
311
+ at_exit { pid_file.remove }
312
+ else
313
+ trap("INT") {exit}
314
+ end
315
+ end
306
316
  end
307
317
  end
308
318
 
@@ -1,4 +1,4 @@
1
- if defined?(OpenSSL::PKCS7::PKCS7)
1
+ if RUBY_VERSION < '1.8.7'
2
2
  Nanite::PKCS7 = OpenSSL::PKCS7::PKCS7
3
3
  else
4
4
  Nanite::PKCS7 = OpenSSL::PKCS7
@@ -1,6 +1,9 @@
1
1
  module Nanite
2
2
  class Serializer
3
+ SERIALIZERS = {:json => JSON, :marshal => Marshal, :yaml => YAML}.freeze
3
4
 
5
+ attr_reader :preferred_format
6
+
4
7
  class SerializationError < StandardError
5
8
  attr_accessor :action, :packet
6
9
  def initialize(action, packet, serializers, msg = nil)
@@ -11,42 +14,52 @@ module Nanite
11
14
  end # SerializationError
12
15
 
13
16
  # The secure serializer should not be part of the cascading
14
- def initialize(preferred_format = :marshal)
15
- preferred_format ||= :marshal
16
- if preferred_format.to_s == 'secure'
17
+ def initialize(preferred_format = nil)
18
+ @preferred_format = preferred_format || :marshal
19
+ if @preferred_format.to_s == 'secure'
17
20
  @serializers = [ SecureSerializer ]
18
21
  else
19
- preferred_serializer = SERIALIZERS[preferred_format.to_sym]
22
+ preferred_serializer = SERIALIZERS[@preferred_format.to_sym]
20
23
  @serializers = SERIALIZERS.values.clone
21
24
  @serializers.unshift(@serializers.delete(preferred_serializer)) if preferred_serializer
22
25
  end
23
26
  end
24
27
 
25
- def dump(packet)
26
- cascade_serializers(:dump, packet)
28
+ def dump(packet, format = nil)
29
+ cascade_serializers(:dump, packet, format)
27
30
  end
28
31
 
29
- def load(packet)
30
- cascade_serializers(:load, packet)
32
+ def load(packet, format = nil)
33
+ cascade_serializers(:load, packet, format)
31
34
  end
32
35
 
33
36
  private
34
37
 
35
- SERIALIZERS = {:json => JSON, :marshal => Marshal, :yaml => YAML}.freeze
36
-
37
- def cascade_serializers(action, packet)
38
+ def cascade_serializers(action, packet, format)
38
39
  errors = []
39
- @serializers.map do |serializer|
40
+ determine_serializers(format).map do |serializer|
40
41
  begin
41
- o = serializer.send(action, packet)
42
+ serialized = serializer.send(action, packet)
42
43
  rescue Exception => e
43
- o = nil
44
+ serialized = nil
44
45
  errors << "#{e.message}\n\t#{e.backtrace[0]}"
45
46
  end
46
- return o if o
47
+ return serialized if serialized
47
48
  end
48
49
  raise SerializationError.new(action, packet, @serializers, errors.join("\n"))
49
50
  end
50
-
51
- end # Serializer
52
- end # Nanite
51
+
52
+ def determine_serializers(format)
53
+ if secure_serialization? and format == :insecure
54
+ SERIALIZERS.values
55
+ else
56
+ @serializers
57
+ end
58
+ end
59
+
60
+ def secure_serialization?
61
+ @preferred_format.to_s == 'secure'
62
+ end
63
+
64
+ end
65
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1.14
4
+ version: 0.4.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-08 00:00:00 +01:00
12
+ date: 2010-02-10 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency