net-ssh 0.5.0
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.
- data/doc/LICENSE-BSD +27 -0
- data/doc/LICENSE-GPL +280 -0
- data/doc/LICENSE-RUBY +56 -0
- data/doc/README +13 -0
- data/doc/manual-html/chapter-1.html +333 -0
- data/doc/manual-html/chapter-2.html +455 -0
- data/doc/manual-html/chapter-3.html +413 -0
- data/doc/manual-html/chapter-4.html +353 -0
- data/doc/manual-html/chapter-5.html +393 -0
- data/doc/manual-html/chapter-6.html +296 -0
- data/doc/manual-html/index.html +217 -0
- data/doc/manual-html/manual.css +192 -0
- data/doc/manual/chapter.erb +18 -0
- data/doc/manual/example.erb +18 -0
- data/doc/manual/index.erb +29 -0
- data/doc/manual/manual.css +192 -0
- data/doc/manual/manual.rb +240 -0
- data/doc/manual/manual.yml +67 -0
- data/doc/manual/page.erb +87 -0
- data/doc/manual/parts/channels_callbacks.txt +32 -0
- data/doc/manual/parts/channels_loop.txt +14 -0
- data/doc/manual/parts/channels_open.txt +20 -0
- data/doc/manual/parts/channels_operations.txt +15 -0
- data/doc/manual/parts/channels_types.txt +3 -0
- data/doc/manual/parts/channels_what_are.txt +7 -0
- data/doc/manual/parts/exec_channels.txt +28 -0
- data/doc/manual/parts/exec_open.txt +51 -0
- data/doc/manual/parts/exec_popen3.txt +35 -0
- data/doc/manual/parts/forward_direct.txt +37 -0
- data/doc/manual/parts/forward_handlers.txt +16 -0
- data/doc/manual/parts/forward_intro.txt +18 -0
- data/doc/manual/parts/forward_local.txt +18 -0
- data/doc/manual/parts/forward_remote.txt +14 -0
- data/doc/manual/parts/intro_author.txt +1 -0
- data/doc/manual/parts/intro_getting.txt +39 -0
- data/doc/manual/parts/intro_license.txt +6 -0
- data/doc/manual/parts/intro_support.txt +7 -0
- data/doc/manual/parts/intro_what_is.txt +7 -0
- data/doc/manual/parts/intro_what_is_not.txt +3 -0
- data/doc/manual/parts/proxy_http.txt +52 -0
- data/doc/manual/parts/proxy_intro.txt +1 -0
- data/doc/manual/parts/proxy_socks.txt +23 -0
- data/doc/manual/parts/session_key.txt +66 -0
- data/doc/manual/parts/session_options.txt +42 -0
- data/doc/manual/parts/session_session.txt +14 -0
- data/doc/manual/parts/session_start.txt +49 -0
- data/doc/manual/tutorial.erb +30 -0
- data/examples/channel-demo.rb +81 -0
- data/examples/port-forward.rb +51 -0
- data/examples/process-demo.rb +91 -0
- data/examples/remote-net-port-forward.rb +45 -0
- data/examples/remote-port-forward.rb +80 -0
- data/examples/tail-demo.rb +49 -0
- data/lib/net/ssh.rb +52 -0
- data/lib/net/ssh/connection/channel.rb +411 -0
- data/lib/net/ssh/connection/constants.rb +47 -0
- data/lib/net/ssh/connection/driver.rb +343 -0
- data/lib/net/ssh/connection/services.rb +72 -0
- data/lib/net/ssh/connection/term.rb +90 -0
- data/lib/net/ssh/errors.rb +27 -0
- data/lib/net/ssh/proxy/errors.rb +34 -0
- data/lib/net/ssh/proxy/http.rb +126 -0
- data/lib/net/ssh/proxy/socks4.rb +83 -0
- data/lib/net/ssh/proxy/socks5.rb +160 -0
- data/lib/net/ssh/service/forward/driver.rb +319 -0
- data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
- data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
- data/lib/net/ssh/service/forward/services.rb +76 -0
- data/lib/net/ssh/service/process/driver.rb +153 -0
- data/lib/net/ssh/service/process/open.rb +193 -0
- data/lib/net/ssh/service/process/popen3.rb +160 -0
- data/lib/net/ssh/service/process/services.rb +66 -0
- data/lib/net/ssh/service/services.rb +44 -0
- data/lib/net/ssh/session.rb +242 -0
- data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
- data/lib/net/ssh/transport/compress/compressor.rb +53 -0
- data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
- data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
- data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
- data/lib/net/ssh/transport/compress/services.rb +68 -0
- data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
- data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
- data/lib/net/ssh/transport/constants.rb +66 -0
- data/lib/net/ssh/transport/errors.rb +47 -0
- data/lib/net/ssh/transport/identity-cipher.rb +61 -0
- data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
- data/lib/net/ssh/transport/kex/dh.rb +231 -0
- data/lib/net/ssh/transport/kex/services.rb +60 -0
- data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
- data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
- data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
- data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
- data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
- data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
- data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
- data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
- data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
- data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
- data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
- data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
- data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
- data/lib/net/ssh/transport/ossl/services.rb +149 -0
- data/lib/net/ssh/transport/packet-stream.rb +210 -0
- data/lib/net/ssh/transport/services.rb +146 -0
- data/lib/net/ssh/transport/session.rb +296 -0
- data/lib/net/ssh/transport/version-negotiator.rb +73 -0
- data/lib/net/ssh/userauth/agent.rb +218 -0
- data/lib/net/ssh/userauth/constants.rb +35 -0
- data/lib/net/ssh/userauth/driver.rb +176 -0
- data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
- data/lib/net/ssh/userauth/methods/password.rb +70 -0
- data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
- data/lib/net/ssh/userauth/methods/services.rb +63 -0
- data/lib/net/ssh/userauth/services.rb +126 -0
- data/lib/net/ssh/userauth/userkeys.rb +258 -0
- data/lib/net/ssh/util/buffer.rb +274 -0
- data/lib/net/ssh/util/openssl.rb +146 -0
- data/lib/net/ssh/util/prompter.rb +73 -0
- data/lib/net/ssh/version.rb +29 -0
- data/test/ALL-TESTS.rb +21 -0
- data/test/connection/tc_channel.rb +136 -0
- data/test/connection/tc_driver.rb +287 -0
- data/test/connection/tc_integration.rb +85 -0
- data/test/proxy/tc_http.rb +209 -0
- data/test/proxy/tc_socks4.rb +148 -0
- data/test/proxy/tc_socks5.rb +214 -0
- data/test/service/forward/tc_driver.rb +289 -0
- data/test/service/forward/tc_local_network_handler.rb +123 -0
- data/test/service/forward/tc_remote_network_handler.rb +108 -0
- data/test/service/process/tc_driver.rb +79 -0
- data/test/service/process/tc_integration.rb +117 -0
- data/test/service/process/tc_open.rb +179 -0
- data/test/service/process/tc_popen3.rb +164 -0
- data/test/tc_integration.rb +79 -0
- data/test/transport/compress/tc_none_compress.rb +41 -0
- data/test/transport/compress/tc_none_decompress.rb +45 -0
- data/test/transport/compress/tc_zlib_compress.rb +61 -0
- data/test/transport/compress/tc_zlib_decompress.rb +48 -0
- data/test/transport/kex/tc_dh.rb +304 -0
- data/test/transport/kex/tc_dh_gex.rb +70 -0
- data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
- data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
- data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
- data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
- data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
- data/test/transport/ossl/fixtures/not-a-private-key +4 -0
- data/test/transport/ossl/fixtures/not-supported +2 -0
- data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
- data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
- data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
- data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
- data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
- data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
- data/test/transport/ossl/hmac/tc_md5.rb +50 -0
- data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
- data/test/transport/ossl/hmac/tc_none.rb +50 -0
- data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
- data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
- data/test/transport/ossl/tc_buffer.rb +97 -0
- data/test/transport/ossl/tc_buffer_factory.rb +67 -0
- data/test/transport/ossl/tc_cipher_factory.rb +84 -0
- data/test/transport/ossl/tc_digest_factory.rb +39 -0
- data/test/transport/ossl/tc_hmac_factory.rb +72 -0
- data/test/transport/ossl/tc_key_factory.rb +199 -0
- data/test/transport/tc_algorithm_negotiator.rb +169 -0
- data/test/transport/tc_identity_cipher.rb +52 -0
- data/test/transport/tc_integration.rb +110 -0
- data/test/transport/tc_packet_stream.rb +183 -0
- data/test/transport/tc_session.rb +283 -0
- data/test/transport/tc_version_negotiator.rb +86 -0
- data/test/userauth/methods/tc_hostbased.rb +136 -0
- data/test/userauth/methods/tc_password.rb +89 -0
- data/test/userauth/methods/tc_publickey.rb +167 -0
- data/test/userauth/tc_agent.rb +223 -0
- data/test/userauth/tc_driver.rb +190 -0
- data/test/userauth/tc_integration.rb +81 -0
- data/test/userauth/tc_userkeys.rb +265 -0
- data/test/util/tc_buffer.rb +217 -0
- metadata +256 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
|
10
|
+
# distribution for the texts of these licenses.
|
|
11
|
+
# -----------------------------------------------------------------------------
|
|
12
|
+
# net-ssh website : http://net-ssh.rubyforge.org
|
|
13
|
+
# project website: http://rubyforge.org/projects/net-ssh
|
|
14
|
+
# =============================================================================
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
$:.unshift "../../../lib"
|
|
18
|
+
|
|
19
|
+
require 'test/unit'
|
|
20
|
+
require 'net/ssh/service/process/driver'
|
|
21
|
+
|
|
22
|
+
class TC_Process_Driver < Test::Unit::TestCase
|
|
23
|
+
|
|
24
|
+
class MockObject
|
|
25
|
+
attr_reader :events
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
@events = []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def method_missing( sym, *args, &block )
|
|
32
|
+
token = [ sym, *args ]
|
|
33
|
+
token << :with_block if block
|
|
34
|
+
@events << token
|
|
35
|
+
:return_value
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
undef_method :loop
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def setup
|
|
42
|
+
@connection = MockObject.new
|
|
43
|
+
@log = MockObject.new
|
|
44
|
+
@handlers = { :open => MockObject.new, :popen3 => MockObject.new }
|
|
45
|
+
@driver = Net::SSH::Service::Process::Driver.new(
|
|
46
|
+
@connection, @log, @handlers )
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_open_no_block
|
|
50
|
+
result = @driver.open( "foo" )
|
|
51
|
+
assert_equal :return_value, result
|
|
52
|
+
assert_equal [ [ :call, "foo" ] ], @handlers[:open].events
|
|
53
|
+
assert_equal [], @connection.events
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_open_block
|
|
57
|
+
result = @driver.open( "foo" ) do |r|
|
|
58
|
+
assert_equal :return_value, r
|
|
59
|
+
end
|
|
60
|
+
assert_nil result
|
|
61
|
+
assert_equal [ [ :call, "foo" ] ], @handlers[:open].events
|
|
62
|
+
assert_equal [ [ :loop ] ], @connection.events
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_popen3_no_block
|
|
66
|
+
result = @driver.popen3( "foo" )
|
|
67
|
+
assert_equal :return_value, result
|
|
68
|
+
assert_equal [ [ :popen3, "foo" ] ], @handlers[:popen3].events
|
|
69
|
+
assert_equal [], @connection.events
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_popen3_no_block
|
|
73
|
+
result = @driver.popen3( "foo" ) { |f| }
|
|
74
|
+
assert_equal :return_value, result
|
|
75
|
+
assert_equal [ [ :popen3, "foo", :with_block ] ], @handlers[:popen3].events
|
|
76
|
+
assert_equal [], @connection.events
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
|
10
|
+
# distribution for the texts of these licenses.
|
|
11
|
+
# -----------------------------------------------------------------------------
|
|
12
|
+
# net-ssh website : http://net-ssh.rubyforge.org
|
|
13
|
+
# project website: http://rubyforge.org/projects/net-ssh
|
|
14
|
+
# =============================================================================
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
$:.unshift "../../../lib"
|
|
18
|
+
|
|
19
|
+
if $run_integration_tests || __FILE__ == $0
|
|
20
|
+
|
|
21
|
+
require 'needle'
|
|
22
|
+
require 'test/unit'
|
|
23
|
+
|
|
24
|
+
class TC_Process_Integration < Test::Unit::TestCase
|
|
25
|
+
|
|
26
|
+
HOST = "test.host"
|
|
27
|
+
USER = "test"
|
|
28
|
+
PASSWORD = "test/unit"
|
|
29
|
+
|
|
30
|
+
def setup
|
|
31
|
+
@registry = Needle::Registry.define(
|
|
32
|
+
:logs => { :device => STDOUT, :default_level => :warn }
|
|
33
|
+
) do |b|
|
|
34
|
+
b.require 'net/ssh/transport/services', "Net::SSH::Transport"
|
|
35
|
+
b.require 'net/ssh/userauth/services', "Net::SSH::UserAuth"
|
|
36
|
+
b.require 'net/ssh/connection/services', "Net::SSH::Connection"
|
|
37
|
+
b.require 'net/ssh/service/process/services',
|
|
38
|
+
"Net::SSH::Service::Process"
|
|
39
|
+
|
|
40
|
+
b.crypto_backend { :ossl }
|
|
41
|
+
b.transport_host { HOST }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@registry.userauth.driver.authenticate( "ssh-connection", USER, PASSWORD )
|
|
45
|
+
|
|
46
|
+
@driver = @registry.process.driver
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def teardown
|
|
50
|
+
@registry.transport.session.close
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_open_no_block
|
|
54
|
+
script = [ "2+2", "3+2*5", "quit" ]
|
|
55
|
+
expect = [ "4\n", "13\n", :exit ]
|
|
56
|
+
results = []
|
|
57
|
+
|
|
58
|
+
process = @driver.open( "bc" )
|
|
59
|
+
process.on_success { |p| p.puts script.shift }
|
|
60
|
+
process.on_stdout do |p,d|
|
|
61
|
+
results << d
|
|
62
|
+
if script.empty?
|
|
63
|
+
p.close_input
|
|
64
|
+
else
|
|
65
|
+
p.puts script.shift
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
process.on_exit { results << :exit }
|
|
69
|
+
|
|
70
|
+
@registry.connection.driver.loop
|
|
71
|
+
|
|
72
|
+
assert_equal expect, results
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_open_block
|
|
76
|
+
script = [ "2+2", "3+2*5", "quit" ]
|
|
77
|
+
expect = [ "4\n", "13\n", :exit ]
|
|
78
|
+
results = []
|
|
79
|
+
|
|
80
|
+
@driver.open( "bc" ) do |process|
|
|
81
|
+
process.on_success { |p| p.puts script.shift }
|
|
82
|
+
process.on_stdout do |p,d|
|
|
83
|
+
results << d
|
|
84
|
+
if script.empty?
|
|
85
|
+
p.close_input
|
|
86
|
+
else
|
|
87
|
+
p.puts script.shift
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
process.on_exit { results << :exit }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
assert_equal expect, results
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_popen3_no_block
|
|
97
|
+
stdin, stdout, stderr = @driver.popen3( "bc" )
|
|
98
|
+
stdin.puts "2+2"
|
|
99
|
+
assert_equal "4\n", stdout.read
|
|
100
|
+
stdin.puts "3+2*5"
|
|
101
|
+
assert_equal "13\n", stdout.read
|
|
102
|
+
stdin.puts "quit"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_popen3_block
|
|
106
|
+
@driver.popen3( "bc" ) do |stdin,stdout,stderr|
|
|
107
|
+
stdin.puts "2+2"
|
|
108
|
+
assert_equal "4\n", stdout.read
|
|
109
|
+
stdin.puts "3+2*5"
|
|
110
|
+
assert_equal "13\n", stdout.read
|
|
111
|
+
stdin.puts "quit"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
|
10
|
+
# distribution for the texts of these licenses.
|
|
11
|
+
# -----------------------------------------------------------------------------
|
|
12
|
+
# net-ssh website : http://net-ssh.rubyforge.org
|
|
13
|
+
# project website: http://rubyforge.org/projects/net-ssh
|
|
14
|
+
# =============================================================================
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
$:.unshift "../../../lib"
|
|
18
|
+
|
|
19
|
+
require 'test/unit'
|
|
20
|
+
require 'net/ssh/service/process/open'
|
|
21
|
+
|
|
22
|
+
class TC_Process_Open < Test::Unit::TestCase
|
|
23
|
+
|
|
24
|
+
class Log
|
|
25
|
+
def debug?
|
|
26
|
+
true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def debug(msg)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class MockObject
|
|
34
|
+
attr_reader :events
|
|
35
|
+
|
|
36
|
+
def initialize
|
|
37
|
+
@events = []
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def method_missing( sym, *args, &block )
|
|
41
|
+
token = [ sym, *args ]
|
|
42
|
+
token << true if block
|
|
43
|
+
@events << token
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Connection < MockObject
|
|
48
|
+
attr_reader :channel
|
|
49
|
+
|
|
50
|
+
def open_channel( *args, &block )
|
|
51
|
+
@events << [ :open_channel, *args ] + [ block ? true : false ]
|
|
52
|
+
@channel = MockObject.new
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def create_manager( &block )
|
|
57
|
+
connection = Connection.new
|
|
58
|
+
mgr = Net::SSH::Service::Process::OpenManager.new( connection,
|
|
59
|
+
Log.new, "test", &block )
|
|
60
|
+
[ mgr, connection ]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_no_block
|
|
64
|
+
mgr, conn = create_manager
|
|
65
|
+
assert_equal [ [ :open_channel, "session", true ] ], conn.events
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_with_block
|
|
69
|
+
yielded = false
|
|
70
|
+
mgr, conn = create_manager { |mgr| yielded = true }
|
|
71
|
+
assert_equal [ [ :open_channel, "session", true ],
|
|
72
|
+
[ :loop ] ], conn.events
|
|
73
|
+
assert yielded
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_write
|
|
77
|
+
mgr, conn = create_manager
|
|
78
|
+
mgr.write "foo"
|
|
79
|
+
assert_equal [ [ :send_data, "foo" ] ], conn.channel.events
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_puts_nonl
|
|
83
|
+
mgr, conn = create_manager
|
|
84
|
+
mgr.puts "foo"
|
|
85
|
+
assert_equal [ [ :send_data, "foo\n" ] ], conn.channel.events
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_puts_nl
|
|
89
|
+
mgr, conn = create_manager
|
|
90
|
+
mgr.puts "foo\n"
|
|
91
|
+
assert_equal [ [ :send_data, "foo\n" ] ], conn.channel.events
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_close_input
|
|
95
|
+
mgr, conn = create_manager
|
|
96
|
+
mgr.close_input
|
|
97
|
+
assert_equal [ [ :send_eof ] ], conn.channel.events
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_close
|
|
101
|
+
mgr, conn = create_manager
|
|
102
|
+
mgr.close
|
|
103
|
+
assert_equal [ [ :close ] ], conn.channel.events
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_confirm
|
|
107
|
+
mgr, conn = create_manager
|
|
108
|
+
chan = MockObject.new
|
|
109
|
+
mgr.do_confirm chan
|
|
110
|
+
assert_equal [ [ :on_success, true ], [ :on_failure, true ],
|
|
111
|
+
[ :exec, "test", true ] ], chan.events
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_exec_success
|
|
115
|
+
mgr, conn = create_manager
|
|
116
|
+
chan = MockObject.new
|
|
117
|
+
called = false
|
|
118
|
+
mgr.on_success { |ch| called = true }
|
|
119
|
+
mgr.do_exec_success chan
|
|
120
|
+
assert_equal [ [ :on_data, true ], [ :on_extended_data, true ],
|
|
121
|
+
[ :on_close, true ], [ :on_request, true ] ], chan.events
|
|
122
|
+
assert called
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_exec_failure_no_callback
|
|
126
|
+
mgr, conn = create_manager
|
|
127
|
+
chan = MockObject.new
|
|
128
|
+
assert_raise( Net::SSH::Exception ) do
|
|
129
|
+
mgr.do_exec_failure chan
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_exec_failure_callback
|
|
134
|
+
mgr, conn = create_manager
|
|
135
|
+
chan = MockObject.new
|
|
136
|
+
called = false
|
|
137
|
+
mgr.on_failure { |ch,msg| called = true }
|
|
138
|
+
mgr.do_exec_failure chan
|
|
139
|
+
assert called
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def test_stdout
|
|
143
|
+
mgr, conn = create_manager
|
|
144
|
+
chan = MockObject.new
|
|
145
|
+
data = ""
|
|
146
|
+
mgr.on_stdout { |ch,d| data = d }
|
|
147
|
+
mgr.do_data chan, "foo"
|
|
148
|
+
assert_equal "foo", data
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_extended_data_not_stderr
|
|
152
|
+
mgr, conn = create_manager
|
|
153
|
+
chan = MockObject.new
|
|
154
|
+
data = ""
|
|
155
|
+
mgr.on_stderr { |ch,d| data = d }
|
|
156
|
+
mgr.do_extended_data chan, 0, "foo"
|
|
157
|
+
assert_equal "", data
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_extended_data_stderr
|
|
161
|
+
mgr, conn = create_manager
|
|
162
|
+
chan = MockObject.new
|
|
163
|
+
data = ""
|
|
164
|
+
mgr.on_stderr { |ch,d| data = d }
|
|
165
|
+
mgr.do_extended_data chan, 1, "foo"
|
|
166
|
+
assert_equal "foo", data
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def test_close
|
|
170
|
+
mgr, conn = create_manager
|
|
171
|
+
chan = MockObject.new
|
|
172
|
+
called = false
|
|
173
|
+
mgr.on_exit { |ch,status| called = true }
|
|
174
|
+
mgr.do_close chan
|
|
175
|
+
assert called
|
|
176
|
+
assert_equal [], chan.events
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
|
7
|
+
# library for Ruby. This file (and the library as a whole) may be used only as
|
|
8
|
+
# allowed by either the BSD license, or the Ruby license (or, by association
|
|
9
|
+
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
|
10
|
+
# distribution for the texts of these licenses.
|
|
11
|
+
# -----------------------------------------------------------------------------
|
|
12
|
+
# net-ssh website : http://net-ssh.rubyforge.org
|
|
13
|
+
# project website: http://rubyforge.org/projects/net-ssh
|
|
14
|
+
# =============================================================================
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
$:.unshift "../../../lib"
|
|
18
|
+
|
|
19
|
+
require 'test/unit'
|
|
20
|
+
require 'net/ssh/service/process/popen3'
|
|
21
|
+
|
|
22
|
+
class TC_Process_POpen3 < Test::Unit::TestCase
|
|
23
|
+
|
|
24
|
+
class MockObject
|
|
25
|
+
attr_reader :events
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
@events = []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def method_missing( sym, *args, &block )
|
|
32
|
+
token = [ sym, *args ]
|
|
33
|
+
token << :with_block if block
|
|
34
|
+
@events << token
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
undef_method :loop
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class Channel < MockObject
|
|
41
|
+
attr_reader :connection
|
|
42
|
+
|
|
43
|
+
def connection
|
|
44
|
+
@connection ||= MockObject.new
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class TC_SSHStdinPipe < Test::Unit::TestCase
|
|
49
|
+
def setup
|
|
50
|
+
@channel = MockObject.new
|
|
51
|
+
@pipe = Net::SSH::Service::Process::POpen3Manager::SSHStdinPipe.new(
|
|
52
|
+
@channel )
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_write
|
|
56
|
+
@pipe.write "foo"
|
|
57
|
+
assert_equal [ [ :send_data, "foo" ] ], @channel.events
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_puts_nonl
|
|
61
|
+
@pipe.puts "foo"
|
|
62
|
+
assert_equal [ [ :send_data, "foo\n" ] ], @channel.events
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_puts_nl
|
|
66
|
+
@pipe.puts "foo\n"
|
|
67
|
+
assert_equal [ [ :send_data, "foo\n" ] ], @channel.events
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class TC_SSHStdoutPipe < Test::Unit::TestCase
|
|
72
|
+
def setup
|
|
73
|
+
@channel = Channel.new
|
|
74
|
+
@pipe = Net::SSH::Service::Process::POpen3Manager::SSHStdoutPipe.new(
|
|
75
|
+
@channel )
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_read_empty
|
|
79
|
+
s = @pipe.read
|
|
80
|
+
assert_equal "", s
|
|
81
|
+
assert_equal [ [ :loop, :with_block ] ], @channel.connection.events
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_read_full
|
|
85
|
+
@pipe.do_data @channel, "foo"
|
|
86
|
+
s = @pipe.read
|
|
87
|
+
assert_equal "foo", s
|
|
88
|
+
assert_equal [], @channel.connection.events
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
class TC_SSHStderrPipe < Test::Unit::TestCase
|
|
93
|
+
def setup
|
|
94
|
+
@channel = Channel.new
|
|
95
|
+
@pipe = Net::SSH::Service::Process::POpen3Manager::SSHStderrPipe.new(
|
|
96
|
+
@channel )
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_read_empty
|
|
100
|
+
s = @pipe.read
|
|
101
|
+
assert_equal "", s
|
|
102
|
+
assert_equal [ [ :loop, :with_block ] ], @channel.connection.events
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_read_non_stderr
|
|
106
|
+
@pipe.do_data @channel, 0, "foo"
|
|
107
|
+
s = @pipe.read
|
|
108
|
+
assert_equal "", s
|
|
109
|
+
assert_equal [ [ :loop, :with_block ] ], @channel.connection.events
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_read_stderr
|
|
113
|
+
@pipe.do_data @channel, 1, "foo"
|
|
114
|
+
s = @pipe.read
|
|
115
|
+
assert_equal "foo", s
|
|
116
|
+
assert_equal [], @channel.connection.events
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
class Connection < MockObject
|
|
121
|
+
class Channel < MockObject
|
|
122
|
+
attr_reader :success
|
|
123
|
+
attr_reader :failure
|
|
124
|
+
|
|
125
|
+
def on_success( &block )
|
|
126
|
+
super
|
|
127
|
+
@success = block
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def on_failure( &block )
|
|
131
|
+
super
|
|
132
|
+
@failure = block
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
attr_reader :channel
|
|
137
|
+
def open_channel( type )
|
|
138
|
+
super
|
|
139
|
+
yield @channel = Channel.new
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def test_popen3
|
|
144
|
+
conn = Connection.new
|
|
145
|
+
mgr = Net::SSH::Service::Process::POpen3Manager.new( conn, nil )
|
|
146
|
+
mgr.popen3( "foo" ) do |a,b,c|
|
|
147
|
+
assert_instance_of(
|
|
148
|
+
Net::SSH::Service::Process::POpen3Manager::SSHStdinPipe, a )
|
|
149
|
+
assert_instance_of(
|
|
150
|
+
Net::SSH::Service::Process::POpen3Manager::SSHStdoutPipe, b )
|
|
151
|
+
assert_instance_of(
|
|
152
|
+
Net::SSH::Service::Process::POpen3Manager::SSHStderrPipe, c )
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
assert_equal [ [ :open_channel, "session", :with_block ],
|
|
156
|
+
[ :loop ] ], conn.events
|
|
157
|
+
chan = conn.channel
|
|
158
|
+
assert_equal [ [ :on_success, :with_block ],
|
|
159
|
+
[ :on_failure, :with_block ], [ :exec, "foo", true ] ], chan.events
|
|
160
|
+
|
|
161
|
+
chan.success.call( chan )
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|