class VagrantPlugins::ProviderLibvirt::Action::PrepareNFSSettings

Public Class Methods

new(app,env) click to toggle source
# File lib/vagrant-libvirt/action/prepare_nfs_settings.rb, line 11
def initialize(app,env)
  @app = app
  @logger = Log4r::Logger.new("vagrant::action::vm::nfs")
end

Public Instance Methods

call(env) click to toggle source
# File lib/vagrant-libvirt/action/prepare_nfs_settings.rb, line 16
def call(env)
  @machine = env[:machine]
  @app.call(env)

  if using_nfs?
    @logger.info("Using NFS, preparing NFS settings by reading host IP and machine IP")
    env[:nfs_machine_ip] = read_machine_ip(env[:machine])
    env[:nfs_host_ip]    = read_host_ip(env[:nfs_machine_ip])

    @logger.info("host IP: #{env[:nfs_host_ip]} machine IP: #{env[:nfs_machine_ip]}")

    raise Vagrant::Errors::NFSNoHostonlyNetwork if !env[:nfs_machine_ip] || !env[:nfs_host_ip]
  end
end
read_host_ip(ip) click to toggle source

Returns the IP address of the host

@param [Machine] machine @return [String]

# File lib/vagrant-libvirt/action/prepare_nfs_settings.rb, line 42
def read_host_ip(ip)
  UDPSocket.open do |s|
    s.connect(ip, 1)
    s.addr.last
  end
end
read_machine_ip(machine) click to toggle source

Returns the IP address of the guest

@param [Machine] machine @return [String]

# File lib/vagrant-libvirt/action/prepare_nfs_settings.rb, line 53
def read_machine_ip(machine)
  # check host only ip
  ssh_host = machine.ssh_info[:host]
  return ssh_host if ping(ssh_host)

  # check other ips
  command = "ip addr show | grep -i 'inet ' | grep -v '127.0.0.1' | tr -s ' ' | cut -d' ' -f3 | cut -d'/' -f 1"
  result  = ""
  machine.communicate.execute(command) do |type, data|
    result << data if type == :stdout
  end

  ips = result.chomp.split("\n")
  @logger.info("guest IPs: #{ips.join(', ')}")
  ips.each do |ip|
    next if ip == ssh_host
    return ip if ping(ip)
  end
end
using_nfs?() click to toggle source

We're using NFS if we have any synced folder with NFS configured. If we are not using NFS we don't need to do the extra work to populate these fields in the environment.

# File lib/vagrant-libvirt/action/prepare_nfs_settings.rb, line 34
def using_nfs?
  !!synced_folders(@machine)[:nfs]
end

Private Instance Methods

ping(host, timeout = 3) click to toggle source

Check if we can open a connection to the host

# File lib/vagrant-libvirt/action/prepare_nfs_settings.rb, line 76
def ping(host, timeout = 3)
  timeout(timeout) do
    s = TCPSocket.new(host, 'echo')
    s.close
  end
  true
rescue Errno::ECONNREFUSED
  true
rescue Timeout::Error, StandardError
  false
end