Add warning message for VirtualBox shared folders option.

Display warning to user about the VirtualBox SharedFoldersEnableSymlinksCreate
option with link to VirtualBox documentation and instructions on how the
setting can be disabled.
This commit is contained in:
Chris Roberts 2018-01-20 06:51:59 -08:00
parent 81c855b797
commit 780673c6fe
3 changed files with 126 additions and 7 deletions

View File

@ -1,3 +1,4 @@
require "fileutils"
require "vagrant/util/platform" require "vagrant/util/platform"
module VagrantPlugins module VagrantPlugins
@ -97,35 +98,51 @@ module VagrantPlugins
# transient. # transient.
def share_folders(machine, folders, transient) def share_folders(machine, folders, transient)
defs = [] defs = []
warn_user_symlink = false
folders.each do |id, data| folders.each do |id, data|
hostpath = data[:hostpath] hostpath = data[:hostpath]
if !data[:hostpath_exact] if !data[:hostpath_exact]
hostpath = Vagrant::Util::Platform.cygwin_windows_path(hostpath) hostpath = Vagrant::Util::Platform.cygwin_windows_path(hostpath)
end end
sharefoldersenablesymlinkscreate = true enable_symlink_create = true
if ENV['VAGRANT_DISABLE_VBOXSYMLINKCREATE'] if ENV['VAGRANT_DISABLE_VBOXSYMLINKCREATE']
sharefoldersenablesymlinkscreate = false enable_symlink_create = false
end end
unless data[:SharedFoldersEnableSymlinksCreate].nil? unless data[:SharedFoldersEnableSymlinksCreate].nil?
sharefoldersenablesymlinkscreate = data[:SharedFoldersEnableSymlinksCreate] enable_symlink_create = data[:SharedFoldersEnableSymlinksCreate]
end end
warn_user_symlink ||= enable_symlink_create
# Only setup the shared folders that match our transient level # Only setup the shared folders that match our transient level
if (!!data[:transient]) == transient if (!!data[:transient]) == transient
defs << { defs << {
name: os_friendly_id(id), name: os_friendly_id(id),
hostpath: hostpath.to_s, hostpath: hostpath.to_s,
transient: transient, transient: transient,
SharedFoldersEnableSymlinksCreate: sharefoldersenablesymlinkscreate SharedFoldersEnableSymlinksCreate: enable_symlink_create
} }
end end
end end
if warn_user_symlink
display_symlink_create_warning(machine.env)
end
driver(machine).share_folders(defs) driver(machine).share_folders(defs)
end end
def display_symlink_create_warning(env)
d_file = env.data_dir.join("vbox_symlink_create_warning")
if !d_file.exist?
FileUtils.touch(d_file.to_path)
env.ui.warn(I18n.t("vagrant.virtualbox.warning.shared_folder_symlink_create"))
end
end
end end
end end
end end

View File

@ -329,7 +329,22 @@ en:
invalid_event: |- invalid_event: |-
%{event} is not a valid event for customization. Valid events %{event} is not a valid event for customization. Valid events
are: %{valid_events} are: %{valid_events}
warning:
shared_folder_symlink_create: |-
Vagrant is currently configured to create VirtualBox synced folders with
the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant
guest is not trusted, you may want to disable this option. For more
information on this option, please refer to the VirtualBox manual:
https://www.virtualbox.org/manual/ch04.html#sharedfolders
This option can be disabled globally with an environment variable:
VAGRANT_DISABLE_VBOXSYMLINKCREATE=1
or on a per folder basis within the Vagrantfile:
config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false
general: general:
batch_notify_error: |- batch_notify_error: |-
An error occurred. The error will be shown after all tasks complete. An error occurred. The error will be shown after all tasks complete.

View File

@ -19,7 +19,7 @@ describe VagrantPlugins::ProviderVirtualBox::SyncedFolder do
machine.provider_config.finalize! machine.provider_config.finalize!
end end
describe "usable" do describe "#usable?" do
it "should be with virtualbox provider" do it "should be with virtualbox provider" do
allow(machine).to receive(:provider_name).and_return(:virtualbox) allow(machine).to receive(:provider_name).and_return(:virtualbox)
expect(subject).to be_usable(machine) expect(subject).to be_usable(machine)
@ -36,7 +36,7 @@ describe VagrantPlugins::ProviderVirtualBox::SyncedFolder do
end end
end end
describe "prepare" do describe "#prepare" do
let(:driver) { double("driver") } let(:driver) { double("driver") }
let(:provider) { double("driver", driver: driver) } let(:provider) { double("driver", driver: driver) }
let(:folders) { {"/folder"=> let(:folders) { {"/folder"=>
@ -61,6 +61,8 @@ describe VagrantPlugins::ProviderVirtualBox::SyncedFolder do
before do before do
allow(machine).to receive(:provider).and_return(provider) allow(machine).to receive(:provider).and_return(provider)
allow(machine).to receive(:env)
allow(subject).to receive(:display_symlink_create_warning)
end end
it "should prepare and share the folders" do it "should prepare and share the folders" do
@ -88,7 +90,7 @@ describe VagrantPlugins::ProviderVirtualBox::SyncedFolder do
end end
end end
describe "os_friendly_id" do describe "#os_friendly_id" do
it "should not replace normal chars" do it "should not replace normal chars" do
expect(subject.send(:os_friendly_id, 'perfectly_valid0_name')).to eq('perfectly_valid0_name') expect(subject.send(:os_friendly_id, 'perfectly_valid0_name')).to eq('perfectly_valid0_name')
end end
@ -113,4 +115,89 @@ describe VagrantPlugins::ProviderVirtualBox::SyncedFolder do
expect(subject.send(:os_friendly_id, 'foo\\bar')).to eq('foo_bar') expect(subject.send(:os_friendly_id, 'foo\\bar')).to eq('foo_bar')
end end
end end
describe "#share_folders" do
let(:folders){ {'folder1' => {hostpath: '/vagrant', transient: true},
'folder2' => {hostpath: '/vagrant2', transient: false}} }
let(:symlink_create_disable){ nil }
let(:driver){ double("driver") }
before do
allow(subject).to receive(:display_symlink_create_warning)
allow(machine).to receive(:env)
allow(subject).to receive(:driver).and_return(driver)
allow(driver).to receive(:share_folders)
allow(ENV).to receive(:[]).with("VAGRANT_DISABLE_VBOXSYMLINKCREATE").and_return(symlink_create_disable)
end
it "should only add transient folder" do
expect(driver).to receive(:share_folders).with(any_args) do |defs|
expect(defs.size).to eq(1)
end
subject.send(:share_folders, machine, folders, true)
end
it "should display symlink create warning" do
expect(subject).to receive(:display_symlink_create_warning)
subject.send(:share_folders, machine, folders, true)
end
context "with create symlink globally disabled" do
let(:symlink_create_disable){ "1" }
it "should not enable option within definitions" do
expect(driver).to receive(:share_folders).with(any_args) do |defs|
expect(defs.first[:SharedFoldersEnableSymlinksCreate]).to be(false)
end
subject.send(:share_folders, machine, folders, true)
end
it "should not display symlink warning" do
expect(subject).not_to receive(:display_symlink_create_warning)
subject.send(:share_folders, machine, folders, true)
end
end
end
describe "#display_symlink_create_warning" do
let(:env){ double("env", ui: double("ui"), data_dir: double("data_dir")) }
let(:gate_file){ double("gate") }
before{ allow(gate_file).to receive(:to_path).and_return("PATH") }
after{ subject.send(:display_symlink_create_warning, env) }
context "gate file does not exist" do
before do
allow(env.data_dir).to receive(:join).and_return(gate_file)
allow(gate_file).to receive(:exist?).and_return(false)
allow(FileUtils).to receive(:touch)
allow(env.ui).to receive(:warn)
end
it "should create file" do
expect(FileUtils).to receive(:touch).with("PATH")
end
it "should output warning to user" do
expect(env.ui).to receive(:warn)
end
end
context "gate file does exist" do
before do
allow(env.data_dir).to receive(:join).and_return(gate_file)
allow(gate_file).to receive(:exist?).and_return(true)
allow(FileUtils).to receive(:touch)
allow(env.ui).to receive(:warn)
end
it "should not create/update file" do
expect(FileUtils).not_to receive(:touch).with("PATH")
end
it "should not output warning to user" do
expect(env.ui).not_to receive(:warn)
end
end
end
end end