Provide correct RDP information within configuration information

Dynamically generate RDP information when applicable via provider
if supported. When no RDP port is provided ignore RDP in config
and omit from output.
This commit is contained in:
Chris Roberts 2018-10-04 14:41:10 -07:00
parent 48d358adcb
commit 904a712838
3 changed files with 133 additions and 2 deletions

View File

@ -35,9 +35,14 @@ module VagrantPlugins
winrm_info = CommunicatorWinRM::Helper.winrm_info(machine)
raise Vagrant::Errors::WinRMNotRead if winrm_info.nil?
rdp_info = get_rdp_info(machine) || {}
variables = {
host_key: options[:host] || machine.name || "vagrant",
rdp_port: machine.config.rdp.port,
rdp_host: rdp_info[:host] || winrm_info[:host],
rdp_port: rdp_info[:port],
rdp_user: rdp_info[:username],
rdp_pass: rdp_info[:password],
winrm_host: winrm_info[:host],
winrm_port: winrm_info[:port],
winrm_user: machine.config.winrm.username,
@ -54,6 +59,66 @@ module VagrantPlugins
# Success, exit status 0
0
end
protected
# Generate RDP information for machine
#
# @param [Vagrant::Machine] machine Guest machine
# @return [Hash, nil]
def get_rdp_info(machine)
rdp_info = {}
if machine.provider.capability?(:rdp_info)
rdp_info = machine.provider.capability(:rdp_info)
rdp_info ||= {}
end
ssh_info = machine.ssh_info || {}
if !rdp_info[:username]
username = ssh_info[:username]
if machine.config.vm.communicator == :winrm
username = machine.config.winrm.username
end
rdp_info[:username] = username
end
if !rdp_info[:password]
password = ssh_info[:password]
if machine.config.vm.communicator == :winrm
password = machine.config.winrm.password
end
rdp_info[:password] = password
end
rdp_info[:host] ||= ssh_info[:host]
rdp_info[:port] ||= machine.config.rdp.port
rdp_info[:username] ||= machine.config.rdp.username
if rdp_info[:host] == "127.0.0.1"
# We need to find a forwarded port...
search_port = machine.config.rdp.search_port
ports = nil
if machine.provider.capability?(:forwarded_ports)
ports = machine.provider.capability(:forwarded_ports)
else
ports = {}.tap do |result|
machine.config.vm.networks.each do |type, netopts|
next if type != :forwarded_port
next if !netopts[:host]
result[netopts[:host]] = netopts[:guest]
end
end
end
ports = ports.invert
port = ports[search_port]
rdp_info[:port] = port
return nil if !port
end
rdp_info
end
end
end
end

View File

@ -3,4 +3,9 @@ Host <%= host_key %>
User <%= winrm_user %>
Password <%= winrm_password %>
Port <%= winrm_port %>
<% if rdp_port -%>
RDPHostName <%= rdp_host %>
RDPPort <%= rdp_port %>
RDPUser <%= rdp_user %>
RDPPassword <%= rdp_pass %>
<% end -%>

View File

@ -26,10 +26,13 @@ describe VagrantPlugins::CommandWinRMConfig::Command do
let(:config) {
double("config",
winrm: double("winrm-config", username: "vagrant", password: "vagrant"),
rdp: double("rdp-config", port: 9876)
rdp: rdp_config,
vm: double("vm-config", communicator: :winrm)
)
}
let(:rdp_config) { double("rdp-config", port: 9876) }
subject { described_class.new(argv, iso_env) }
before do
@ -53,7 +56,10 @@ Host #{machine.name}
User vagrant
Password vagrant
Port 1234
RDPHostName testhost.vagrant.dev
RDPPort 9876
RDPUser vagrant
RDPPassword vagrant
WINRMCONFIG
end
@ -74,9 +80,64 @@ Host my-host
User vagrant
Password vagrant
Port 1234
RDPHostName testhost.vagrant.dev
RDPPort 9876
RDPUser vagrant
RDPPassword vagrant
WINRMCONFIG
end
end
context "when no RDP port is configured" do
let(:rdp_config) { double("rdp-config", port: nil) }
it "should not include any RDP configuration information" do
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).not_to include("RDP")
end
end
context "when provider has rdp_info capability" do
let(:rdp_info) {
{host: "provider-host", port: 9999, username: "pvagrant", password: "pvagrant"}
}
before do
allow(machine.provider).to receive(:capability?).with(:rdp_info).and_return(true)
allow(machine.provider).to receive(:capability).with(:rdp_info).and_return(rdp_info)
end
it "should use provider RDP information" do
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include("RDPPort 9999")
expect(output).to include("RDPHostName provider-host")
expect(output).to include("RDPUser pvagrant")
expect(output).to include("RDPPassword pvagrant")
end
context "when provider rdp_info does not include host" do
before { rdp_info[:host] = nil }
it "should use winrm host" do
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include("RDPHostName testhost.vagrant.dev")
end
end
end
end
end