rexec 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rexec/connection.rb +10 -1
- data/lib/rexec/server.rb +5 -5
- data/lib/rexec/task.rb +14 -1
- data/lib/rexec/version.rb +1 -1
- data/test/interrupt.rb +7 -0
- data/test/server_test.rb +3 -3
- metadata +5 -4
data/lib/rexec/connection.rb
CHANGED
@@ -39,7 +39,9 @@ module RExec
|
|
39
39
|
def initialize(input, output, error = nil)
|
40
40
|
@input = input
|
41
41
|
@output = output
|
42
|
+
|
42
43
|
@running = true
|
44
|
+
@exceptions = :send
|
43
45
|
|
44
46
|
@error = error
|
45
47
|
|
@@ -50,6 +52,9 @@ module RExec
|
|
50
52
|
# The object that will handle remote proxy invocations.
|
51
53
|
attr :handler, true
|
52
54
|
|
55
|
+
# Whether to send exceptions across the wire, or handle normally (e.g. print to stdout):
|
56
|
+
attr :exceptions, true
|
57
|
+
|
53
58
|
# The proxy object that will dispatch RPCs.
|
54
59
|
attr :proxy
|
55
60
|
|
@@ -98,7 +103,11 @@ module RExec
|
|
98
103
|
begin
|
99
104
|
yield object
|
100
105
|
rescue Exception => ex
|
101
|
-
|
106
|
+
if @exceptions == :send
|
107
|
+
send_object(ex)
|
108
|
+
else
|
109
|
+
raise
|
110
|
+
end
|
102
111
|
end
|
103
112
|
end
|
104
113
|
end
|
data/lib/rexec/server.rb
CHANGED
@@ -84,11 +84,11 @@ module RExec
|
|
84
84
|
Task.open(command, options) do |task|
|
85
85
|
conn = Connection.build(task, options, &send_code)
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
87
|
+
begin
|
88
|
+
yield conn, task
|
89
|
+
ensure
|
90
|
+
conn.stop
|
91
|
+
end
|
92
92
|
end
|
93
93
|
else
|
94
94
|
task = Task.open(command, options)
|
data/lib/rexec/task.rb
CHANGED
@@ -287,12 +287,17 @@ module RExec
|
|
287
287
|
if command.respond_to? :call
|
288
288
|
command.call
|
289
289
|
elsif Array === command
|
290
|
+
command = command.dup
|
291
|
+
|
290
292
|
# If command is a Pathname, we need to convert it to an absolute path if possible,
|
291
293
|
# otherwise if it is relative it might cause problems.
|
292
294
|
if command[0].respond_to? :realpath
|
293
295
|
command[0] = command[0].realpath
|
294
296
|
end
|
295
297
|
|
298
|
+
# exec expects an array of Strings:
|
299
|
+
command.collect! { |item| item.to_s }
|
300
|
+
|
296
301
|
exec *command
|
297
302
|
else
|
298
303
|
if command.respond_to? :realpath
|
@@ -310,9 +315,17 @@ module RExec
|
|
310
315
|
if block_given?
|
311
316
|
begin
|
312
317
|
yield task
|
318
|
+
|
319
|
+
# Close all input pipes if not done already.
|
313
320
|
task.close_input
|
321
|
+
|
322
|
+
# The task has stopped if task.wait returns correctly.
|
314
323
|
return task.wait
|
324
|
+
rescue Interrupt
|
325
|
+
# If task.wait is interrupted, we should also interrupt the child process
|
326
|
+
task.kill
|
315
327
|
ensure
|
328
|
+
# Print out any remaining data from @output or @error
|
316
329
|
task.close
|
317
330
|
end
|
318
331
|
else
|
@@ -320,7 +333,7 @@ module RExec
|
|
320
333
|
end
|
321
334
|
end
|
322
335
|
|
323
|
-
def initialize(input, output, error, pid)
|
336
|
+
def initialize(input, output, error, pid)
|
324
337
|
@input = input
|
325
338
|
@output = output
|
326
339
|
@error = error
|
data/lib/rexec/version.rb
CHANGED
data/test/interrupt.rb
ADDED
data/test/server_test.rb
CHANGED
@@ -35,7 +35,7 @@ class ServerTest < Test::Unit::TestCase
|
|
35
35
|
connection_started = false
|
36
36
|
object_received = false
|
37
37
|
|
38
|
-
RExec::start_server(code.read, "ruby", :passthrough => []) do |conn,
|
38
|
+
RExec::start_server(code.read, "ruby", :passthrough => []) do |conn, task|
|
39
39
|
connection_started = true
|
40
40
|
conn.send_object([:bounce, sobj])
|
41
41
|
|
@@ -66,7 +66,7 @@ class ServerTest < Test::Unit::TestCase
|
|
66
66
|
|
67
67
|
test_obj = [1, 2, 3, 4, "five"]
|
68
68
|
|
69
|
-
RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => []) do |conn,
|
69
|
+
RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => []) do |conn, task|
|
70
70
|
connection_started = true
|
71
71
|
conn.send_object([:bounce, test_obj])
|
72
72
|
|
@@ -84,7 +84,7 @@ class ServerTest < Test::Unit::TestCase
|
|
84
84
|
|
85
85
|
test_obj = [1, 2, 3, 4, "five"]
|
86
86
|
|
87
|
-
conn,
|
87
|
+
conn, task = RExec::start_server(code.read, "/bin/sh -c ruby", :passthrough => [])
|
88
88
|
conn.send_object([:bounce, test_obj])
|
89
89
|
|
90
90
|
assert_equal test_obj, conn.receive_object
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rexec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 1.4.
|
9
|
+
- 1
|
10
|
+
version: 1.4.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Samuel Williams
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-08-
|
18
|
+
date: 2011-08-09 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description:
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- test/client.rb
|
46
46
|
- test/daemon.rb
|
47
47
|
- test/daemon_test.rb
|
48
|
+
- test/interrupt.rb
|
48
49
|
- test/listing_example.rb
|
49
50
|
- test/remote_server_test.rb
|
50
51
|
- test/server_test.rb
|