net-ssh-open3 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/net-ssh-open3.rb +48 -20
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cc5b2173309f5acbd7d9b1dfef343daea71cc6f
|
4
|
+
data.tar.gz: 769b292fabbab5b0aba1e91c977a85be3362b956
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df50ddf6685051878ea33fb7bb351fbe23d3d5b34da2c94f9888c0bb258968947ded31eb7ee09af9b2b8a2a82c95f488651a2377dcd4ee690f61ad6f764f400a
|
7
|
+
data.tar.gz: 5a2a4df652343408c8ab4fbd418129d607f38a0e261677ef16812dd8029aacdc5ae10da81e0761f1ebf27ff9306d6f079a212a1d3326dd1e748bc5e561a59b89
|
data/lib/net-ssh-open3.rb
CHANGED
@@ -109,11 +109,14 @@ module Net::SSH
|
|
109
109
|
#
|
110
110
|
# *optional* +options+: options hash, keys:
|
111
111
|
# * +redirects+: Hash of redirections which will be appended to a command line (you can't transfer a pipe to a remote system).
|
112
|
-
# Key: one of +:in+, +:out+, +:err+ or a +String+, value: +Integer+ to redirect to fd, +String+ to redirect to a file.
|
112
|
+
# Key: one of +:in+, +:out+, +:err+ or a +String+, value: +Integer+ to redirect to remote fd, +String+ to redirect to a file.
|
113
|
+
# If a key is a Symbol, local +IO+ may be specified as a value. In this case, block receives +nil+ for the corresponding IO.
|
113
114
|
# Example:
|
114
115
|
# { '>>' => '/tmp/log', err: 1 }
|
115
116
|
# translates to
|
116
117
|
# '>>/tmp/log 2>&1'
|
118
|
+
# Another example:
|
119
|
+
# { in: $stdin, out: $stdout, err: $stderr }
|
117
120
|
# * +channel_retries+: +Integer+ number of retries in case of channel open failure (ssh server usually limits a session to 10 channels),
|
118
121
|
# or an array of [+retries+, +delay+]
|
119
122
|
# * +stdin_data+: for +capture*+ only, specifies data to be immediately sent to +stdin+ of a remote process.
|
@@ -137,15 +140,10 @@ module Net::SSH
|
|
137
140
|
# # => ["", #<Net::SSH::Process::Status: pid 1744 QUIT (signal 3) core true>]
|
138
141
|
# Note that just closing stdin is not enough for PTY. You should explicitly send VEOF as a first char of a line, see termios(3).
|
139
142
|
module Open3
|
140
|
-
SSH_EXTENDED_DATA_STDERR = 1 #:nodoc:
|
141
|
-
REMOTE_PACKET_THRESHOLD = 512 # headers etc #:nodoc:
|
142
|
-
|
143
|
-
private_constant :SSH_EXTENDED_DATA_STDERR, :REMOTE_PACKET_THRESHOLD
|
144
|
-
|
145
143
|
# Captures stdout only. Returns [String, Net::SSH::Process::Status]
|
146
144
|
def capture2(*args)
|
147
145
|
stdout = StringIO.new
|
148
|
-
stdin_data = args
|
146
|
+
stdin_data = extract_open3_options(args)[:stdin_data]
|
149
147
|
|
150
148
|
run_popen(*args,
|
151
149
|
stdin: stdin_data,
|
@@ -158,7 +156,7 @@ module Net::SSH
|
|
158
156
|
# Captures stdout and stderr into one string. Returns [String, Net::SSH::Process::Status]
|
159
157
|
def capture2e(*args)
|
160
158
|
stdout = StringIO.new
|
161
|
-
stdin_data = args
|
159
|
+
stdin_data = extract_open3_options(args)[:stdin_data]
|
162
160
|
|
163
161
|
run_popen(*args,
|
164
162
|
stdin: stdin_data,
|
@@ -172,7 +170,7 @@ module Net::SSH
|
|
172
170
|
# Captures stdout and stderr into separate strings. Returns [String, String, Net::SSH::Process::Status]
|
173
171
|
def capture3(*args)
|
174
172
|
stdout, stderr = StringIO.new, StringIO.new
|
175
|
-
stdin_data = args
|
173
|
+
stdin_data = extract_open3_options(args)[:stdin_data]
|
176
174
|
|
177
175
|
run_popen(*args,
|
178
176
|
stdin: stdin_data,
|
@@ -190,9 +188,10 @@ module Net::SSH
|
|
190
188
|
# Careful: don't forget to read +stderr+, otherwise if your process generates too much stderr output
|
191
189
|
# the pipe may overload and ssh loop will get stuck writing to it.
|
192
190
|
def popen3(*args, &block)
|
193
|
-
|
194
|
-
|
195
|
-
|
191
|
+
redirects = extract_open3_options(args)[:redirects]
|
192
|
+
stdin_inner, stdin_outer = open3_ios_for(:in, redirects)
|
193
|
+
stdout_outer, stdout_inner = open3_ios_for(:out, redirects)
|
194
|
+
stderr_outer, stderr_inner = open3_ios_for(:err, redirects)
|
196
195
|
|
197
196
|
run_popen(*args,
|
198
197
|
stdin: stdin_inner,
|
@@ -204,8 +203,9 @@ module Net::SSH
|
|
204
203
|
|
205
204
|
# Yields +stdin+, +stdout-stderr+, +waiter_thread+ into a block.
|
206
205
|
def popen2e(*args, &block)
|
207
|
-
|
208
|
-
|
206
|
+
redirects = extract_open3_options(args)[:redirects]
|
207
|
+
stdin_inner, stdin_outer = open3_ios_for(:in, redirects)
|
208
|
+
stdout_outer, stdout_inner = open3_ios_for(:out, redirects)
|
209
209
|
|
210
210
|
run_popen(*args,
|
211
211
|
stdin: stdin_inner,
|
@@ -217,8 +217,9 @@ module Net::SSH
|
|
217
217
|
|
218
218
|
# Yields +stdin+, +stdout+, +waiter_thread+ into a block.
|
219
219
|
def popen2(*args, &block)
|
220
|
-
|
221
|
-
|
220
|
+
redirects = extract_open3_options(args)[:redirects]
|
221
|
+
stdin_inner, stdin_outer = open3_ios_for(:in, redirects)
|
222
|
+
stdout_outer, stdout_inner = open3_ios_for(:out, redirects)
|
222
223
|
|
223
224
|
run_popen(*args,
|
224
225
|
stdin: stdin_inner,
|
@@ -228,6 +229,27 @@ module Net::SSH
|
|
228
229
|
end
|
229
230
|
|
230
231
|
private
|
232
|
+
def extract_open3_options(args, pop = false)
|
233
|
+
if Hash === args.last
|
234
|
+
pop ? args.pop : args.last
|
235
|
+
else
|
236
|
+
{}
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def open3_ios_for(name, redirects)
|
241
|
+
if redirects and user_supplied_io = redirects[name] and IO === user_supplied_io
|
242
|
+
name == :in ? user_supplied_io : [nil, user_supplied_io]
|
243
|
+
else
|
244
|
+
IO.pipe
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
SSH_EXTENDED_DATA_STDERR = 1 #:nodoc:
|
249
|
+
REMOTE_PACKET_THRESHOLD = 512 # headers etc #:nodoc:
|
250
|
+
|
251
|
+
private_constant :SSH_EXTENDED_DATA_STDERR, :REMOTE_PACKET_THRESHOLD
|
252
|
+
|
231
253
|
def install_channel_callbacks(channel, options)
|
232
254
|
logger, stdin, stdout, stderr =
|
233
255
|
options[:logger], options[:stdin], options[:stdout], options[:stderr]
|
@@ -317,19 +339,22 @@ module Net::SSH
|
|
317
339
|
end
|
318
340
|
end
|
319
341
|
|
320
|
-
REDIRECT_MAPPING = {
|
342
|
+
REDIRECT_MAPPING = {
|
321
343
|
in: '<',
|
322
344
|
out: '>',
|
323
345
|
err: '2>'
|
324
346
|
}
|
347
|
+
private_constant :REDIRECT_MAPPING
|
325
348
|
|
326
349
|
def run_popen(*args, internal_options)
|
327
|
-
options = (args
|
350
|
+
options = extract_open3_options(args, true)
|
328
351
|
env = (args.shift if Hash === args.first) || {}
|
329
352
|
cmdline = args.size == 1 ? args.first : Shellwords.join(args.map(&:to_s))
|
330
353
|
|
331
354
|
redirects = options[:redirects] and redirects.each_pair do |fd_and_dir, destination|
|
332
|
-
|
355
|
+
if destination = popen_io_name(destination)
|
356
|
+
cmdline << " #{REDIRECT_MAPPING[fd_and_dir] || fd_and_dir}#{destination}"
|
357
|
+
end
|
333
358
|
end
|
334
359
|
logger = options[:logger]
|
335
360
|
pty_options = options[:pty]
|
@@ -377,7 +402,10 @@ module Net::SSH
|
|
377
402
|
end
|
378
403
|
|
379
404
|
def popen_io_name(name)
|
380
|
-
|
405
|
+
case name
|
406
|
+
when Fixnum then "&#{name}"
|
407
|
+
when String then Shellwords.shellescape(name)
|
408
|
+
end
|
381
409
|
end
|
382
410
|
end
|
383
411
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-ssh-open3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Sheremet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|