class Vagrant::Action::Builtin::SyncedFolders

This middleware will setup the synced folders for the machine using the appropriate synced folder plugin.

Public Class Methods

new(app, env) click to toggle source
# File lib/vagrant/action/builtin/synced_folders.rb, line 15
def initialize(app, env)
  @app    = app
  @logger = Log4r::Logger.new("vagrant::action::builtin::synced_folders")
end

Public Instance Methods

call(env) click to toggle source
# File lib/vagrant/action/builtin/synced_folders.rb, line 20
def call(env)
  folders = synced_folders(env[:machine])

  folders.each do |impl_name, fs|
    @logger.info("Synced Folder Implementation: #{impl_name}")

    fs.each do |id, data|
      # Log every implementation and their paths
      @logger.info("  - #{id}: #{data[:hostpath]} => #{data[:guestpath]}")
    end
  end

  # Go through each folder and make sure to create it if
  # it does not exist on host
  folders.each do |_, fs|
    fs.each do |id, data|
      data[:hostpath] = File.expand_path(
        data[:hostpath], env[:root_path])

      # Expand the symlink if this is a path that exists
      if File.file?(data[:hostpath])
        data[:hostpath] = File.realpath(data[:hostpath])
      end

      # Create the hostpath if it doesn't exist and we've been told to
      if !File.directory?(data[:hostpath]) && data[:create]
        @logger.info("Creating shared folder host directory: #{data[:hostpath]}")
        begin
          Pathname.new(data[:hostpath]).mkpath
        rescue Errno::EACCES
          raise Vagrant::Errors::SharedFolderCreateFailed,
            path: data[:hostpath]
        end
      end

      if File.directory?(data[:hostpath])
        data[:hostpath] = File.realpath(data[:hostpath])
        data[:hostpath] = Util::Platform.fs_real_path(data[:hostpath]).to_s
      end
    end
  end

  # Build up the instances of the synced folders. We do this once
  # so that they can store state.
  folders = folders.map do |impl_name, fs|
    instance = plugins[impl_name.to_sym][0].new
    [instance, impl_name, fs]
  end

  # Go through each folder and prepare the folders
  folders.each do |impl, impl_name, fs|
    @logger.info("Invoking synced folder prepare for: #{impl_name}")
    impl.prepare(env[:machine], fs, impl_opts(impl_name, env))
  end

  # Continue, we need the VM to be booted.
  @app.call(env)

  # Once booted, setup the folder contents
  folders.each do |impl, impl_name, fs|
    @logger.info("Invoking synced folder enable: #{impl_name}")
    impl.enable(env[:machine], fs, impl_opts(impl_name, env))
  end
end