Module: Veewee::Provider::Core::Helper::Tcp

Included in:
Box
Defined in:
lib/veewee/provider/core/helper/tcp.rb

Instance Method Summary collapse

Instance Method Details

#execute_when_tcp_available(ip = "127.0.0.1", options = { }, &block) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/veewee/provider/core/helper/tcp.rb', line 54

def execute_when_tcp_available(ip="127.0.0.1", options = { } , &block)

  defaults={ :port => 22, :timeout => 2 , :pollrate => 5}

  options=defaults.merge(options)
  timeout=options[:timeout]
  timeout=ENV['VEEWEE_TIMEOUT'].to_i unless ENV['VEEWEE_TIMEOUT'].nil?

  begin
    Timeout::timeout(timeout) do
      connected=false
      while !connected do
        begin
          ui.info "trying connection"
          s = TCPSocket.new(ip, options[:port])
          s.close
          block.call(ip);
          return true
        rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH,Errno::ENETDOWN
          sleep options[:pollrate]
        end
      end
    end
  rescue Timeout::Error
    raise "Timeout connecting to TCP port {options[:port]} exceeded #{timeout} secs."
  end

  return false
end

#get_local_ipObject



88
89
90
91
92
93
94
95
96
97
# File 'lib/veewee/provider/core/helper/tcp.rb', line 88

def get_local_ip
  orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

  UDPSocket.open do |s|
    s.connect '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

#guess_free_port(min_port, max_port) ⇒ Object

This tries to guess a local free tcp port



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/veewee/provider/core/helper/tcp.rb', line 28

def guess_free_port(min_port,max_port)
  ui.info "Received port hint - #{min_port}"

  if definition.force_ssh_port
    return min_port
  end

  guessed_port=nil

  for port in (min_port..max_port)
    unless is_tcp_port_open?(get_local_ip, port)
      guessed_port=port
      break
    end
  end

  if guessed_port.nil?
    ui.error "No free port available: tried #{min_port}..#{max_port}"
    raise Veewee::Error, "No free port available: tried #{min_port}..#{max_port}"
  else
    ui.info "Found port #{guessed_port} available"
  end

  return guessed_port
end

#host_ip_as_seen_by_guestObject



84
85
86
# File 'lib/veewee/provider/core/helper/tcp.rb', line 84

def host_ip_as_seen_by_guest
  get_local_ip
end

#is_tcp_port_open?(ip, port) ⇒ Boolean

Returns:

  • (Boolean)


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/veewee/provider/core/helper/tcp.rb', line 10

def is_tcp_port_open?(ip, port)
  begin
    Timeout::timeout(1) do
      begin
        s = TCPSocket.new(ip, port)
        s.close
        return true
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH,Errno::ENETDOWN
        return false
      end
    end
  rescue Timeout::Error
  end

  return false
end