diff --git a/lib/vagrant/hosts.rb b/lib/vagrant/hosts.rb index fb3b38856..a5115a957 100644 --- a/lib/vagrant/hosts.rb +++ b/lib/vagrant/hosts.rb @@ -3,6 +3,7 @@ module Vagrant autoload :Base, 'vagrant/hosts/base' autoload :Arch, 'vagrant/hosts/arch' autoload :BSD, 'vagrant/hosts/bsd' + autoload :FreeBSD,'vagrant/hosts/freebsd' autoload :Fedora, 'vagrant/hosts/fedora' autoload :Linux, 'vagrant/hosts/linux' end diff --git a/lib/vagrant/hosts/bsd.rb b/lib/vagrant/hosts/bsd.rb index d84711482..bee7187ae 100644 --- a/lib/vagrant/hosts/bsd.rb +++ b/lib/vagrant/hosts/bsd.rb @@ -8,6 +8,7 @@ module Vagrant include Util::Retryable def self.distro_dispatch + return FreeBSD if Util::Platform.freebsd? return self if Util::Platform.darwin? || Util::Platform.bsd? end diff --git a/lib/vagrant/hosts/freebsd.rb b/lib/vagrant/hosts/freebsd.rb new file mode 100644 index 000000000..f61f1bf04 --- /dev/null +++ b/lib/vagrant/hosts/freebsd.rb @@ -0,0 +1,51 @@ +require 'vagrant/util/platform' + +module Vagrant + module Hosts + # Represents a FreeBSD host + class FreeBSD < BSD + include Util + include Util::Retryable + + def nfs_export(ip, folders) + output = TemplateRenderer.render('nfs/exports', + :uuid => env.vm.uuid, + :ip => ip, + :folders => folders) + + # The sleep ensures that the output is truly flushed before any `sudo` + # commands are issued. + env.ui.info I18n.t("vagrant.hosts.bsd.nfs_export.prepare") + sleep 0.5 + + output.split("\n").each do |line| + # This should only ask for administrative permission once, even + # though its executed in multiple subshells. + line = line.gsub('"', '\"') + system(%Q[sudo su root -c "echo '#{line}' >> /etc/exports"]) + end + + # We run restart here instead of "update" just in case nfsd + # is not starting + system("sudo /etc/rc.d/mountd onereload") + end + + end + + def nfs_cleanup + return if !File.exist?("/etc/exports") + + retryable(:tries => 10, :on => TypeError) do + system("cat /etc/exports | grep 'VAGRANT-BEGIN: #{env.vm.uuid}' > /dev/null 2>&1") + + if $?.to_i == 0 + # Use sed to just strip out the block of code which was inserted + # by Vagrant + system("sudo sed -e '/^# VAGRANT-BEGIN: #{env.vm.uuid}/,/^# VAGRANT-END: #{env.vm.uuid}/ d' -ibak /etc/exports") + end + + system("sudo /etc/rc.d/mountd onereload") + end + end + end +end diff --git a/lib/vagrant/util/platform.rb b/lib/vagrant/util/platform.rb index 76be1a665..36df3f804 100644 --- a/lib/vagrant/util/platform.rb +++ b/lib/vagrant/util/platform.rb @@ -13,7 +13,7 @@ module Vagrant platform.include?("darwin9") end - [:darwin, :bsd, :linux].each do |type| + [:darwin, :bsd, :freebsd, :linux].each do |type| define_method("#{type}?") do platform.include?(type.to_s) end