/usr/lib/ruby/vendor_ruby/ohai/plugins/rackspace.rb is in ohai 8.4.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 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 53 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | #
# Author:: Cary Penniman (<cary@rightscale.com>)
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require "resolv"
Ohai.plugin(:Rackspace) do
provides "rackspace"
depends "kernel", "network/interfaces"
# Checks for matching rackspace kernel name
#
# === Return
# true:: If kernel name matches
# false:: Otherwise
def has_rackspace_kernel?
kernel[:release].split('-').last.eql?("rscloud")
end
# Checks for rackspace provider attribute
#
# === Return
# true:: If rackspace provider attribute found
# false:: Otherwise
def has_rackspace_metadata?
so = shell_out("xenstore-read vm-data/provider_data/provider")
if so.exitstatus == 0
so.stdout.strip.downcase == 'rackspace'
end
rescue Errno::ENOENT
false
end
# Identifies the rackspace cloud
#
# === Return
# true:: If the rackspace cloud can be identified
# false:: Otherwise
def looks_like_rackspace?
hint?('rackspace') || has_rackspace_metadata? || has_rackspace_kernel?
end
# Names rackspace ip address
#
# === Parameters
# name<Symbol>:: Use :public_ip or :private_ip
# eth<Symbol>:: Interface name of public or private ip
def get_ip_address(name, eth)
network[:interfaces][eth][:addresses].each do |key, info|
if info['family'] == 'inet'
rackspace[name] = key
break # break when we found an address
end
end
end
# Names rackspace ipv6 address for interface
#
# === Parameters
# name<Symbol>:: Use :public_ip or :private_ip
# eth<Symbol>:: Interface name of public or private ip
def get_global_ipv6_address(name, eth)
network[:interfaces][eth][:addresses].each do |key, info|
# check if we got an ipv6 address and if its in global scope
if info['family'] == 'inet6' && info['scope'] == 'Global'
rackspace[name] = key
break # break when we found an address
end
end
end
# Get the rackspace region
#
def get_region()
so = shell_out("xenstore-ls vm-data/provider_data")
if so.exitstatus == 0
so.stdout.split("\n").each do |line|
rackspace[:region] = line.split[2].delete('\"') if line =~ /^region/
end
end
rescue Errno::ENOENT
Ohai::Log.debug("Unable to find xenstore-ls, cannot capture region information for Rackspace cloud")
nil
end
# Get the rackspace private networks
#
def get_private_networks()
so = shell_out('xenstore-ls vm-data/networking')
if so.exitstatus == 0
networks = []
so.stdout.split("\n").map{|l| l.split('=').first.strip }.map do |item|
_so = shell_out("xenstore-read vm-data/networking/#{item}")
if _so.exitstatus == 0
networks.push(FFI_Yajl::Parser.new.parse(_so.stdout))
else
Ohai::Log.debug('Unable to capture custom private networking information for Rackspace cloud')
return false
end
end
# these networks are already known to ohai, and are not 'private networks'
networks.delete_if { |hash| hash['label'] == 'private' }
networks.delete_if { |hash| hash['label'] == 'public' }
end
rescue Errno::ENOENT
Ohai::Log.debug('Unable to capture custom private networking information for Rackspace cloud')
nil
end
collect_data do
# Adds rackspace Mash
if looks_like_rackspace?
rackspace Mash.new
get_ip_address(:public_ip, :eth0)
get_ip_address(:private_ip, :eth1)
get_region()
# public_ip + private_ip are deprecated in favor of public_ipv4 and local_ipv4 to standardize.
rackspace[:public_ipv4] = rackspace[:public_ip]
get_global_ipv6_address(:public_ipv6, :eth0)
unless rackspace[:public_ip].nil?
rackspace[:public_hostname] = begin
Resolv.getname(rackspace[:public_ip])
rescue Resolv::ResolvError, Resolv::ResolvTimeout
rackspace[:public_ip]
end
end
rackspace[:local_ipv4] = rackspace[:private_ip]
get_global_ipv6_address(:local_ipv6, :eth1)
rackspace[:local_hostname] = hostname
private_networks = get_private_networks
rackspace[:private_networks] = private_networks if private_networks
end
end
end
|