net-ssh-open3 0.1.2 → 0.1.3
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 +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
|