Module: Ohai::Mixin::GCEMetadata

Defined in:
lib/ohai/mixin/gce_metadata.rb

Constant Summary collapse

GCE_METADATA_ADDR =
"metadata.google.internal."
GCE_METADATA_URL =
"/computeMetadata/v1beta1/?recursive=true"

Instance Method Summary collapse

Instance Method Details

#can_metadata_connect?(addr, port, timeout = 2) ⇒ Boolean


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/ohai/mixin/gce_metadata.rb', line 28

def (addr, port, timeout=2)
  t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
  saddr = Socket.pack_sockaddr_in(port, addr)
  connected = false

  begin
    t.connect_nonblock(saddr)
  rescue Errno::EINPROGRESS
    r,w,e = IO::select(nil,[t],nil,timeout)
    if !w.nil?
      connected = true
    else
      begin
        t.connect_nonblock(saddr)
      rescue Errno::EISCONN
        t.close
        connected = true
      rescue SystemCallError
      end
    end
  rescue SystemCallError
  end
  Ohai::Log.debug("can_metadata_connect? == #{connected}")
  connected
end

#fetch_metadata(id = '') ⇒ Object


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/ohai/mixin/gce_metadata.rb', line 58

def (id='')
  uri = "#{GCE_METADATA_URL}/#{id}"
  response = http_client.get(uri)
  return nil unless response.code == "200"

  if json?(response.body)
    data = StringIO.new(response.body)
    parser = FFI_Yajl::Parser.new
    parser.parse(data)
  elsif  has_trailing_slash?(id) or (id == '')
    temp={}
    response.body.split("\n").each do |sub_attr|
      temp[sanitize_key(sub_attr)] = ("#{id}#{sub_attr}")
    end
    temp
  else
    response.body
  end
end

#has_trailing_slash?(data) ⇒ Boolean


93
94
95
# File 'lib/ohai/mixin/gce_metadata.rb', line 93

def has_trailing_slash?(data)
  !! ( data =~ %r{/$} )
end

#http_clientObject


54
55
56
# File 'lib/ohai/mixin/gce_metadata.rb', line 54

def http_client
  Net::HTTP.start().tap {|h| h.read_timeout = 6}
end

#json?(data) ⇒ Boolean


78
79
80
81
82
83
84
85
86
87
# File 'lib/ohai/mixin/gce_metadata.rb', line 78

def json?(data)
  data = StringIO.new(data)
  parser = FFI_Yajl::Parser.new
  begin
    parser.parse(data)
    true
  rescue FFI_Yajl::ParseError
    false
  end
end

#multiline?(data) ⇒ Boolean


89
90
91
# File 'lib/ohai/mixin/gce_metadata.rb', line 89

def multiline?(data)
  data.lines.to_a.size > 1
end

#sanitize_key(key) ⇒ Object


97
98
99
# File 'lib/ohai/mixin/gce_metadata.rb', line 97

def sanitize_key(key)
  key.gsub(/\-|\//, '_')
end