Class: VagrantPlugins::ProviderLibvirt::Action::PrepareNFSSettings

Inherits:
Object
  • Object
show all
Includes:
Vagrant::Action::Builtin::MixinSyncedFolders
Defined in:
lib/vagrant-libvirt/action/prepare_nfs_settings.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, _env) ⇒ PrepareNFSSettings

Returns a new instance of PrepareNFSSettings.



11
12
13
14
# 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

Instance Method Details

#call(env) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 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) ⇒ String

Returns the IP address of the host

Parameters:

  • machine (Machine)

Returns:

  • (String)


42
43
44
45
46
47
48
49
50
51
# File 'lib/vagrant-libvirt/action/prepare_nfs_settings.rb', line 42

def read_host_ip(ip)
  UDPSocket.open do |s|
    if ip.is_a?(Array)
      s.connect(ip.last, 1)
    else
      s.connect(ip, 1)
    end
    s.addr.last
  end
end

#read_machine_ip(machine) ⇒ String

Returns the IP address of the guest

Parameters:

  • machine (Machine)

Returns:

  • (String)


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/vagrant-libvirt/action/prepare_nfs_settings.rb', line 57

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=$(which ip); ${ip:-/sbin/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").uniq
  @logger.info("guest IPs: #{ips.join(', ')}")
  ips.each do |ip|
    next if ip == ssh_host
    return ip if ping(ip)
  end
end

#using_nfs?Boolean

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.

Returns:

  • (Boolean)


34
35
36
# File 'lib/vagrant-libvirt/action/prepare_nfs_settings.rb', line 34

def using_nfs?
  !!synced_folders(@machine)[:nfs]
end