class VagrantPlugins::ProviderLibvirt::Action::ReadSSHInfo

This action reads the SSH info for the machine and puts it into the `:machine_ssh_info` key in the environment.

Public Class Methods

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

Public Instance Methods

call(env) click to toggle source
# File lib/vagrant-libvirt/action/read_ssh_info.rb, line 14
def call(env)
  env[:machine_ssh_info] = read_ssh_info(env[:libvirt_compute],
                                         env[:machine])

  @app.call(env)
end
read_ssh_info(libvirt, machine) click to toggle source
# File lib/vagrant-libvirt/action/read_ssh_info.rb, line 21
def read_ssh_info(libvirt, machine)
  return nil if machine.id.nil?

  # Find the machine
  domain = libvirt.servers.get(machine.id)
  if domain.nil?
    # The machine can't be found
    @logger.info("Machine couldn't be found, assuming it got destroyed.")
    machine.id = nil
    return nil
  end

  # Get IP address from dnsmasq lease file.
  ip_address = nil
  domain.wait_for(2) {
    addresses.each_pair do |type, ip|
      # Multiple leases are separated with a newline, return only
      # the most recent address
      ip_address = ip[0].split("\n").first if ip[0] != nil
    end
    ip_address != nil
  }
  raise Errors::NoIpAddressError if not ip_address

  ssh_info = {
    :host          => ip_address,
    :port          => machine.config.ssh.guest_port,
    :forward_agent => machine.config.ssh.forward_agent,
    :forward_x11   => machine.config.ssh.forward_x11,
  }
  
  ssh_info[:proxy_command] = "ssh '#{machine.provider_config.host}' -l '#{machine.provider_config.username}' nc %h %p" if machine.provider_config.connect_via_ssh

  ssh_info
end