diff --git a/plugins/guests/linux/cap/persist_mount_shared_folder.rb b/plugins/guests/linux/cap/persist_mount_shared_folder.rb index ac37b1fbf..c69d95309 100644 --- a/plugins/guests/linux/cap/persist_mount_shared_folder.rb +++ b/plugins/guests/linux/cap/persist_mount_shared_folder.rb @@ -34,13 +34,12 @@ module VagrantPlugins mount_options, _, _ = data[:plugin].capability( :mount_options, name, guest_path, data) if data[:plugin].capability?(:mount_name) - name = data[:plugin].capability(:mount_name, data) + name = data[:plugin].capability(:mount_name, name, data) end else next end - mount_options = "#{mount_options},nofail" { name: name, mount_point: guest_path, diff --git a/plugins/providers/virtualbox/cap/mount_options.rb b/plugins/providers/virtualbox/cap/mount_options.rb index 587b48d9d..39bb4c535 100644 --- a/plugins/providers/virtualbox/cap/mount_options.rb +++ b/plugins/providers/virtualbox/cap/mount_options.rb @@ -22,6 +22,7 @@ module VagrantPlugins mount_options << "uid=#{mount_uid}" mount_options << "gid=#{mount_gid}" + mount_options << "_netdev" mount_options = mount_options.join(',') return mount_options, mount_uid, mount_gid end @@ -29,6 +30,10 @@ module VagrantPlugins def self.mount_type(machine) return VB_MOUNT_TYPE end + + def self.mount_name(machine, name, data) + name.gsub(/[\s\/\\]/,'_').sub(/^_/, '') + end end end end diff --git a/plugins/providers/virtualbox/plugin.rb b/plugins/providers/virtualbox/plugin.rb index ad48bd083..8d63e6d9f 100644 --- a/plugins/providers/virtualbox/plugin.rb +++ b/plugins/providers/virtualbox/plugin.rb @@ -78,6 +78,11 @@ module VagrantPlugins require_relative "cap/mount_options" Cap::MountOptions end + + synced_folder_capability(:virtualbox, "mount_name") do + require_relative "cap/mount_options" + Cap::MountOptions + end end autoload :Action, File.expand_path("../action", __FILE__) diff --git a/plugins/synced_folders/smb/cap/mount_options.rb b/plugins/synced_folders/smb/cap/mount_options.rb index 7f4ecdf41..4c0adcc49 100644 --- a/plugins/synced_folders/smb/cap/mount_options.rb +++ b/plugins/synced_folders/smb/cap/mount_options.rb @@ -36,7 +36,7 @@ module VagrantPlugins end mnt_opts << "_netdev" mnt_opts = merge_mount_options(mnt_opts, options[:mount_options] || []) - + mnt_opts << "nofail" mount_options = mnt_opts.join(",") return mount_options, mount_uid, mount_gid end @@ -45,7 +45,7 @@ module VagrantPlugins return MOUNT_TYPE end - def self.mount_name(machine, data) + def self.mount_name(machine, name, data) data[:smb_host] ||= machine.guest.capability( :choose_addressable_ip_addr, candidate_ips) "//#{data[:smb_host]}/#{data[:smb_id]}" diff --git a/test/unit/plugins/guests/linux/cap/persist_mount_shared_folder_test.rb b/test/unit/plugins/guests/linux/cap/persist_mount_shared_folder_test.rb index 36240612c..62ed79be2 100644 --- a/test/unit/plugins/guests/linux/cap/persist_mount_shared_folder_test.rb +++ b/test/unit/plugins/guests/linux/cap/persist_mount_shared_folder_test.rb @@ -29,7 +29,7 @@ describe "VagrantPlugins::GuestLinux::Cap::PersistMountSharedFolder" do let (:folders) { { :folder_type => fstab_folders } } - let(:expected_mount_options) { "uid=#{options_uid},gid=#{options_gid},nofail" } + let(:expected_mount_options) { "uid=#{options_uid},gid=#{options_gid}" } before do allow(machine).to receive(:communicate).and_return(comm) diff --git a/test/unit/plugins/providers/virtualbox/cap/mount_options_test.rb b/test/unit/plugins/providers/virtualbox/cap/mount_options_test.rb index 430c409c4..580fbd52b 100644 --- a/test/unit/plugins/providers/virtualbox/cap/mount_options_test.rb +++ b/test/unit/plugins/providers/virtualbox/cap/mount_options_test.rb @@ -49,7 +49,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do let(:mount_owner){ 2000 } it "generates the expected mount command using mount_owner directly" do out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_mount_options).to eq("uid=#{mount_owner},gid=#{mount_gid}") + expect(out_mount_options).to eq("uid=#{mount_owner},gid=#{mount_gid},_netdev") expect(out_mount_uid).to eq(mount_owner) expect(out_mount_gid).to eq(mount_gid) end @@ -59,7 +59,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do let(:mount_owner){ "2000" } it "generates the expected mount command using mount_owner directly" do out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_mount_options).to eq("uid=#{mount_owner},gid=#{mount_gid}") + expect(out_mount_options).to eq("uid=#{mount_owner},gid=#{mount_gid},_netdev") expect(out_mount_uid).to eq(mount_owner) expect(out_mount_gid).to eq(mount_gid) end @@ -78,7 +78,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do it "generates the expected mount command using mount_group directly" do out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_mount_options).to eq("uid=#{mount_uid},gid=#{mount_group}") + expect(out_mount_options).to eq("uid=#{mount_uid},gid=#{mount_group},_netdev") expect(out_mount_uid).to eq(mount_uid) expect(out_mount_gid).to eq(mount_group) end @@ -89,7 +89,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do it "generates the expected mount command using mount_group directly" do out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_mount_options).to eq("uid=#{mount_uid},gid=#{mount_group}") + expect(out_mount_options).to eq("uid=#{mount_uid},gid=#{mount_group},_netdev") expect(out_mount_uid).to eq(mount_uid) expect(out_mount_gid).to eq(mount_group) end @@ -103,7 +103,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do expect(comm).to receive(:execute).with("getent group #{mount_group}", anything).and_raise(Vagrant::Errors::VirtualBoxMountFailed, {command: '', output: ''}) expect(comm).to receive(:execute).with("id -g #{mount_owner}", anything).and_yield(:stdout, "1").and_return(0) out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_mount_options).to eq("uid=#{mount_uid},gid=1") + expect(out_mount_options).to eq("uid=#{mount_uid},gid=1,_netdev") end end @@ -122,7 +122,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do expect(comm).to receive(:execute).with("id -u #{mount_owner}", anything).and_yield(:stdout, mount_uid) expect(comm).to receive(:execute).with("getent group #{mount_group}", anything).and_yield(:stdout, "vagrant:x:#{mount_gid}:") out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options.merge(mount_options: ["ro"])) - expect(out_mount_options).to eq("ro,uid=#{mount_uid},gid=#{mount_gid}") + expect(out_mount_options).to eq("ro,uid=#{mount_uid},gid=#{mount_gid},_netdev") expect(out_mount_uid).to eq(mount_uid) expect(out_mount_gid).to eq(mount_gid) end @@ -142,7 +142,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do expect(comm).not_to receive(:execute).with("id -u #{mount_owner}", anything).and_yield(:stdout, mount_uid) expect(comm).to receive(:execute).with("getent group #{mount_group}", anything).and_yield(:stdout, "vagrant:x:#{mount_gid}:") out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options.merge(mount_options: ["uid=#{options_uid}"]) ) - expect(out_mount_options).to eq("uid=#{options_uid},gid=#{mount_gid}") + expect(out_mount_options).to eq("uid=#{options_uid},gid=#{mount_gid},_netdev") expect(out_mount_uid).to eq(options_uid) expect(out_mount_gid).to eq(mount_gid) end @@ -155,7 +155,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do expect(comm).to receive(:execute).with("id -u #{mount_owner}", anything).and_yield(:stdout, mount_uid) expect(comm).not_to receive(:execute).with("getent group #{mount_group}", anything).and_yield(:stdout, "vagrant:x:#{mount_gid}:") out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options.merge(mount_options: ["gid=#{options_gid}"]) ) - expect(out_mount_options).to eq("uid=#{mount_uid},gid=#{options_gid}") + expect(out_mount_options).to eq("uid=#{mount_uid},gid=#{options_gid},_netdev") expect(out_mount_uid).to eq(mount_uid) expect(out_mount_gid).to eq(options_gid) end @@ -169,7 +169,7 @@ describe "VagrantPlugins::ProviderVirtualBox::Cap::MountOptions" do expect(comm).not_to receive(:execute).with("id -u #{mount_owner}", anything).and_yield(:stdout, mount_uid) expect(comm).not_to receive(:execute).with("getent group #{mount_group}", anything).and_yield(:stdout, "vagrant:x:#{options_gid}:") out_mount_options, out_mount_uid, out_mount_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options.merge(mount_options: ["uid=#{options_uid}", "gid=#{options_gid}"]) ) - expect(out_mount_options).to eq("uid=#{options_uid},gid=#{options_gid}") + expect(out_mount_options).to eq("uid=#{options_uid},gid=#{options_gid},_netdev") expect(out_mount_uid).to eq(options_uid) expect(out_mount_gid).to eq(options_gid) end diff --git a/test/unit/plugins/synced_folders/smb/caps/mount_options_test.rb b/test/unit/plugins/synced_folders/smb/caps/mount_options_test.rb index c62203407..095c41534 100644 --- a/test/unit/plugins/synced_folders/smb/caps/mount_options_test.rb +++ b/test/unit/plugins/synced_folders/smb/caps/mount_options_test.rb @@ -44,7 +44,7 @@ describe VagrantPlugins::SyncedFolderSMB::Cap::MountOptions do it "generates the expected default mount command" do out_opts, out_uid, out_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_opts).to eq("sec=ntlmssp,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,_netdev") + expect(out_opts).to eq("sec=ntlmssp,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,_netdev,nofail") expect(out_uid).to eq(mount_uid) expect(out_gid).to eq(mount_gid) end @@ -52,7 +52,7 @@ describe VagrantPlugins::SyncedFolderSMB::Cap::MountOptions do it "includes provided mount options" do folder_options[:mount_options] =["ro"] out_opts, out_uid, out_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_opts).to eq("sec=ntlmssp,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,_netdev,ro") + expect(out_opts).to eq("sec=ntlmssp,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,_netdev,ro,nofail") expect(out_uid).to eq(mount_uid) expect(out_gid).to eq(mount_gid) end @@ -60,7 +60,7 @@ describe VagrantPlugins::SyncedFolderSMB::Cap::MountOptions do it "overwrites default mount options" do folder_options[:mount_options] =["ro", "sec=custom"] out_opts, out_uid, out_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_opts).to eq("sec=custom,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,_netdev,ro") + expect(out_opts).to eq("sec=custom,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,_netdev,ro,nofail") expect(out_uid).to eq(mount_uid) expect(out_gid).to eq(mount_gid) end @@ -68,7 +68,7 @@ describe VagrantPlugins::SyncedFolderSMB::Cap::MountOptions do it "does not add mfsymlinks option if env var VAGRANT_DISABLE_SMBMFSYMLINKS exists" do expect(ENV).to receive(:[]).with("VAGRANT_DISABLE_SMBMFSYMLINKS").and_return(false) out_opts, out_uid, out_gid = cap.mount_options(machine, mount_name, mount_guest_path, folder_options) - expect(out_opts).to eq("sec=ntlmssp,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,mfsymlinks,_netdev") + expect(out_opts).to eq("sec=ntlmssp,credentials=/etc/smb_creds_vagrant,uid=1000,gid=1000,mfsymlinks,_netdev,nofail") expect(out_uid).to eq(mount_uid) expect(out_gid).to eq(mount_gid) end