ipc_transit 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/bin/transitd CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'net/http'
3
4
  require 'uri'
4
5
  require 'ipc_transit'
data/bin/trlist CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'ipc_transit'
3
4
 
4
5
 
data/bin/trrecv CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'ipc_transit'
3
4
  require 'json'
4
5
 
@@ -10,6 +11,6 @@ nowait = ARGV[1]
10
11
  #puts message
11
12
 
12
13
  while ret = IPCTransit.receive('qname' => qname, 'nowait' => 1)
13
- puts ret
14
+ puts JSON.pretty_generate(ret)
14
15
  end
15
16
 
data/bin/trsend CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'ipc_transit'
3
4
  require 'json'
4
5
 
data/bin/trserver CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'webrick'
3
4
  require 'ipc_transit'
4
5
 
@@ -0,0 +1,33 @@
1
+ require 'zlib'
2
+
3
+ def transit_deflate(args)
4
+ if args['c'].nil?
5
+ compression_type = 'none'
6
+ else
7
+ compression_type = args['c']
8
+ end
9
+ case compression_type
10
+ when 'none'
11
+ return args['frozen']
12
+ when 'zlib'
13
+ return Zlib::deflate(args['frozen'])
14
+ end
15
+ end
16
+
17
+ def transit_inflate(args)
18
+ if args['wire_headers'].nil?
19
+ compression_type = 'none'
20
+ else
21
+ if args['wire_headers']['c'].nil?
22
+ compression_type = 'none'
23
+ else
24
+ compression_type = args['wire_headers']['c']
25
+ end
26
+ end
27
+ case compression_type
28
+ when 'none'
29
+ return args['serialized_message']
30
+ when 'zlib'
31
+ return Zlib::inflate(args['serialized_message'])
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+ require 'yaml'
4
+ require 'ipc_transit/compress'
5
+
6
+ def transit_freeze(args)
7
+ if args['e'].nil?
8
+ serialize_type = 'json'
9
+ else
10
+ serialize_type = args['e']
11
+ end
12
+ case serialize_type
13
+ when 'json'
14
+ args['frozen'] = args['message'].to_json
15
+ when 'yaml'
16
+ args['frozen'] = YAML.dump(args['message'])
17
+ end
18
+ return transit_deflate(args)
19
+ end
20
+
21
+ def transit_thaw(args)
22
+ if args['wire_headers'].nil?
23
+ serialize_type = 'json'
24
+ else
25
+ if args['wire_headers']['e'].nil?
26
+ serialize_type = 'json'
27
+ else
28
+ serialize_type = args['wire_headers']['e']
29
+ end
30
+ end
31
+ begin
32
+ inflated = transit_inflate(args)
33
+ rescue Exception => msg
34
+ puts "transit_thaw exception: #{e}"
35
+ end
36
+ case serialize_type
37
+ when 'json'
38
+ args['thawed'] = JSON.parse(inflated)
39
+ when 'yaml'
40
+ args['thawed'] = YAML.load(inflated)
41
+ end
42
+ return args['thawed']
43
+ end
44
+
@@ -0,0 +1,21 @@
1
+ #kind of ghetto, but I don't have a better way right now
2
+ def drain_test_queue
3
+ begin
4
+ while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
5
+ end
6
+ rescue Exception => msg
7
+ end
8
+ end
9
+
10
+ def run_daemon(prog)
11
+ pid = fork
12
+ if pid.nil? #child
13
+ exec "bin/#{prog}"
14
+ exit
15
+ end
16
+ return pid
17
+ end
18
+ def kill_daemon(pid)
19
+ Process.kill(9, pid)
20
+ end
21
+
data/lib/ipc_transit.rb CHANGED
@@ -1,6 +1,8 @@
1
- require 'json'
1
+ require 'rubygems'
2
2
  require 'SysVIPC'
3
3
  include SysVIPC
4
+ require 'ipc_transit/serialize'
5
+
4
6
 
5
7
  ##
6
8
  # Fast, brokerless message queueing
@@ -89,7 +91,7 @@ class IPCTransit
89
91
  self.unpack_data(args)
90
92
  #at this point I need to see if this is a remote transit
91
93
  #if it is, then do not thaw the message proper
92
- args['message'] = self.transit_thaw(args)
94
+ args['message'] = transit_thaw(args)
93
95
  rescue Exception => msg
94
96
  # puts "Exception: #{msg}"
95
97
  # need to do something smarter with this
@@ -184,7 +186,8 @@ class IPCTransit
184
186
  end
185
187
  begin
186
188
  self.lock_dir()
187
- file = File.open("/tmp/transit/#{qname}", 'w')
189
+ File.umask(0000)
190
+ file = File.open("/tmp/transit/#{qname}", 'w', 0666)
188
191
  new_qid = get_next_id
189
192
  file.puts("qid=#{new_qid}")
190
193
  file.puts("qname=#{qname}")
@@ -199,6 +202,7 @@ class IPCTransit
199
202
  end
200
203
 
201
204
  def self.lock_dir()
205
+ File.umask(0000)
202
206
  File.open('/tmp/transit.lock', File::WRONLY|File::EXCL|File::CREAT, 0666)
203
207
  end
204
208
  def self.unlock_dir()
@@ -209,7 +213,7 @@ class IPCTransit
209
213
  self.mk_queue_dir()
210
214
  Dir.glob('/tmp/transit/*').each do |filename|
211
215
  info = {}
212
- file = File.new(filename, 'r')
216
+ file = File.new(filename, 'r', 0666)
213
217
  while (line = file.gets)
214
218
  line.chomp!
215
219
  (key, value) = line.split('=')
@@ -234,16 +238,6 @@ class IPCTransit
234
238
  end
235
239
 
236
240
 
237
- def self.transit_freeze(args)
238
- return args['message'].to_json
239
- end
240
-
241
- def self.transit_thaw(args)
242
- return JSON.parse(args['serialized_message'])
243
- end
244
-
245
-
246
-
247
241
  #returns a scalar, ready to be sent on the wire
248
242
  #it takes message and wire_meta_data
249
243
  def self.pack_message(args)
@@ -253,7 +247,7 @@ class IPCTransit
253
247
  next if @@ipc_transit_std_args[k]
254
248
  args['message']['.ipc_transit_meta'][k] = args[k]
255
249
  end
256
- args['serialized_message'] = self.transit_freeze(args)
250
+ args['serialized_message'] = transit_freeze(args)
257
251
  self.serialize_wire_meta(args)
258
252
  l = args['serialized_wire_meta_data'].length
259
253
  args['serialized_wire_data'] = "#{l}:#{args['serialized_wire_meta_data']}#{args['serialized_message']}"
@@ -1,28 +1,15 @@
1
1
  require 'test/unit'
2
2
  require 'ipc_transit'
3
+ require 'ipc_transit/test'
3
4
 
4
- #kind of ghetto, but I don't have a better way right now
5
- def drain_test_queue
6
- begin
7
- while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
5
+ class TestIPCTransit < Test::Unit::TestCase
6
+ def teardown
7
+ if not @transitd_pid.nil?
8
+ kill_daemon(@transitd_pid)
9
+ kill_daemon(@trserver_pid)
8
10
  end
9
- rescue Exception => msg
10
11
  end
11
- end
12
12
 
13
- def run_daemon(prog)
14
- pid = fork
15
- if pid.nil? #child
16
- exec "bin/#{prog}"
17
- exit
18
- end
19
- return pid
20
- end
21
- def kill_daemon(pid)
22
- Process.kill(9, pid)
23
- end
24
-
25
- class TestIPCTransit < Test::Unit::TestCase
26
13
  def test_basic_remote
27
14
  drain_test_queue()
28
15
  IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'd' => '127.0.0.1')
@@ -34,18 +21,17 @@ class TestIPCTransit < Test::Unit::TestCase
34
21
  def test_full_remote
35
22
  drain_test_queue()
36
23
  begin
37
- trserver_pid = run_daemon('trserver')
38
- transitd_pid = run_daemon('transitd')
39
- sleep 1
24
+ @trserver_pid = run_daemon('trserver')
25
+ @transitd_pid = run_daemon('transitd')
26
+ sleep 2
40
27
  IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'd' => '127.0.0.1')
28
+ sleep 2
41
29
  ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
42
- assert(ret, 'IPCTransit.receive returned true')
43
- assert_equal(ret['foo'], 'bar')
44
30
  rescue Exception => msg
45
31
  puts "Exception: #{msg}"
46
32
  end
47
- kill_daemon(transitd_pid)
48
- kill_daemon(trserver_pid)
33
+ assert(ret, 'IPCTransit.receive returned true')
34
+ assert_equal(ret['foo'], 'bar')
49
35
  end
50
36
  end
51
37
 
@@ -1,14 +1,6 @@
1
1
  require 'test/unit'
2
2
  require 'ipc_transit'
3
-
4
- #kind of ghetto, but I don't have a better way right now
5
- def drain_test_queue
6
- begin
7
- while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
8
- end
9
- rescue Exception => msg
10
- end
11
- end
3
+ require 'ipc_transit/test'
12
4
 
13
5
  class TestIPCTransit < Test::Unit::TestCase
14
6
  def test_typical
@@ -36,7 +28,7 @@ class TestIPCTransit < Test::Unit::TestCase
36
28
  'c' => 'none',
37
29
  'something' => 'else',
38
30
  'x' => { 'this' => 'that' },
39
- 'once' => ['more',2],
31
+ 'once' => ['more',2]
40
32
  )
41
33
  ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
42
34
  assert(ret, 'IPCTransit.receive returned true')
@@ -0,0 +1,43 @@
1
+ require 'test/unit'
2
+ require 'ipc_transit'
3
+ require 'ipc_transit/test'
4
+
5
+ class TestIPCTransit < Test::Unit::TestCase
6
+ def test_yaml_typical
7
+ drain_test_queue()
8
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'e' => 'yaml', 'qname' => 'test_qname')
9
+ ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
10
+ assert(ret, 'IPCTransit.receive returned true')
11
+ assert_equal(ret['foo'], 'bar')
12
+ end
13
+
14
+ def test_yaml_wire_raw
15
+ drain_test_queue()
16
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'e' => 'yaml', 'c' => 'none')
17
+ ret = IPCTransit.receive('qname' => 'test_qname', 'raw' => 1, 'nowait' => 1)
18
+ assert(ret, 'IPCTransit.receive returned true')
19
+ assert(ret['serialized_message'] =~ /^---/, 'data verified as YAML')
20
+ assert_equal(ret['message']['foo'], 'bar')
21
+ assert_equal(ret['wire_headers']['e'], 'yaml')
22
+ assert_equal(ret['wire_headers']['c'], 'none')
23
+ end
24
+ def test_yaml_message_meta
25
+ drain_test_queue()
26
+ IPCTransit.send( 'qname' => 'test_qname',
27
+ 'message' => { 'foo' => 'bar' },
28
+ 'e' => 'json',
29
+ 'c' => 'none',
30
+ 'something' => 'else',
31
+ 'x' => { 'this' => 'that' },
32
+ 'once' => ['more',2]
33
+ )
34
+ ret = IPCTransit.receive('qname' => 'test_qname', 'e' => 'yaml', 'nowait' => 1)
35
+ assert(ret, 'IPCTransit.receive returned true')
36
+ assert_equal(ret['foo'], 'bar')
37
+ assert_equal(ret['.ipc_transit_meta']['something'], 'else')
38
+ assert_equal(ret['.ipc_transit_meta']['x']['this'], 'that')
39
+ assert_equal(ret['.ipc_transit_meta']['once'][0], 'more')
40
+ assert_equal(ret['.ipc_transit_meta']['once'][1], 2)
41
+ end
42
+ end
43
+
@@ -0,0 +1,41 @@
1
+ require 'test/unit'
2
+ require 'ipc_transit'
3
+ require 'ipc_transit/test'
4
+
5
+ class TestIPCTransit < Test::Unit::TestCase
6
+ def test_zlib_typical
7
+ drain_test_queue()
8
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'c' => 'zlib', 'e' => 'json')
9
+ ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
10
+ assert(ret, 'IPCTransit.receive returned true')
11
+ assert_equal(ret['foo'], 'bar')
12
+ end
13
+
14
+ def test_zlib_wire_raw
15
+ drain_test_queue()
16
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'c' => 'zlib')
17
+ ret = IPCTransit.receive('qname' => 'test_qname', 'raw' => 1, 'nowait' => 1)
18
+ assert(ret, 'IPCTransit.receive returned true')
19
+ assert_equal(ret['message']['foo'], 'bar')
20
+ assert_equal(ret['wire_headers']['c'], 'zlib')
21
+ end
22
+ def test_zlib_message_meta
23
+ drain_test_queue()
24
+ IPCTransit.send( 'qname' => 'test_qname',
25
+ 'message' => { 'foo' => 'bar' },
26
+ 'e' => 'json',
27
+ 'c' => 'zlib',
28
+ 'something' => 'else',
29
+ 'x' => { 'this' => 'that' },
30
+ 'once' => ['more',2]
31
+ )
32
+ ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
33
+ assert(ret, 'IPCTransit.receive returned true')
34
+ assert_equal(ret['foo'], 'bar')
35
+ assert_equal(ret['.ipc_transit_meta']['something'], 'else')
36
+ assert_equal(ret['.ipc_transit_meta']['x']['this'], 'that')
37
+ assert_equal(ret['.ipc_transit_meta']['once'][0], 'more')
38
+ assert_equal(ret['.ipc_transit_meta']['once'][1], 2)
39
+ end
40
+ end
41
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ipc_transit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -27,6 +27,38 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: yaml
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: zlib
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
30
62
  - !ruby/object:Gem::Dependency
31
63
  name: SysVIPC
32
64
  requirement: !ruby/object:Gem::Requirement
@@ -56,6 +88,9 @@ extra_rdoc_files: []
56
88
  files:
57
89
  - Rakefile
58
90
  - lib/ipc_transit.rb
91
+ - lib/ipc_transit/test.rb
92
+ - lib/ipc_transit/serialize.rb
93
+ - lib/ipc_transit/compress.rb
59
94
  - bin/trrecv
60
95
  - bin/trsend
61
96
  - bin/trlist
@@ -63,6 +98,8 @@ files:
63
98
  - bin/trserver
64
99
  - test/tc_transit_simple.rb
65
100
  - test/tc_transit_remote.rb
101
+ - test/tc_transit_yaml.rb
102
+ - test/tc_transit_zlib.rb
66
103
  homepage: http://rubygems.org/gems/ipc_transit
67
104
  licenses: []
68
105
  post_install_message:
@@ -90,3 +127,5 @@ summary: Brokerless, cross-language, fast message queue library
90
127
  test_files:
91
128
  - test/tc_transit_simple.rb
92
129
  - test/tc_transit_remote.rb
130
+ - test/tc_transit_yaml.rb
131
+ - test/tc_transit_zlib.rb