guests/linux: try `id -g` to determine group as well [GH-2197]

This commit is contained in:
Mitchell Hashimoto 2013-09-16 20:51:09 -07:00
parent 42df2ed2c9
commit b9801f44a0
2 changed files with 28 additions and 10 deletions

View File

@ -17,6 +17,8 @@ BUG FIXES:
- core: Increase timeout for individual SSH connection to 60 seconds. [GH-2163] - core: Increase timeout for individual SSH connection to 60 seconds. [GH-2163]
- core: Call realpath after creating directory so NFS directory creation - core: Call realpath after creating directory so NFS directory creation
works. [GH-2196] works. [GH-2196]
- guests/linux: Try `id -g` in addition to `getent` for mounting
VirtualBox shared folders [GH-2197]
- hosts/arch: NFS exporting works properly, no exceptions. [GH-2161] - hosts/arch: NFS exporting works properly, no exceptions. [GH-2161]
- hosts/bsd: Use only `sudo` for writing NFS exports. This lets NFS - hosts/bsd: Use only `sudo` for writing NFS exports. This lets NFS
exports work if you have sudo privs but not `su`. [GH-2191] exports work if you have sudo privs but not `su`. [GH-2191]

View File

@ -6,13 +6,17 @@ module VagrantPlugins
expanded_guest_path = machine.guest.capability( expanded_guest_path = machine.guest.capability(
:shell_expand_guest_path, guestpath) :shell_expand_guest_path, guestpath)
# Determine the permission string to attach to the mount command mount_commands = []
mount_options = "-o uid=`id -u #{options[:owner]}`,gid=`getent group #{options[:group]} | cut -d: -f3`"
if options[:mount_options]
mount_options += ",#{options[:mount_options].join(",")}"
end
mount_command = "mount -t vboxsf #{mount_options} #{name} #{expanded_guest_path}" # First mount command uses getent to get the group
mount_options = "-o uid=`id -u #{options[:owner]}`,gid=`getent group #{options[:group]} | cut -d: -f3`"
mount_options += ",#{options[:mount_options].join(",")}" if options[:mount_options]
mount_commands << "mount -t vboxsf #{mount_options} #{name} #{expanded_guest_path}"
# Second mount command uses the old style `id -g`
mount_options = "-o uid=`id -u #{options[:owner]}`,gid=`id -g #{options[:group]}`"
mount_options += ",#{options[:mount_options].join(",")}" if options[:mount_options]
mount_commands << "mount -t vboxsf #{mount_options} #{name} #{expanded_guest_path}"
# Create the guest path if it doesn't exist # Create the guest path if it doesn't exist
machine.communicate.sudo("mkdir -p #{expanded_guest_path}") machine.communicate.sudo("mkdir -p #{expanded_guest_path}")
@ -22,8 +26,13 @@ module VagrantPlugins
attempts = 0 attempts = 0
while true while true
success = true success = true
machine.communicate.sudo(mount_command) do |type, data|
success = false if type == :stderr && data =~ /No such device/i mount_commands.each do |command|
machine.communicate.sudo(command) do |type, data|
success = false if type == :stderr && data =~ /No such device/i
end
break if success
end end
break if success break if success
@ -34,8 +43,15 @@ module VagrantPlugins
end end
# Chown the directory to the proper user # Chown the directory to the proper user
machine.communicate.sudo( chown_commands = []
"chown `id -u #{options[:owner]}`:`getent group #{options[:group]} | cut -d: -f3` #{expanded_guest_path}") chown_commands << "chown `id -u #{options[:owner]}`:`getent group #{options[:group]} " +
"| cut -d: -f3` #{expanded_guest_path}"
chown_commands << "chown `id -u #{options[:owner]}`:`id -g #{options[:group]} " +
"#{expanded_guest_path}"
exit_status = machine.communicate.sudo(chown_commands[0], error_check: false)
return if exit_status == 0
machine.communicate.sudo(chown_commands[1])
end end
end end
end end