vagrant-nfs_guest_vbfix 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +84 -0
  7. data/Rakefile +3 -0
  8. data/example_box/Vagrantfile +26 -0
  9. data/example_box/vagrant_share/.keep +0 -0
  10. data/lib/vagrant-nfs_guest.rb +20 -0
  11. data/lib/vagrant-nfs_guest/action/mount_nfs.rb +64 -0
  12. data/lib/vagrant-nfs_guest/action/unmount_nfs.rb +28 -0
  13. data/lib/vagrant-nfs_guest/config.rb +32 -0
  14. data/lib/vagrant-nfs_guest/errors.rb +33 -0
  15. data/lib/vagrant-nfs_guest/guests/debian/cap/nfs_server.rb +24 -0
  16. data/lib/vagrant-nfs_guest/guests/debian/plugin.rb +25 -0
  17. data/lib/vagrant-nfs_guest/guests/linux/cap/nfs_server.rb +170 -0
  18. data/lib/vagrant-nfs_guest/guests/linux/cap/read_user_ids.rb +29 -0
  19. data/lib/vagrant-nfs_guest/guests/linux/plugin.rb +50 -0
  20. data/lib/vagrant-nfs_guest/guests/redhat/cap/nfs_server.rb +85 -0
  21. data/lib/vagrant-nfs_guest/guests/redhat/plugin.rb +35 -0
  22. data/lib/vagrant-nfs_guest/guests/ubuntu/cap/nfs_server.rb +18 -0
  23. data/lib/vagrant-nfs_guest/guests/ubuntu/plugin.rb +20 -0
  24. data/lib/vagrant-nfs_guest/hosts/bsd/cap/mount_nfs.rb +34 -0
  25. data/lib/vagrant-nfs_guest/hosts/bsd/cap/unmount_nfs.rb +35 -0
  26. data/lib/vagrant-nfs_guest/hosts/bsd/plugin.rb +20 -0
  27. data/lib/vagrant-nfs_guest/hosts/linux/cap/mount_nfs.rb +34 -0
  28. data/lib/vagrant-nfs_guest/hosts/linux/cap/unmount_nfs.rb +36 -0
  29. data/lib/vagrant-nfs_guest/hosts/linux/plugin.rb +20 -0
  30. data/lib/vagrant-nfs_guest/plugin.rb +109 -0
  31. data/lib/vagrant-nfs_guest/providers/docker/cap/nfs_settings.rb +19 -0
  32. data/lib/vagrant-nfs_guest/providers/docker/plugin.rb +15 -0
  33. data/lib/vagrant-nfs_guest/providers/parallels/cap/nfs_settings.rb +17 -0
  34. data/lib/vagrant-nfs_guest/providers/parallels/plugin.rb +15 -0
  35. data/lib/vagrant-nfs_guest/providers/virtualbox/cap/nfs_settings.rb +89 -0
  36. data/lib/vagrant-nfs_guest/providers/virtualbox/plugin.rb +15 -0
  37. data/lib/vagrant-nfs_guest/synced_folder.rb +96 -0
  38. data/lib/vagrant-nfs_guest/version.rb +5 -0
  39. data/templates/locales/en.yml +69 -0
  40. data/templates/nfs_guest/guest_export_linux.erb +7 -0
  41. data/vagrant-nfs_guest.gemspec +23 -0
  42. metadata +114 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4795e050e128c0868a4d886dfc5a40646c6399cd
4
+ data.tar.gz: 8bafef786bdb6f24c384c477f714625f94afb60b
5
+ SHA512:
6
+ metadata.gz: 84cd21286772e147640ca26b4bcddf220f67d090fe8e9aa62e8c43a10820e1100f30883d4e2e282bee067e1e8e696d421fec4b1b6ddb5c573bc1567f9bd704bd
7
+ data.tar.gz: 4e7cc40af53adcc800434bb8b6e5acd97cd2dc02928ca119c04e9beea789b43718117036256f8b5a539ab7da2fc6ba38f05badd82f17dc3cb0c6f95b6191079a
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .vagrant
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.2.3
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :development do
4
+ # We depend on Vagrant for development, but we don't add it as a
5
+ # gem dependency because we expect to be installed within the
6
+ # Vagrant environment itself using `vagrant plugin`.
7
+ gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
8
+ end
9
+
10
+ group :plugins do
11
+ gem "vagrant-nfs_guest_vbfix", path: "."
12
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Alan Garfield
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Vagrant-NFS_Guest
2
+
3
+ ## What's New?
4
+
5
+ - NEW: added untested support for Docker providers (Please raise any issues if they don't work!).
6
+ - NEW: added Parallels provider support
7
+ - NEW: Redhat/CentOS guest support added.
8
+ - FIXED: suspend and resume with 'up' instead of 'resume' fixed.
9
+ - Supports Vagrant > 1.6.
10
+ - Handles actions ```up```, ```halt```, ```destroy```, ```suspend```, ```resume``` and ```package``` properly.
11
+ - Uses retryable() for host to guest communications allow more fault tolerance.
12
+ - Better error messages and handling.
13
+ - Re-organisation of modules and class to better match Vagrant proper.
14
+ - Simplified the plugin events binding.
15
+ - Will install the NFS daemon on the guest if the guest capability is supported (Ubuntu and Debian only at this stage).
16
+ - Supports BSD/OSX, and Linux based Hosts that support NFS mounting.
17
+
18
+ ## Overview
19
+
20
+ Allows a guest VM to export synced folders via NFS and the host to mount them.
21
+
22
+ Basically it's just the usual NFS synced folders in Vagrant but the roles are reversed.
23
+
24
+ Guest VMs we've tested include:
25
+ - Ubuntu (precise, trusty)
26
+ - CentOS (6.5, 6.6, 7)
27
+ - Debian (wheezy)
28
+ - other Linux based guests may work fine with the generic Linux support. But no guarantee
29
+
30
+ Hosts we've tested include:
31
+ - OSX (Mavericks, Yosemite, El Capitan)
32
+ - Ubuntu (precise, trusty)
33
+ - other Linux based OSs should work fine, but will need testing, again no guarantee
34
+
35
+ We're happy to receive pull-request to support alternatives hosts and guests. To implement this support it's relatively trivial if you look in ./lib/hosts and ./lib/guests.
36
+
37
+ ## Installation
38
+
39
+ vagrant plugin install vagrant-nfs_guest
40
+
41
+ ## Install from sources
42
+
43
+ git clone https://github.com/Learnosity/vagrant-nfs_guest.git
44
+ cd vagrant-nfs_guest
45
+ bundle install
46
+ bundle exec rake build
47
+ vagrant plugin install pkg/vagrant-nfs_guest-VERSION.gem
48
+
49
+ ## Usage
50
+
51
+ To enable for example put similar in the Vagrantfile:
52
+
53
+ config.vm.synced_folder 'srv', '/srv', type: 'nfs_guest'
54
+
55
+ ## Building
56
+
57
+ We use 'chruby' to allow a virtual ruby environment for developement. The 'bundle' gem is needed to build and run
58
+
59
+ git clone https://github.com/Learnosity/vagrant-nfs_guest.git
60
+ cd vagrant-nfs_guest
61
+ bundle install
62
+ bundle exec vagrant
63
+
64
+ You can test your handy work using the ```example_box``` by doing the following:
65
+
66
+ cd ./example_box/
67
+ bundle exec vagrant up
68
+
69
+ You can ssh into the test VM using:
70
+
71
+ bundle exec vagrant ssh
72
+
73
+ ... and you can clean up with:
74
+
75
+ bundle exec vagrant destroy
76
+
77
+
78
+ ## Contributing
79
+
80
+ 1. Fork it
81
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
82
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
83
+ 4. Push to the branch (`git push origin my-new-feature`)
84
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,26 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
8
+
9
+ # Every Vagrant virtual environment requires a box to build off of.
10
+ config.vm.box = "ubuntu/trusty64" # ubuntu
11
+ #config.vm.box = "centos/7" # centos/7
12
+ #config.vm.box = "nrel/CentOS-6.5-x86_64" # centos/6.5
13
+
14
+ # Create a private network, which allows host-only access to the machine
15
+ # using a specific IP.
16
+ config.vm.network "private_network", ip: "192.168.55.10"
17
+
18
+ # Share an additional folder to the guest VM. The first argument is
19
+ # the path on the host to the actual folder. The second argument is
20
+ # the path on the guest to mount the folder. And the optional third
21
+ # argument is a set of non-required options.
22
+ config.vm.synced_folder '.', '/vagrant', disabled: true
23
+
24
+ config.vm.synced_folder './vagrant_share', '/vagrant', type: 'nfs_guest'
25
+
26
+ end
File without changes
@@ -0,0 +1,20 @@
1
+ require "pathname"
2
+
3
+ require "vagrant-nfs_guest/plugin"
4
+
5
+ module VagrantPlugins
6
+ module SyncedFolderNFSGuest
7
+ lib_path = Pathname.new(File.expand_path("../vagrant-nfs_guest", __FILE__))
8
+ autoload :Errors, lib_path.join("errors")
9
+
10
+ # This returns the path to the source of this plugin.
11
+ #
12
+ # @return [Pathname]
13
+ def self.source_root
14
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
15
+ end
16
+
17
+ I18n.load_path << File.expand_path("templates/locales/en.yml", source_root)
18
+ I18n.reload!
19
+ end
20
+ end
@@ -0,0 +1,64 @@
1
+ module VagrantPlugins
2
+ module SyncedFolderNFSGuest
3
+ module Action
4
+ class MountNFS
5
+
6
+ def initialize(app,env)
7
+ @app = app
8
+ @logger = Log4r::Logger.new("vagrant-nfs_guest::action::unmount_nfs")
9
+ end
10
+
11
+ def call(env)
12
+ @machine = env[:machine]
13
+
14
+ # because we're hooked into Vagrant::Action::Builtin::SyncedFolders and
15
+ # Vagrant::Action::Builtin::WaitForCommunicator we need to figure out
16
+ # if we're 'up'ing from 'poweroff' or 'up'ing from 'suspend'
17
+ # If 'poweroff' we get called twice once with state.id = 'poweroff' and
18
+ # again with state.id = 'running'. This toggle around @app.call() allows
19
+ # the second call to actually do the mount after the SyncFolder setup
20
+ # has completed properly. If 'running' well then we just do the mount
21
+ # as we're obvioulsy coming from a 'suspended' instance. Stupid bug.
22
+ if !env[:nfs_guest_first_state]
23
+ env[:nfs_guest_first_state] = @machine.state.id
24
+ end
25
+
26
+ @app.call(env)
27
+
28
+ # ... and also deal with 'reload' :weary:
29
+ if env[:nfs_guest_first_state] == :poweroff and env[:action_name] != :machine_action_reload
30
+ env[:nfs_guest_first_state] = @machine.state.id
31
+ return
32
+ end
33
+
34
+ if @machine.state.id == :running
35
+ if !@machine.provider.capability?(:nfs_settings)
36
+ raise SyncedFolderNFSGuest::Errors::ProviderNFSSettingsCapMissing
37
+ end
38
+
39
+ # grab the ips from the provider
40
+ host_ip, machine_ip = @machine.provider.capability(:nfs_settings)
41
+
42
+ raise Vagrant::Errors::NFSNoHostIP if !host_ip
43
+ raise Vagrant::Errors::NFSNoGuestIP if !machine_ip
44
+
45
+ machine_ip = [machine_ip] if !machine_ip.is_a?(Array)
46
+
47
+ if @machine.config.nfs_guest.verify_installed
48
+ if @machine.guest.capability?(:nfs_server_installed)
49
+ installed = @machine.guest.capability(:nfs_server_installed)
50
+ if installed
51
+ # Mount guest NFS folders
52
+ @machine.ui.info(I18n.t("vagrant_nfs_guest.actions.vm.nfs.mounting"))
53
+ folders = @machine.config.vm.synced_folders
54
+
55
+ @machine.env.host.capability(:nfs_mount, @machine.ui, @machine.id, machine_ip, folders)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,28 @@
1
+ module VagrantPlugins
2
+ module SyncedFolderNFSGuest
3
+ module Action
4
+ class UnmountNFS
5
+
6
+ def initialize(app,env)
7
+ @app = app
8
+ @logger = Log4r::Logger.new("vagrant-nfs_guest::action::unmount_nfs")
9
+ end
10
+
11
+ def call(env)
12
+ @machine = env[:machine]
13
+
14
+ if @machine.state.id == :running
15
+ # unmount any host mounted NFS folders
16
+ @machine.ui.info(I18n.t("vagrant_nfs_guest.actions.vm.nfs.unmounting"))
17
+ folders = @machine.config.vm.synced_folders
18
+
19
+ @machine.env.host.capability(:nfs_unmount, @machine.ui, folders)
20
+ end
21
+
22
+ @app.call(env)
23
+
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module SyncedFolderNFSGuest
5
+ class Config < Vagrant.plugin("2", :config)
6
+ attr_accessor :functional
7
+ attr_accessor :map_uid
8
+ attr_accessor :map_gid
9
+ attr_accessor :verify_installed
10
+
11
+ def initialize
12
+ super
13
+
14
+ @functional = UNSET_VALUE
15
+ @map_uid = UNSET_VALUE
16
+ @map_gid = UNSET_VALUE
17
+ @verify_installed = UNSET_VALUE
18
+ end
19
+
20
+ def finalize!
21
+ @functional = true if @functional == UNSET_VALUE
22
+ @map_uid = nil if @map_uid == UNSET_VALUE
23
+ @map_gid = nil if @map_gid == UNSET_VALUE
24
+ @verify_installed = true if @verify_installed == UNSET_VALUE
25
+ end
26
+
27
+ def to_s
28
+ "NFS_Guest"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module SyncedFolderNFSGuest
5
+ module Errors
6
+
7
+ class Error < Vagrant::Errors::VagrantError
8
+ error_namespace("vagrant_nfs_guest.errors")
9
+ end
10
+
11
+ class GuestNFSError < Error
12
+ error_key(:nfs_server_missing)
13
+ error_key(:nfs_start_failed)
14
+ error_key(:nfs_apply_failed)
15
+ error_key(:nfs_update_exports_failed)
16
+ error_key(:nfs_guest_clean)
17
+ error_key(:nfs_create_mounts_failed)
18
+ end
19
+
20
+ class NFSServerMissing < Error
21
+ error_key(:nfs_server_missing)
22
+ end
23
+
24
+ class NFSServerNotInstalledInGuest < Error
25
+ error_key(:nfs_server_not_installed)
26
+ end
27
+
28
+ class ProviderNFSSettingsCapMissing < Error
29
+ error_key(:provider_missing_nfs_setting_cap)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module VagrantPlugins
2
+ module SyncedFolderNFSGuest
3
+ module GuestDebian
4
+ module Cap
5
+ class NFSServer
6
+ def self.nfs_server_install(machine)
7
+ machine.communicate.sudo("apt-get update")
8
+ machine.communicate.sudo("apt-get -y install nfs-kernel-server")
9
+ end
10
+
11
+ def self.nfs_server_installed(machine)
12
+ machine.communicate.test("test -e /etc/init.d/nfs-kernel-server")
13
+ end
14
+
15
+ def self.nfs_test_command(machine)
16
+ machine.communicate.test(
17
+ "test -x /usr/sbin/exportfs"
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,25 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module SyncedFolderNFSGuest
5
+ class Plugin < Vagrant.plugin("2")
6
+ name "Debian guest"
7
+ description "Debian guest support."
8
+
9
+ guest_capability(:debian, :nfs_test_command) do
10
+ require_relative "cap/nfs_server"
11
+ GuestDebian::Cap::NFSServer
12
+ end
13
+
14
+ guest_capability(:debian, :nfs_server_installed) do
15
+ require_relative "cap/nfs_server"
16
+ GuestDebian::Cap::NFSServer
17
+ end
18
+
19
+ guest_capability(:debian, :nfs_server_install) do
20
+ require_relative "cap/nfs_server"
21
+ GuestDebian::Cap::NFSServer
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,170 @@
1
+ require "vagrant/util/retryable"
2
+
3
+ module VagrantPlugins
4
+ module SyncedFolderNFSGuest
5
+ module GuestLinux
6
+ module Cap
7
+ class NFSServer
8
+ extend Vagrant::Util::Retryable
9
+
10
+ def self.nfs_apply_command(machine)
11
+ machine.communicate.sudo(
12
+ "exportfs -r",
13
+ error_class: Errors::GuestNFSError,
14
+ error_key: :nfs_apply_failed
15
+ )
16
+ end
17
+
18
+ def self.nfs_start_command(machine)
19
+ machine.communicate.sudo(
20
+ "/etc/init.d/nfs-kernel-server start",
21
+ error_class: Errors::GuestNFSError,
22
+ error_key: :nfs_start_failed
23
+ )
24
+ end
25
+
26
+ def self.nfs_check_command(machine)
27
+ machine.communicate.test(
28
+ "/etc/init.d/nfs-kernel-server status"
29
+ )
30
+ end
31
+
32
+ def self.nfs_test_command(machine)
33
+ machine.communicate.test(
34
+ "which exportfs"
35
+ )
36
+ end
37
+
38
+ def self.nfs_exports_template(machine)
39
+ VagrantPlugins::SyncedFolderNFSGuest.source_root.join(
40
+ "templates/nfs_guest/guest_export_linux")
41
+ end
42
+
43
+ def self.nfs_capable?(machine)
44
+ machine.guest.capability(:nfs_test_command)
45
+ end
46
+
47
+ def self.nfs_apply_changes!(machine)
48
+ machine.guest.capability(:nfs_apply_command)
49
+ end
50
+
51
+ def self.nfs_start!(machine)
52
+ machine.guest.capability(:nfs_start_command)
53
+ end
54
+
55
+ def self.nfs_running?(machine)
56
+ machine.guest.capability(:nfs_check_command)
57
+ end
58
+
59
+ def self.nfs_export(machine, ip, folders)
60
+ if !nfs_capable?(machine)
61
+ raise Errors::NFSServerMissing
62
+ end
63
+
64
+ if machine.guest.capability?(:nfs_setup_firewall)
65
+ machine.ui.info I18n.t("vagrant_nfs_guest.guests.linux.nfs_setup_firewall")
66
+ machine.guest.capability(:nfs_setup_firewall, ip)
67
+ end
68
+
69
+ nfs_exports_template = machine.guest.capability(:nfs_exports_template)
70
+
71
+ nfs_opts_setup(machine, folders)
72
+
73
+ output = Vagrant::Util::TemplateRenderer.render(
74
+ nfs_exports_template,
75
+ uuid: machine.id,
76
+ ips: [ip],
77
+ folders: folders,
78
+ user: Process.uid)
79
+
80
+ machine.ui.info I18n.t("vagrant_nfs_guest.guests.linux.nfs_export")
81
+ sleep 0.5
82
+
83
+ nfs_cleanup(machine)
84
+
85
+ retryable(on: Errors::GuestNFSError, tries: 8, sleep: 3) do
86
+ output.split("\n").each do |line|
87
+ machine.communicate.sudo(
88
+ %Q[echo '#{line}' >> /etc/exports],
89
+ error_class: Errors::GuestNFSError,
90
+ error_key: :nfs_update_exports_failed
91
+ )
92
+ end
93
+
94
+ if nfs_running?(machine)
95
+ nfs_apply_changes!(machine)
96
+ else
97
+ nfs_start!(machine)
98
+ end
99
+ end
100
+ end
101
+
102
+ def self.nfs_cleanup(machine)
103
+ return if !nfs_capable?(machine)
104
+
105
+ id = machine.id
106
+ user = Process.uid
107
+
108
+ # Use sed to just strip out the block of code which was inserted
109
+ # by Vagrant
110
+ #
111
+ machine.communicate.sudo(
112
+ "sed -r -e '/^# VAGRANT(-NFS_GUEST)?-BEGIN/,/^# VAGRANT(-NFS_GUEST)?-END/ d' -ibak /etc/exports",
113
+ error_class: Errors::GuestNFSError,
114
+ error_key: :nfs_guest_clean
115
+ )
116
+ end
117
+
118
+ def self.nfs_opts_setup(machine, folders)
119
+ folders.each do |k, opts|
120
+ if !opts[:linux__nfs_options]
121
+ opts[:linux__nfs_options] ||= ["rw", "no_subtree_check", "all_squash", "insecure"]
122
+ end
123
+
124
+ # Only automatically set anonuid/anongid if they weren't
125
+ # explicitly set by the user.
126
+ hasgid = false
127
+ hasuid = false
128
+ opts[:linux__nfs_options].each do |opt|
129
+ hasgid = !!(opt =~ /^anongid=/) if !hasgid
130
+ hasuid = !!(opt =~ /^anonuid=/) if !hasuid
131
+ end
132
+
133
+ opts[:linux__nfs_options] << "anonuid=#{opts[:map_uid]}" if !hasuid
134
+ opts[:linux__nfs_options] << "anongid=#{opts[:map_gid]}" if !hasgid
135
+ opts[:linux__nfs_options] << "fsid=#{opts[:uuid]}"
136
+
137
+ # Expand the guest path so we can handle things like "~/vagrant"
138
+ expanded_guest_path = machine.guest.capability(
139
+ :shell_expand_guest_path, opts[:guestpath])
140
+
141
+ retryable(on: Errors::GuestNFSError, tries: 8, sleep: 3) do
142
+ # Do the actual creating and mounting
143
+ machine.communicate.sudo(
144
+ "mkdir -p #{expanded_guest_path}",
145
+ error_class: Errors::GuestNFSError,
146
+ error_key: :nfs_create_mounts_failed
147
+ )
148
+
149
+ # Folder options
150
+ opts[:owner] ||= machine.ssh_info[:username]
151
+ opts[:group] ||= machine.ssh_info[:username]
152
+
153
+ machine.communicate.sudo(
154
+ "chown -R #{opts[:owner]}:#{opts[:group]} #{expanded_guest_path}",
155
+ error_class: Errors::GuestNFSError,
156
+ error_key: :nfs_create_mounts_failed
157
+ )
158
+ machine.communicate.sudo(
159
+ "chmod 2775 #{expanded_guest_path}",
160
+ error_class: Errors::GuestNFSError,
161
+ error_key: :nfs_create_mounts_failed
162
+ )
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end