Update VirtualBox driver ssh_port helper

Be more restrictive when matching the port forward used for
SSH. Allow matching simply on the guest port, but also include
extra matching criteria for cases where multiple results may
be returned.
This commit is contained in:
Chris Roberts 2018-11-13 14:59:48 -08:00
parent b2e682b0e3
commit c7721f619b
2 changed files with 67 additions and 5 deletions

View File

@ -689,12 +689,21 @@ module VagrantPlugins
def ssh_port(expected_port) def ssh_port(expected_port)
@logger.debug("Searching for SSH port: #{expected_port.inspect}") @logger.debug("Searching for SSH port: #{expected_port.inspect}")
# Look for the forwarded port only by comparing the guest port # Look for the forwarded port. Valid based on the guest port, but will do
read_forwarded_ports.each do |_, _, hostport, guestport| # scoring based matching to determine best value when multiple results are
return hostport if guestport == expected_port # available.
end matches = read_forwarded_ports.map do |_, name, hostport, guestport, host_ip|
next if guestport != expected_port
match = [0, hostport]
match[0] += 1 if name == "ssh"
match[0] += 1 if name.downcase == "ssh"
match[0] += 1 if host_ip == "127.0.0.1"
match
end.compact
nil result = matches.sort_by(&:first).last
result.last if result
end end
def resume def resume

View File

@ -79,4 +79,57 @@ describe VagrantPlugins::ProviderVirtualBox::Driver::Version_5_0 do
end end
end end
end end
describe "#ssh_port" do
let(:forwards) {
[[1, "ssh", 2222, 22, "127.0.0.1"],
[1, "ssh", 8080, 80, ""]]
}
before { allow(subject).to receive(:read_forwarded_ports).and_return(forwards) }
it "should return the host port" do
expect(subject.ssh_port(22)).to eq(2222)
end
context "when multiple matches are available" do
let(:forwards) {
[[1, "ssh", 2222, 22, "127.0.0.1"],
[1, "", 2221, 22, ""]]
}
it "should choose localhost port forward" do
expect(subject.ssh_port(22)).to eq(2222)
end
context "when multiple named matches are available" do
let(:forwards) {
[[1, "ssh", 2222, 22, "127.0.0.1"],
[1, "SSH", 2221, 22, "127.0.0.1"]]
}
it "should choose lowercased name forward" do
expect(subject.ssh_port(22)).to eq(2222)
end
end
end
context "when only ports are defined" do
let(:forwards) {
[[1, "", 2222, 22, ""]]
}
it "should return the host port" do
expect(subject.ssh_port(22)).to eq(2222)
end
end
context "when no matches are available" do
let(:forwards) { [] }
it "should return nil" do
expect(subject.ssh_port(22)).to be_nil
end
end
end
end end