blob: f8fbb471b527fad893d37b5db5b19e0e292da1d3 (
plain)
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
|
#
# Author:: Stafford Brunk (<stafford.brunk@gmail.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 'ohai/util/ip_helper'
Ohai.plugin(:DigitalOcean) do
include Ohai::Util::IpHelper
provides "digital_ocean"
depends "network/interfaces"
def extract_droplet_ip_addresses
addresses = Mash.new({'v4' => [], 'v6' => []})
network[:interfaces].each_value do |iface|
iface[:addresses].each do |address, details|
next if loopback?(address) || details[:family] == 'lladdr'
ip = IPAddress(address)
type = digital_ocean_address_type(ip)
address_hash = build_address_hash(ip, details)
addresses[type] << address_hash
end
end
addresses
end
def build_address_hash(ip, details)
address_hash = Mash.new({
'ip_address' => ip.address,
'type' => private_address?(ip.address) ? 'private' : 'public'
})
if ip.ipv4?
address_hash['netmask'] = details[:netmask]
elsif ip.ipv6?
address_hash['cidr'] = ip.prefix
end
address_hash
end
def digital_ocean_address_type(ip)
ip.ipv4? ? 'v4' : 'v6'
end
def looks_like_digital_ocean?
hint?('digital_ocean') || File.exist?('/etc/digitalocean')
end
collect_data do
if looks_like_digital_ocean?
digital_ocean Mash.new
hint = hint?('digital_ocean') || {}
hint.each {|k, v| digital_ocean[k] = v unless k == 'ip_addresses'}
# Extract actual ip addresses
# The networks sub-hash is structured similarly to how
# Digital Ocean's v2 API structures things:
# https://developers.digitalocean.com/#droplets
digital_ocean[:networks] = extract_droplet_ip_addresses
else
Ohai::Log.debug("No hints present for digital_ocean.")
false
end
end
end
|