diff --git a/lib/vagrant/errors.rb b/lib/vagrant/errors.rb index 42ae909ce..341688308 100644 --- a/lib/vagrant/errors.rb +++ b/lib/vagrant/errors.rb @@ -404,8 +404,8 @@ module Vagrant error_key(:linux_nfs_mount_failed) end - class LinuxRDesktopNotFound < VagrantError - error_key(:linux_rdesktop_not_found) + class LinuxRDPClientNotFound < VagrantError + error_key(:linux_rdp_client_not_found) end class LocalDataDirectoryNotAccessible < VagrantError diff --git a/plugins/hosts/linux/cap/rdp.rb b/plugins/hosts/linux/cap/rdp.rb index 7146ef890..76476fc9b 100644 --- a/plugins/hosts/linux/cap/rdp.rb +++ b/plugins/hosts/linux/cap/rdp.rb @@ -5,17 +5,35 @@ module VagrantPlugins module Cap class RDP def self.rdp_client(env, rdp_info) - if !Vagrant::Util::Which.which("rdesktop") - raise Vagrant::Errors::LinuxRDesktopNotFound - end + # Detect if an RDP client is available. + # Prefer xfreerdp as it supports newer versions of RDP. + rdp_client = + if Vagrant::Util::Which.which("xfreerdp") + "xfreerdp" + elsif Vagrant::Util::Which.which("rdesktop") + "rdesktop" + else + raise Vagrant::Errors::LinuxRDPClientNotFound + end args = [] - args << "-u" << rdp_info[:username] - args << "-p" << rdp_info[:password] if rdp_info[:password] - args += rdp_info[:extra_args] if rdp_info[:extra_args] - args << "#{rdp_info[:host]}:#{rdp_info[:port]}" - Vagrant::Util::Subprocess.execute("rdesktop", *args) + # Build appropriate arguments for the RDP client. + case rdp_client + when "xfreerdp" + args << "/u:#{rdp_info[:username]}" + args << "/p:#{rdp_info[:password]}" if rdp_info[:password] + args << "/v:#{rdp_info[:host]}:#{rdp_info[:port]}" + args += rdp_info[:extra_args] if rdp_info[:extra_args] + when "rdesktop" + args << "-u" << rdp_info[:username] + args << "-p" << rdp_info[:password] if rdp_info[:password] + args += rdp_info[:extra_args] if rdp_info[:extra_args] + args << "#{rdp_info[:host]}:#{rdp_info[:port]}" + end + + # Finally, run the client. + Vagrant::Util::Subprocess.execute(rdp_client, *args) end end end diff --git a/templates/locales/en.yml b/templates/locales/en.yml index 57a05a3e8..6ca14b024 100755 --- a/templates/locales/en.yml +++ b/templates/locales/en.yml @@ -823,10 +823,11 @@ en: that the NFS client software is properly installed, and consult any resources specific to the linux distro you're using for more information on how to do this. - linux_rdesktop_not_found: |- - The `rdesktop` application was not found. Vagrant requires this - in order to connect via RDP to the Vagrant environment. Please ensure - this application is installed and available on the path and try again. + linux_rdp_client_not_found: |- + An appropriate RDP client was not found. Vagrant requires either + `xfreerdp` or `rdesktop` in order to connect via RDP to the Vagrant + environment. Please ensure one of these applications is installed and + available on the path and try again. machine_action_locked: |- An action '%{action}' was attempted on the machine '%{name}', but another process is already executing an action on the machine.