sshkit 1.18.0 → 1.23.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.
- checksums.yaml +4 -4
- data/.docker/Dockerfile +6 -0
- data/.docker/ubuntu_setup.sh +22 -0
- data/.github/dependabot.yml +16 -0
- data/.github/release-drafter.yml +25 -0
- data/.github/workflows/ci.yml +98 -0
- data/.github/workflows/push.yml +12 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +63 -0
- data/.rubocop_todo.yml +630 -0
- data/CHANGELOG.md +1 -769
- data/CONTRIBUTING.md +2 -2
- data/Dangerfile +1 -1
- data/EXAMPLES.md +35 -13
- data/Gemfile +0 -12
- data/README.md +35 -17
- data/RELEASING.md +4 -5
- data/Rakefile +3 -10
- data/docker-compose.yml +8 -0
- data/examples/simple_connection.rb +9 -0
- data/lib/sshkit/backends/abstract.rb +9 -6
- data/lib/sshkit/backends/connection_pool/cache.rb +12 -5
- data/lib/sshkit/backends/connection_pool.rb +8 -4
- data/lib/sshkit/backends/netssh/known_hosts.rb +8 -8
- data/lib/sshkit/backends/netssh/scp_transfer.rb +26 -0
- data/lib/sshkit/backends/netssh/sftp_transfer.rb +46 -0
- data/lib/sshkit/backends/netssh.rb +38 -8
- data/lib/sshkit/command.rb +18 -13
- data/lib/sshkit/deprecation_logger.rb +2 -0
- data/lib/sshkit/host.rb +31 -4
- data/lib/sshkit/version.rb +1 -1
- data/sshkit.gemspec +6 -1
- data/test/functional/backends/netssh_transfer_tests.rb +83 -0
- data/test/functional/backends/test_local.rb +18 -0
- data/test/functional/backends/test_netssh.rb +24 -79
- data/test/functional/backends/test_netssh_scp.rb +23 -0
- data/test/functional/backends/test_netssh_sftp.rb +23 -0
- data/test/helper.rb +5 -43
- data/test/support/docker_wrapper.rb +71 -0
- data/test/unit/backends/test_abstract.rb +13 -1
- data/test/unit/backends/test_netssh.rb +55 -0
- data/test/unit/formatters/test_pretty.rb +1 -1
- data/test/unit/test_command.rb +32 -7
- data/test/unit/test_command_map.rb +8 -8
- data/test/unit/test_deprecation_logger.rb +1 -1
- data/test/unit/test_host.rb +44 -0
- metadata +58 -18
- data/.travis.yml +0 -14
- data/Vagrantfile +0 -15
- data/test/boxes.json +0 -17
- data/test/functional/test_ssh_server_comes_up_for_functional_tests.rb +0 -24
- data/test/support/vagrant_wrapper.rb +0 -55
@@ -99,6 +99,18 @@ module SSHKit
|
|
99
99
|
assert_equal '/usr/bin/env cat file', backend.executed_command.to_command
|
100
100
|
end
|
101
101
|
|
102
|
+
def test_within_home
|
103
|
+
backend = ExampleBackend.new do
|
104
|
+
within '~/foo' do
|
105
|
+
execute :cat, 'file', :strip => false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
backend.run
|
110
|
+
|
111
|
+
assert_equal 'cd ~/foo && /usr/bin/env cat file', backend.executed_command.to_command
|
112
|
+
end
|
113
|
+
|
102
114
|
def test_background_logs_deprecation_warnings
|
103
115
|
deprecation_out = ''
|
104
116
|
SSHKit.config.deprecation_output = deprecation_out
|
@@ -112,7 +124,7 @@ module SSHKit
|
|
112
124
|
assert_equal 2, lines.length
|
113
125
|
|
114
126
|
assert_equal("[Deprecated] The background method is deprecated. Blame badly behaved pseudo-daemons!\n", lines[0])
|
115
|
-
assert_match(/ \(Called from.*test_abstract.rb:\d+:in
|
127
|
+
assert_match(/ \(Called from.*test_abstract.rb:\d+:in .block in .*test_background_logs_deprecation_warnings.\)\n/, lines[1])
|
116
128
|
end
|
117
129
|
|
118
130
|
def test_calling_abstract_with_undefined_execute_command_raises_exception
|
@@ -5,6 +5,12 @@ module SSHKit
|
|
5
5
|
module Backend
|
6
6
|
class TestNetssh < UnitTest
|
7
7
|
|
8
|
+
def teardown
|
9
|
+
super
|
10
|
+
# Reset config to defaults after each test
|
11
|
+
backend.instance_variable_set :@config, nil
|
12
|
+
end
|
13
|
+
|
8
14
|
def backend
|
9
15
|
@backend ||= Netssh
|
10
16
|
end
|
@@ -13,6 +19,7 @@ module SSHKit
|
|
13
19
|
backend.configure do |ssh|
|
14
20
|
ssh.pty = true
|
15
21
|
ssh.connection_timeout = 30
|
22
|
+
ssh.transfer_method = :sftp
|
16
23
|
ssh.ssh_options = {
|
17
24
|
keys: %w(/home/user/.ssh/id_rsa),
|
18
25
|
forward_agent: false,
|
@@ -21,6 +28,7 @@ module SSHKit
|
|
21
28
|
end
|
22
29
|
|
23
30
|
assert_equal 30, backend.config.connection_timeout
|
31
|
+
assert_equal :sftp, backend.config.transfer_method
|
24
32
|
assert_equal true, backend.config.pty
|
25
33
|
|
26
34
|
assert_equal %w(/home/user/.ssh/id_rsa), backend.config.ssh_options[:keys]
|
@@ -29,6 +37,46 @@ module SSHKit
|
|
29
37
|
assert_instance_of backend::KnownHosts, backend.config.ssh_options[:known_hosts]
|
30
38
|
end
|
31
39
|
|
40
|
+
def test_transfer_method_prohibits_invalid_values
|
41
|
+
error = assert_raises ArgumentError do
|
42
|
+
backend.configure do |ssh|
|
43
|
+
ssh.transfer_method = :nope
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_match ":nope is not a valid transfer method", error.message
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_transfer_method_does_not_allow_nil
|
51
|
+
error = assert_raises ArgumentError do
|
52
|
+
backend.configure do |ssh|
|
53
|
+
ssh.transfer_method = nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
assert_match "nil is not a valid transfer method", error.message
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_transfer_method_defaults_to_scp
|
61
|
+
assert_equal :scp, backend.config.transfer_method
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_host_can_override_transfer_method
|
65
|
+
backend.configure do |ssh|
|
66
|
+
ssh.transfer_method = :scp
|
67
|
+
end
|
68
|
+
|
69
|
+
host = Host.new("fake")
|
70
|
+
host.transfer_method = :sftp
|
71
|
+
|
72
|
+
netssh = backend.new(host)
|
73
|
+
netssh.stubs(:with_ssh).yields(nil)
|
74
|
+
|
75
|
+
netssh.send(:with_transfer, nil) do |transfer|
|
76
|
+
assert_instance_of Netssh::SftpTransfer, transfer
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
32
80
|
def test_netssh_ext
|
33
81
|
assert_includes Net::SSH::Config.default_files, "#{Dir.pwd}/.ssh/config"
|
34
82
|
end
|
@@ -54,6 +102,13 @@ module SSHKit
|
|
54
102
|
end
|
55
103
|
end
|
56
104
|
|
105
|
+
def test_transfer_summarizer_uses_verbosity
|
106
|
+
netssh = Netssh.new(Host.new('fake'))
|
107
|
+
summarizer = netssh.send(:transfer_summarizer, 'Transferring', verbosity: :ERROR)
|
108
|
+
netssh.expects(:error).with { |msg| msg.include?('Transferring afile 15.0%') }
|
109
|
+
summarizer.call(nil,'afile',15,100)
|
110
|
+
end
|
111
|
+
|
57
112
|
if Net::SSH::Version::CURRENT >= Net::SSH::Version[3, 1, 0]
|
58
113
|
def test_known_hosts_for_when_all_hosts_are_recognized
|
59
114
|
perform_known_hosts_test('github', 'github.com')
|
@@ -115,7 +115,7 @@ module SSHKit
|
|
115
115
|
|
116
116
|
def test_can_write_to_output_which_just_supports_append
|
117
117
|
# Note output doesn't have to be an IO, it only needs to support <<
|
118
|
-
output = stub(:<<)
|
118
|
+
output = stub(:<< => nil)
|
119
119
|
pretty = SSHKit::Formatter::Pretty.new(output)
|
120
120
|
simulate_command_lifecycle(pretty)
|
121
121
|
end
|
data/test/unit/test_command.rb
CHANGED
@@ -51,13 +51,13 @@ module SSHKit
|
|
51
51
|
def test_double_quotes_are_escaped_in_env
|
52
52
|
SSHKit.config = nil
|
53
53
|
c = Command.new(:rails, 'server', env: {foo: 'asdf"hjkl'})
|
54
|
-
assert_equal %{( export FOO="asdf
|
54
|
+
assert_equal %{( export FOO="asdf\\"hjkl" ; /usr/bin/env rails server )}, c.to_command
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_percentage_symbol_handled_in_env
|
58
58
|
SSHKit.config = nil
|
59
59
|
c = Command.new(:rails, 'server', env: {foo: 'asdf%hjkl'}, user: "anotheruser")
|
60
|
-
assert_equal %{( export FOO="asdf%hjkl" ; sudo -u anotheruser FOO=\"asdf%hjkl\" -- sh -c
|
60
|
+
assert_equal %{( export FOO="asdf%hjkl" ; sudo -u anotheruser FOO=\"asdf%hjkl\" -- sh -c /usr/bin/env\\ rails\\ server )}, c.to_command
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_including_the_env_doesnt_addressively_escape
|
@@ -84,6 +84,16 @@ module SSHKit
|
|
84
84
|
assert_equal "cd /opt/sites && /usr/bin/env ls -l", c.to_command
|
85
85
|
end
|
86
86
|
|
87
|
+
def test_working_in_home_directory
|
88
|
+
c = Command.new(:ls, '-l', in: "~/sites")
|
89
|
+
assert_equal "cd ~/sites && /usr/bin/env ls -l", c.to_command
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_working_in_a_given_weird_directory
|
93
|
+
c = Command.new(:ls, '-l', in: "/opt/sites and stuff")
|
94
|
+
assert_equal "cd /opt/sites\\ and\\ stuff && /usr/bin/env ls -l", c.to_command
|
95
|
+
end
|
96
|
+
|
87
97
|
def test_working_in_a_given_directory_with_env
|
88
98
|
c = Command.new(:ls, '-l', in: "/opt/sites", env: {a: :b})
|
89
99
|
assert_equal %{cd /opt/sites && ( export A="b" ; /usr/bin/env ls -l )}, c.to_command
|
@@ -97,17 +107,27 @@ module SSHKit
|
|
97
107
|
|
98
108
|
def test_working_as_a_given_user
|
99
109
|
c = Command.new(:whoami, user: :anotheruser)
|
100
|
-
assert_equal "sudo -u anotheruser -- sh -c
|
110
|
+
assert_equal "sudo -u anotheruser -- sh -c /usr/bin/env\\ whoami", c.to_command
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_working_as_a_given_weird_user
|
114
|
+
c = Command.new(:whoami, user: "mr space |")
|
115
|
+
assert_equal "sudo -u mr\\ space\\ \\| -- sh -c /usr/bin/env\\ whoami", c.to_command
|
101
116
|
end
|
102
117
|
|
103
118
|
def test_working_as_a_given_group
|
104
119
|
c = Command.new(:whoami, group: :devvers)
|
105
|
-
assert_equal 'sg devvers -c
|
120
|
+
assert_equal 'sg devvers -c /usr/bin/env\\ whoami', c.to_command
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_working_as_a_given_weird_group
|
124
|
+
c = Command.new(:whoami, group: "space | group")
|
125
|
+
assert_equal "sg space\\ \\|\\ group -c /usr/bin/env\\ whoami", c.to_command
|
106
126
|
end
|
107
127
|
|
108
128
|
def test_working_as_a_given_user_and_group
|
109
129
|
c = Command.new(:whoami, user: :anotheruser, group: :devvers)
|
110
|
-
assert_equal %Q(sudo -u anotheruser -- sh -c
|
130
|
+
assert_equal %Q(sudo -u anotheruser -- sh -c sg\\ devvers\\ -c\\ /usr/bin/env\\\\\\ whoami), c.to_command
|
111
131
|
end
|
112
132
|
|
113
133
|
def test_umask
|
@@ -125,13 +145,13 @@ module SSHKit
|
|
125
145
|
def test_umask_with_working_directory_and_user
|
126
146
|
SSHKit.config.umask = '007'
|
127
147
|
c = Command.new(:touch, 'somefile', in: '/var', user: 'alice')
|
128
|
-
assert_equal "cd /var && umask 007 && sudo -u alice -- sh -c
|
148
|
+
assert_equal "cd /var && umask 007 && sudo -u alice -- sh -c /usr/bin/env\\ touch\\ somefile", c.to_command
|
129
149
|
end
|
130
150
|
|
131
151
|
def test_umask_with_env_and_working_directory_and_user
|
132
152
|
SSHKit.config.umask = '007'
|
133
153
|
c = Command.new(:touch, 'somefile', user: 'bob', env: {a: 'b'}, in: '/var')
|
134
|
-
assert_equal %{cd /var && umask 007 && ( export A="b" ; sudo -u bob A="b" -- sh -c
|
154
|
+
assert_equal %{cd /var && umask 007 && ( export A="b" ; sudo -u bob A="b" -- sh -c /usr/bin/env\\ touch\\ somefile )}, c.to_command
|
135
155
|
end
|
136
156
|
|
137
157
|
def test_verbosity_defaults_to_logger_info
|
@@ -245,5 +265,10 @@ module SSHKit
|
|
245
265
|
assert_equal "whoami exit status: 1\nwhoami stdout: Nothing written\nwhoami stderr: Nothing written\n", error.message
|
246
266
|
end
|
247
267
|
|
268
|
+
def test_shares_same_uuid_before_and_after_redaction
|
269
|
+
command = Command.new(:whoami)
|
270
|
+
command_with_redaction = command.with_redaction
|
271
|
+
assert_equal command.uuid, command_with_redaction.uuid, "UUID should be stable before and after redaction"
|
272
|
+
end
|
248
273
|
end
|
249
274
|
end
|
@@ -27,26 +27,26 @@ module SSHKit
|
|
27
27
|
|
28
28
|
def test_prefix
|
29
29
|
map = CommandMap.new
|
30
|
-
map.prefix[:rake].push("/home/
|
30
|
+
map.prefix[:rake].push("/home/deployer/.rbenv/bin/rbenv exec")
|
31
31
|
map.prefix[:rake].push("bundle exec")
|
32
32
|
|
33
|
-
assert_equal map[:rake], "/home/
|
33
|
+
assert_equal map[:rake], "/home/deployer/.rbenv/bin/rbenv exec bundle exec rake"
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_prefix_procs
|
37
37
|
map = CommandMap.new
|
38
|
-
map.prefix[:rake].push("/home/
|
38
|
+
map.prefix[:rake].push("/home/deployer/.rbenv/bin/rbenv exec")
|
39
39
|
map.prefix[:rake].push(proc{ "bundle exec" })
|
40
40
|
|
41
|
-
assert_equal map[:rake], "/home/
|
41
|
+
assert_equal map[:rake], "/home/deployer/.rbenv/bin/rbenv exec bundle exec rake"
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_prefix_unshift
|
45
45
|
map = CommandMap.new
|
46
46
|
map.prefix[:rake].push("bundle exec")
|
47
|
-
map.prefix[:rake].unshift("/home/
|
47
|
+
map.prefix[:rake].unshift("/home/deployer/.rbenv/bin/rbenv exec")
|
48
48
|
|
49
|
-
assert_equal map[:rake], "/home/
|
49
|
+
assert_equal map[:rake], "/home/deployer/.rbenv/bin/rbenv exec bundle exec rake"
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_indifferent_setter
|
@@ -59,10 +59,10 @@ module SSHKit
|
|
59
59
|
|
60
60
|
def test_indifferent_prefix
|
61
61
|
map = CommandMap.new
|
62
|
-
map.prefix[:rake].push("/home/
|
62
|
+
map.prefix[:rake].push("/home/deployer/.rbenv/bin/rbenv exec")
|
63
63
|
map.prefix["rake"].push("bundle exec")
|
64
64
|
|
65
|
-
assert_equal map[:rake], "/home/
|
65
|
+
assert_equal map[:rake], "/home/deployer/.rbenv/bin/rbenv exec bundle exec rake"
|
66
66
|
end
|
67
67
|
|
68
68
|
def test_prefix_initialization_is_thread_safe
|
@@ -20,7 +20,7 @@ module SSHKit
|
|
20
20
|
|
21
21
|
assert_equal(2, actual_lines.size)
|
22
22
|
assert_equal "[Deprecated] Some message\n", actual_lines[0]
|
23
|
-
assert_match %r{ \(Called from .*sshkit/test/unit/test_deprecation_logger.rb:#{line_number}:in
|
23
|
+
assert_match %r{ \(Called from .*sshkit/test/unit/test_deprecation_logger.rb:#{line_number}:in .*generate_warning.\)\n}, actual_lines[1]
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_handles_nil_output
|
data/test/unit/test_host.rb
CHANGED
@@ -28,6 +28,12 @@ module SSHKit
|
|
28
28
|
assert_equal 'example.com', h.hostname
|
29
29
|
end
|
30
30
|
|
31
|
+
def test_custom_host_with_port
|
32
|
+
h = Host.new 'db:22'
|
33
|
+
assert_equal 22, h.port
|
34
|
+
assert_equal 'db', h.hostname
|
35
|
+
end
|
36
|
+
|
31
37
|
def test_host_with_username
|
32
38
|
h = Host.new 'root@example.com'
|
33
39
|
assert_equal 'root', h.username
|
@@ -50,12 +56,23 @@ module SSHKit
|
|
50
56
|
assert_equal 'localhost', h.hostname
|
51
57
|
end
|
52
58
|
|
59
|
+
def test_ipv6_without_brackets
|
60
|
+
h = Host.new '1fff:0:a88:85a3::ac1f'
|
61
|
+
assert_nil h.port
|
62
|
+
assert_equal '1fff:0:a88:85a3::ac1f', h.hostname
|
63
|
+
end
|
64
|
+
|
53
65
|
def test_does_not_confuse_ipv6_hosts_with_port_specification
|
54
66
|
h = Host.new '[1fff:0:a88:85a3::ac1f]:8001'
|
55
67
|
assert_equal 8001, h.port
|
56
68
|
assert_equal '1fff:0:a88:85a3::ac1f', h.hostname
|
57
69
|
end
|
58
70
|
|
71
|
+
def test_does_not_confuse_ipv6_hosts_without_port_specification
|
72
|
+
h = Host.new '[2001:db8:85a3:8d3:1319:8a2e:370:7348]'
|
73
|
+
assert_equal '2001:db8:85a3:8d3:1319:8a2e:370:7348', h.hostname
|
74
|
+
end
|
75
|
+
|
59
76
|
def testing_host_casting_to_a_string
|
60
77
|
assert_equal "example.com", Host.new('user@example.com:1234').to_s
|
61
78
|
end
|
@@ -137,6 +154,33 @@ module SSHKit
|
|
137
154
|
end
|
138
155
|
end
|
139
156
|
|
157
|
+
def test_transfer_method_defaults_to_nil
|
158
|
+
host = Host.new 'example.com'
|
159
|
+
assert_nil host.transfer_method
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_transfer_method_can_be_configured
|
163
|
+
host = Host.new 'example.com'
|
164
|
+
|
165
|
+
host.transfer_method = :scp
|
166
|
+
assert_equal :scp, host.transfer_method
|
167
|
+
|
168
|
+
host.transfer_method = :sftp
|
169
|
+
assert_equal :sftp, host.transfer_method
|
170
|
+
|
171
|
+
host.transfer_method = nil
|
172
|
+
assert_nil host.transfer_method
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_transfer_method_prohibits_invalid_values
|
176
|
+
host = Host.new 'example.com'
|
177
|
+
|
178
|
+
error = assert_raises ArgumentError do
|
179
|
+
host.transfer_method = :nope
|
180
|
+
end
|
181
|
+
|
182
|
+
assert_match ":nope is not a valid transfer method", error.message
|
183
|
+
end
|
140
184
|
end
|
141
185
|
|
142
186
|
end
|
metadata
CHANGED
@@ -1,16 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sshkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Hambley
|
8
8
|
- Tom Clements
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-06-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: base64
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
14
28
|
- !ruby/object:Gem::Dependency
|
15
29
|
name: net-ssh
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,6 +53,20 @@ dependencies:
|
|
39
53
|
- - ">="
|
40
54
|
- !ruby/object:Gem::Version
|
41
55
|
version: 1.1.2
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: net-sftp
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 2.1.2
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.1.2
|
42
70
|
- !ruby/object:Gem::Dependency
|
43
71
|
name: danger
|
44
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,14 +115,14 @@ dependencies:
|
|
87
115
|
requirements:
|
88
116
|
- - "~>"
|
89
117
|
- !ruby/object:Gem::Version
|
90
|
-
version: 2.
|
118
|
+
version: 2.2.2
|
91
119
|
type: :development
|
92
120
|
prerelease: false
|
93
121
|
version_requirements: !ruby/object:Gem::Requirement
|
94
122
|
requirements:
|
95
123
|
- - "~>"
|
96
124
|
- !ruby/object:Gem::Version
|
97
|
-
version: 2.
|
125
|
+
version: 2.2.2
|
98
126
|
- !ruby/object:Gem::Dependency
|
99
127
|
name: rake
|
100
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,8 +208,15 @@ executables: []
|
|
180
208
|
extensions: []
|
181
209
|
extra_rdoc_files: []
|
182
210
|
files:
|
211
|
+
- ".docker/Dockerfile"
|
212
|
+
- ".docker/ubuntu_setup.sh"
|
213
|
+
- ".github/dependabot.yml"
|
214
|
+
- ".github/release-drafter.yml"
|
215
|
+
- ".github/workflows/ci.yml"
|
216
|
+
- ".github/workflows/push.yml"
|
183
217
|
- ".gitignore"
|
184
|
-
- ".
|
218
|
+
- ".rubocop.yml"
|
219
|
+
- ".rubocop_todo.yml"
|
185
220
|
- ".yardopts"
|
186
221
|
- BREAKING_API_WISHLIST.md
|
187
222
|
- CHANGELOG.md
|
@@ -194,9 +229,10 @@ files:
|
|
194
229
|
- README.md
|
195
230
|
- RELEASING.md
|
196
231
|
- Rakefile
|
197
|
-
-
|
232
|
+
- docker-compose.yml
|
198
233
|
- examples/images/example_output.png
|
199
234
|
- examples/images/logo.png
|
235
|
+
- examples/simple_connection.rb
|
200
236
|
- lib/core_ext/array.rb
|
201
237
|
- lib/core_ext/hash.rb
|
202
238
|
- lib/sshkit.rb
|
@@ -208,6 +244,8 @@ files:
|
|
208
244
|
- lib/sshkit/backends/local.rb
|
209
245
|
- lib/sshkit/backends/netssh.rb
|
210
246
|
- lib/sshkit/backends/netssh/known_hosts.rb
|
247
|
+
- lib/sshkit/backends/netssh/scp_transfer.rb
|
248
|
+
- lib/sshkit/backends/netssh/sftp_transfer.rb
|
211
249
|
- lib/sshkit/backends/printer.rb
|
212
250
|
- lib/sshkit/backends/skipper.rb
|
213
251
|
- lib/sshkit/color.rb
|
@@ -234,15 +272,16 @@ files:
|
|
234
272
|
- lib/sshkit/runners/sequential.rb
|
235
273
|
- lib/sshkit/version.rb
|
236
274
|
- sshkit.gemspec
|
237
|
-
- test/
|
275
|
+
- test/functional/backends/netssh_transfer_tests.rb
|
238
276
|
- test/functional/backends/test_local.rb
|
239
277
|
- test/functional/backends/test_netssh.rb
|
240
|
-
- test/functional/
|
278
|
+
- test/functional/backends/test_netssh_scp.rb
|
279
|
+
- test/functional/backends/test_netssh_sftp.rb
|
241
280
|
- test/helper.rb
|
242
281
|
- test/known_hosts/github
|
243
282
|
- test/known_hosts/github_hash
|
244
283
|
- test/known_hosts/github_ip
|
245
|
-
- test/support/
|
284
|
+
- test/support/docker_wrapper.rb
|
246
285
|
- test/unit/backends/test_abstract.rb
|
247
286
|
- test/unit/backends/test_connection_pool.rb
|
248
287
|
- test/unit/backends/test_local.rb
|
@@ -268,8 +307,9 @@ files:
|
|
268
307
|
homepage: http://github.com/capistrano/sshkit
|
269
308
|
licenses:
|
270
309
|
- MIT
|
271
|
-
metadata:
|
272
|
-
|
310
|
+
metadata:
|
311
|
+
changelog_uri: https://github.com/capistrano/sshkit/releases
|
312
|
+
post_install_message:
|
273
313
|
rdoc_options: []
|
274
314
|
require_paths:
|
275
315
|
- lib
|
@@ -284,21 +324,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
284
324
|
- !ruby/object:Gem::Version
|
285
325
|
version: '0'
|
286
326
|
requirements: []
|
287
|
-
|
288
|
-
|
289
|
-
signing_key:
|
327
|
+
rubygems_version: 3.5.13
|
328
|
+
signing_key:
|
290
329
|
specification_version: 4
|
291
330
|
summary: SSHKit makes it easy to write structured, testable SSH commands in Ruby
|
292
331
|
test_files:
|
293
|
-
- test/
|
332
|
+
- test/functional/backends/netssh_transfer_tests.rb
|
294
333
|
- test/functional/backends/test_local.rb
|
295
334
|
- test/functional/backends/test_netssh.rb
|
296
|
-
- test/functional/
|
335
|
+
- test/functional/backends/test_netssh_scp.rb
|
336
|
+
- test/functional/backends/test_netssh_sftp.rb
|
297
337
|
- test/helper.rb
|
298
338
|
- test/known_hosts/github
|
299
339
|
- test/known_hosts/github_hash
|
300
340
|
- test/known_hosts/github_ip
|
301
|
-
- test/support/
|
341
|
+
- test/support/docker_wrapper.rb
|
302
342
|
- test/unit/backends/test_abstract.rb
|
303
343
|
- test/unit/backends/test_connection_pool.rb
|
304
344
|
- test/unit/backends/test_local.rb
|
data/.travis.yml
DELETED
data/Vagrantfile
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
VAGRANTFILE_API_VERSION = "2"
|
2
|
-
|
3
|
-
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
4
|
-
config.vm.box = 'hashicorp/precise64'
|
5
|
-
|
6
|
-
json_config_path = File.join("test", "boxes.json")
|
7
|
-
list = File.open(json_config_path).read
|
8
|
-
list = JSON.parse(list)
|
9
|
-
|
10
|
-
list.each do |vm|
|
11
|
-
config.vm.define vm["name"] do |web|
|
12
|
-
web.vm.network "forwarded_port", guest: 22, host: vm["port"]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/test/boxes.json
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
module SSHKit
|
4
|
-
|
5
|
-
class TestHost < FunctionalTest
|
6
|
-
|
7
|
-
def host
|
8
|
-
@_host ||= Host.new('')
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_that_it_works
|
12
|
-
assert true
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_creating_a_user_gives_us_back_his_private_key_as_a_string
|
16
|
-
skip 'It is not safe to create an user for non vagrant envs' unless VagrantWrapper.running?
|
17
|
-
keys = create_user_with_key(:peter)
|
18
|
-
assert_equal [:one, :two, :three], keys.keys
|
19
|
-
assert keys.values.all?
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
class VagrantWrapper
|
2
|
-
class << self
|
3
|
-
def hosts
|
4
|
-
@vm_hosts ||= begin
|
5
|
-
result = {}
|
6
|
-
|
7
|
-
boxes = boxes_list
|
8
|
-
|
9
|
-
unless running?
|
10
|
-
boxes.map! do |box|
|
11
|
-
box['user'] = ENV['USER']
|
12
|
-
box['port'] = '22'
|
13
|
-
box
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
boxes.each do |vm|
|
18
|
-
result[vm['name']] = vm_host(vm)
|
19
|
-
end
|
20
|
-
|
21
|
-
result
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def running?
|
26
|
-
@running ||= begin
|
27
|
-
status = `#{vagrant_binary} status`
|
28
|
-
status.include?('running')
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def boxes_list
|
33
|
-
json_config_path = File.join('test', 'boxes.json')
|
34
|
-
boxes = File.open(json_config_path).read
|
35
|
-
JSON.parse(boxes)
|
36
|
-
end
|
37
|
-
|
38
|
-
def vagrant_binary
|
39
|
-
'vagrant'
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def vm_host(vm)
|
45
|
-
host_options = {
|
46
|
-
user: vm['user'] || 'vagrant',
|
47
|
-
hostname: vm['hostname'] || 'localhost',
|
48
|
-
port: vm['port'] || '22',
|
49
|
-
password: vm['password'] || 'vagrant'
|
50
|
-
}
|
51
|
-
|
52
|
-
SSHKit::Host.new(host_options)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|