ohai 18.2.6 → 19.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +28 -28
- data/LICENSE +201 -201
- data/bin/ohai +25 -25
- data/lib/ohai/application.rb +189 -189
- data/lib/ohai/common/dmi.rb +167 -167
- data/lib/ohai/config.rb +51 -51
- data/lib/ohai/dsl/plugin/versionvii.rb +203 -203
- data/lib/ohai/dsl/plugin.rb +232 -232
- data/lib/ohai/dsl.rb +22 -22
- data/lib/ohai/exception.rb +36 -36
- data/lib/ohai/hints.rb +68 -68
- data/lib/ohai/loader.rb +178 -178
- data/lib/ohai/log.rb +34 -34
- data/lib/ohai/mash.rb +22 -22
- data/lib/ohai/mixin/alibaba_metadata.rb +83 -83
- data/lib/ohai/mixin/azure_metadata.rb +105 -105
- data/lib/ohai/mixin/chef_utils_wiring.rb +52 -52
- data/lib/ohai/mixin/command.rb +4 -4
- data/lib/ohai/mixin/constant_helper.rb +55 -55
- data/lib/ohai/mixin/dmi_decode.rb +54 -54
- data/lib/ohai/mixin/do_metadata.rb +48 -48
- data/lib/ohai/mixin/ec2_metadata.rb +264 -270
- data/lib/ohai/mixin/gce_metadata.rb +79 -79
- data/lib/ohai/mixin/http_helper.rb +64 -64
- data/lib/ohai/mixin/json_helper.rb +36 -36
- data/lib/ohai/mixin/network_helper.rb +92 -92
- data/lib/ohai/mixin/oci_metadata.rb +60 -60
- data/lib/ohai/mixin/os.rb +128 -128
- data/lib/ohai/mixin/scaleway_metadata.rb +51 -51
- data/lib/ohai/mixin/seconds_to_human.rb +52 -52
- data/lib/ohai/mixin/shell_out.rb +51 -51
- data/lib/ohai/mixin/softlayer_metadata.rb +74 -74
- data/lib/ohai/mixin/string.rb +31 -31
- data/lib/ohai/mixin/train_helpers.rb +36 -36
- data/lib/ohai/mixin/which.rb +39 -39
- data/lib/ohai/plugin_config.rb +47 -47
- data/lib/ohai/plugins/aix/kernel.rb +50 -50
- data/lib/ohai/plugins/aix/memory.rb +37 -37
- data/lib/ohai/plugins/aix/network.rb +142 -142
- data/lib/ohai/plugins/aix/platform.rb +30 -30
- data/lib/ohai/plugins/aix/uptime.rb +54 -54
- data/lib/ohai/plugins/aix/virtualization.rb +154 -154
- data/lib/ohai/plugins/alibaba.rb +72 -72
- data/lib/ohai/plugins/azure.rb +154 -154
- data/lib/ohai/plugins/bsd/virtualization.rb +121 -121
- data/lib/ohai/plugins/c.rb +178 -178
- data/lib/ohai/plugins/chef.rb +50 -50
- data/lib/ohai/plugins/cloud.rb +379 -379
- data/lib/ohai/plugins/command.rb +26 -26
- data/lib/ohai/plugins/cpu.rb +642 -642
- data/lib/ohai/plugins/darwin/hardware.rb +99 -99
- data/lib/ohai/plugins/darwin/memory.rb +62 -62
- data/lib/ohai/plugins/darwin/network.rb +207 -207
- data/lib/ohai/plugins/darwin/platform.rb +40 -40
- data/lib/ohai/plugins/darwin/virtualization.rb +104 -104
- data/lib/ohai/plugins/digital_ocean.rb +67 -67
- data/lib/ohai/plugins/dmi.rb +134 -134
- data/lib/ohai/plugins/docker.rb +58 -58
- data/lib/ohai/plugins/dragonflybsd/memory.rb +60 -60
- data/lib/ohai/plugins/dragonflybsd/network.rb +128 -128
- data/lib/ohai/plugins/dragonflybsd/platform.rb +28 -28
- data/lib/ohai/plugins/ec2.rb +148 -148
- data/lib/ohai/plugins/elixir.rb +36 -36
- data/lib/ohai/plugins/erlang.rb +60 -60
- data/lib/ohai/plugins/eucalyptus.rb +86 -86
- data/lib/ohai/plugins/filesystem.rb +753 -753
- data/lib/ohai/plugins/fips.rb +36 -36
- data/lib/ohai/plugins/freebsd/memory.rb +60 -60
- data/lib/ohai/plugins/freebsd/network.rb +128 -128
- data/lib/ohai/plugins/freebsd/platform.rb +28 -28
- data/lib/ohai/plugins/gce.rb +89 -89
- data/lib/ohai/plugins/go.rb +34 -34
- data/lib/ohai/plugins/groovy.rb +38 -38
- data/lib/ohai/plugins/grub2.rb +40 -40
- data/lib/ohai/plugins/habitat.rb +73 -73
- data/lib/ohai/plugins/haskell.rb +96 -96
- data/lib/ohai/plugins/hostname.rb +133 -133
- data/lib/ohai/plugins/init_package.rb +26 -26
- data/lib/ohai/plugins/java.rb +78 -78
- data/lib/ohai/plugins/kernel.rb +292 -292
- data/lib/ohai/plugins/keys.rb +27 -27
- data/lib/ohai/plugins/languages.rb +26 -26
- data/lib/ohai/plugins/libvirt.rb +114 -114
- data/lib/ohai/plugins/linode.rb +73 -73
- data/lib/ohai/plugins/linux/block_device.rb +48 -48
- data/lib/ohai/plugins/linux/hostnamectl.rb +34 -34
- data/lib/ohai/plugins/linux/interrupts.rb +84 -83
- data/lib/ohai/plugins/linux/ipc.rb +52 -52
- data/lib/ohai/plugins/linux/livepatch.rb +38 -38
- data/lib/ohai/plugins/linux/lsb.rb +46 -46
- data/lib/ohai/plugins/linux/lspci.rb +80 -80
- data/lib/ohai/plugins/linux/machineid.rb +36 -36
- data/lib/ohai/plugins/linux/mdadm.rb +120 -120
- data/lib/ohai/plugins/linux/memory.rb +106 -106
- data/lib/ohai/plugins/linux/network.rb +879 -879
- data/lib/ohai/plugins/linux/os_release.rb +38 -38
- data/lib/ohai/plugins/linux/platform.rb +314 -314
- data/lib/ohai/plugins/linux/selinux.rb +69 -69
- data/lib/ohai/plugins/linux/sessions.rb +54 -54
- data/lib/ohai/plugins/linux/sysctl.rb +39 -39
- data/lib/ohai/plugins/linux/systemd_paths.rb +36 -36
- data/lib/ohai/plugins/linux/tc.rb +61 -61
- data/lib/ohai/plugins/linux/virtualization.rb +300 -300
- data/lib/ohai/plugins/lua.rb +39 -39
- data/lib/ohai/plugins/mono.rb +50 -50
- data/lib/ohai/plugins/netbsd/memory.rb +99 -99
- data/lib/ohai/plugins/netbsd/network.rb +122 -122
- data/lib/ohai/plugins/netbsd/platform.rb +28 -28
- data/lib/ohai/plugins/network.rb +186 -186
- data/lib/ohai/plugins/nodejs.rb +40 -40
- data/lib/ohai/plugins/oci.rb +94 -94
- data/lib/ohai/plugins/ohai.rb +29 -29
- data/lib/ohai/plugins/ohai_time.rb +26 -26
- data/lib/ohai/plugins/openbsd/memory.rb +99 -99
- data/lib/ohai/plugins/openbsd/network.rb +122 -122
- data/lib/ohai/plugins/openbsd/platform.rb +28 -28
- data/lib/ohai/plugins/openstack.rb +84 -84
- data/lib/ohai/plugins/os.rb +55 -55
- data/lib/ohai/plugins/packages.rb +234 -234
- data/lib/ohai/plugins/passwd.rb +104 -104
- data/lib/ohai/plugins/perl.rb +45 -45
- data/lib/ohai/plugins/php.rb +52 -52
- data/lib/ohai/plugins/platform.rb +41 -41
- data/lib/ohai/plugins/powershell.rb +82 -82
- data/lib/ohai/plugins/ps.rb +35 -35
- data/lib/ohai/plugins/python.rb +43 -43
- data/lib/ohai/plugins/rackspace.rb +177 -177
- data/lib/ohai/plugins/root_group.rb +41 -41
- data/lib/ohai/plugins/rpm.rb +121 -121
- data/lib/ohai/plugins/ruby.rb +66 -66
- data/lib/ohai/plugins/rust.rb +34 -34
- data/lib/ohai/plugins/scala.rb +38 -38
- data/lib/ohai/plugins/scaleway.rb +58 -58
- data/lib/ohai/plugins/scsi.rb +52 -52
- data/lib/ohai/plugins/shard.rb +142 -142
- data/lib/ohai/plugins/shells.rb +32 -32
- data/lib/ohai/plugins/softlayer.rb +48 -48
- data/lib/ohai/plugins/solaris2/dmi.rb +191 -191
- data/lib/ohai/plugins/solaris2/memory.rb +32 -32
- data/lib/ohai/plugins/solaris2/network.rb +192 -192
- data/lib/ohai/plugins/solaris2/platform.rb +58 -58
- data/lib/ohai/plugins/solaris2/virtualization.rb +90 -90
- data/lib/ohai/plugins/ssh_host_key.rb +84 -84
- data/lib/ohai/plugins/sysconf.rb +46 -46
- data/lib/ohai/plugins/timezone.rb +45 -45
- data/lib/ohai/plugins/train.rb +35 -35
- data/lib/ohai/plugins/uptime.rb +95 -95
- data/lib/ohai/plugins/virtualbox.rb +197 -197
- data/lib/ohai/plugins/vmware.rb +109 -109
- data/lib/ohai/plugins/windows/dmi.rb +95 -95
- data/lib/ohai/plugins/windows/drivers.rb +52 -52
- data/lib/ohai/plugins/windows/memory.rb +39 -39
- data/lib/ohai/plugins/windows/network.rb +222 -222
- data/lib/ohai/plugins/windows/platform.rb +34 -34
- data/lib/ohai/plugins/windows/system_enclosure.rb +29 -29
- data/lib/ohai/plugins/windows/virtualization.rb +45 -45
- data/lib/ohai/plugins/zpools.rb +94 -94
- data/lib/ohai/provides_map.rb +208 -208
- data/lib/ohai/runner.rb +128 -126
- data/lib/ohai/system.rb +258 -258
- data/lib/ohai/train_transport.rb +29 -29
- data/lib/ohai/util/file_helper.rb +6 -6
- data/lib/ohai/util/ip_helper.rb +56 -56
- data/lib/ohai/util/win32.rb +47 -47
- data/lib/ohai/version.rb +23 -23
- data/lib/ohai.rb +23 -23
- data/ohai.gemspec +35 -35
- metadata +9 -15
@@ -1,79 +1,79 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Author:: Ranjib Dey (<dey.ranjib@gmail.com>)
|
4
|
-
# License:: Apache License, Version 2.0
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
|
18
|
-
require "net/http" unless defined?(Net::HTTP)
|
19
|
-
|
20
|
-
require_relative "../mixin/json_helper"
|
21
|
-
include Ohai::Mixin::JsonHelper
|
22
|
-
|
23
|
-
module Ohai
|
24
|
-
module Mixin
|
25
|
-
module GCEMetadata
|
26
|
-
|
27
|
-
# Trailing dot to host is added to avoid DNS search path
|
28
|
-
GCE_METADATA_ADDR ||= "metadata.google.internal."
|
29
|
-
GCE_METADATA_URL ||= "/computeMetadata/v1"
|
30
|
-
|
31
|
-
# fetch the meta content with a timeout and the required header
|
32
|
-
def http_get(uri)
|
33
|
-
conn = Net::HTTP.start(GCE_METADATA_ADDR)
|
34
|
-
conn.read_timeout = 6
|
35
|
-
conn.get(uri, {
|
36
|
-
"Metadata-Flavor" => "Google",
|
37
|
-
"User-Agent" => "chef-ohai/#{Ohai::VERSION}",
|
38
|
-
})
|
39
|
-
end
|
40
|
-
|
41
|
-
def fetch_metadata(id = "")
|
42
|
-
url = "#{GCE_METADATA_URL}/#{id}"
|
43
|
-
url = "#{url}?recursive=true" if url.end_with?("/")
|
44
|
-
response = http_get(url)
|
45
|
-
if response.code == "200"
|
46
|
-
json_data = parse_json(response.body)
|
47
|
-
if json_data.nil?
|
48
|
-
logger.warn("Mixin GCEMetadata: Metadata response is NOT valid JSON for id='#{id}'")
|
49
|
-
if has_trailing_slash?(id) || (id == "")
|
50
|
-
temp = {}
|
51
|
-
response.body.split("\n").each do |sub_attr|
|
52
|
-
temp[sanitize_key(sub_attr)] = fetch_metadata("#{id}#{sub_attr}")
|
53
|
-
end
|
54
|
-
temp
|
55
|
-
else
|
56
|
-
response.body
|
57
|
-
end
|
58
|
-
else
|
59
|
-
json_data
|
60
|
-
end
|
61
|
-
else
|
62
|
-
logger.warn("Mixin GCEMetadata: Received response code #{response.code} requesting metadata for id='#{id}'")
|
63
|
-
nil
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# @param data [String]
|
68
|
-
#
|
69
|
-
# @return [Boolean] is there a trailing /?
|
70
|
-
def has_trailing_slash?(data)
|
71
|
-
!!( data =~ %r{/$} )
|
72
|
-
end
|
73
|
-
|
74
|
-
def sanitize_key(key)
|
75
|
-
key.gsub(%r{\-|/}, "_")
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Author:: Ranjib Dey (<dey.ranjib@gmail.com>)
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require "net/http" unless defined?(Net::HTTP)
|
19
|
+
|
20
|
+
require_relative "../mixin/json_helper"
|
21
|
+
include Ohai::Mixin::JsonHelper
|
22
|
+
|
23
|
+
module Ohai
|
24
|
+
module Mixin
|
25
|
+
module GCEMetadata
|
26
|
+
|
27
|
+
# Trailing dot to host is added to avoid DNS search path
|
28
|
+
GCE_METADATA_ADDR ||= "metadata.google.internal."
|
29
|
+
GCE_METADATA_URL ||= "/computeMetadata/v1"
|
30
|
+
|
31
|
+
# fetch the meta content with a timeout and the required header
|
32
|
+
def http_get(uri)
|
33
|
+
conn = Net::HTTP.start(GCE_METADATA_ADDR)
|
34
|
+
conn.read_timeout = 6
|
35
|
+
conn.get(uri, {
|
36
|
+
"Metadata-Flavor" => "Google",
|
37
|
+
"User-Agent" => "chef-ohai/#{Ohai::VERSION}",
|
38
|
+
})
|
39
|
+
end
|
40
|
+
|
41
|
+
def fetch_metadata(id = "")
|
42
|
+
url = "#{GCE_METADATA_URL}/#{id}"
|
43
|
+
url = "#{url}?recursive=true" if url.end_with?("/")
|
44
|
+
response = http_get(url)
|
45
|
+
if response.code == "200"
|
46
|
+
json_data = parse_json(response.body)
|
47
|
+
if json_data.nil?
|
48
|
+
logger.warn("Mixin GCEMetadata: Metadata response is NOT valid JSON for id='#{id}'")
|
49
|
+
if has_trailing_slash?(id) || (id == "")
|
50
|
+
temp = {}
|
51
|
+
response.body.split("\n").each do |sub_attr|
|
52
|
+
temp[sanitize_key(sub_attr)] = fetch_metadata("#{id}#{sub_attr}")
|
53
|
+
end
|
54
|
+
temp
|
55
|
+
else
|
56
|
+
response.body
|
57
|
+
end
|
58
|
+
else
|
59
|
+
json_data
|
60
|
+
end
|
61
|
+
else
|
62
|
+
logger.warn("Mixin GCEMetadata: Received response code #{response.code} requesting metadata for id='#{id}'")
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param data [String]
|
68
|
+
#
|
69
|
+
# @return [Boolean] is there a trailing /?
|
70
|
+
def has_trailing_slash?(data)
|
71
|
+
!!( data =~ %r{/$} )
|
72
|
+
end
|
73
|
+
|
74
|
+
def sanitize_key(key)
|
75
|
+
key.gsub(%r{\-|/}, "_")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -1,64 +1,64 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Copyright:: Copyright (c) Chef Software Inc.
|
4
|
-
# License:: Apache License, Version 2.0
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
|
18
|
-
require "socket" unless defined?(Socket)
|
19
|
-
|
20
|
-
module Ohai
|
21
|
-
module Mixin
|
22
|
-
module HttpHelper
|
23
|
-
|
24
|
-
# see if we can socket connect to an address/port
|
25
|
-
#
|
26
|
-
# @param addr [String] the address to connect to
|
27
|
-
# @param port [Integer] the port to connect to
|
28
|
-
# @param timeout [Integer] the seconds before timing out
|
29
|
-
#
|
30
|
-
# @return [Boolean] can we connect?
|
31
|
-
def can_socket_connect?(addr, port, timeout = 2)
|
32
|
-
t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
|
33
|
-
begin
|
34
|
-
saddr = Socket.pack_sockaddr_in(port, addr)
|
35
|
-
rescue SocketError => e # generally means dns resolution error
|
36
|
-
logger.trace("Mixin HttpHelper: can_socket_connect? failed setting up socket connection: #{e}")
|
37
|
-
return false
|
38
|
-
end
|
39
|
-
|
40
|
-
connected = false
|
41
|
-
|
42
|
-
begin
|
43
|
-
t.connect_nonblock(saddr)
|
44
|
-
rescue Errno::EINPROGRESS
|
45
|
-
_r, w, _e = IO.select(nil, [t], nil, timeout)
|
46
|
-
if !w.nil?
|
47
|
-
connected = true
|
48
|
-
else
|
49
|
-
begin
|
50
|
-
t.connect_nonblock(saddr)
|
51
|
-
rescue Errno::EISCONN
|
52
|
-
t.close
|
53
|
-
connected = true
|
54
|
-
rescue SystemCallError
|
55
|
-
end
|
56
|
-
end
|
57
|
-
rescue SystemCallError
|
58
|
-
end
|
59
|
-
logger.trace("Mixin HttpHelper: can_socket_connect? == #{connected}")
|
60
|
-
connected
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require "socket" unless defined?(Socket)
|
19
|
+
|
20
|
+
module Ohai
|
21
|
+
module Mixin
|
22
|
+
module HttpHelper
|
23
|
+
|
24
|
+
# see if we can socket connect to an address/port
|
25
|
+
#
|
26
|
+
# @param addr [String] the address to connect to
|
27
|
+
# @param port [Integer] the port to connect to
|
28
|
+
# @param timeout [Integer] the seconds before timing out
|
29
|
+
#
|
30
|
+
# @return [Boolean] can we connect?
|
31
|
+
def can_socket_connect?(addr, port, timeout = 2)
|
32
|
+
t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
|
33
|
+
begin
|
34
|
+
saddr = Socket.pack_sockaddr_in(port, addr)
|
35
|
+
rescue SocketError => e # generally means dns resolution error
|
36
|
+
logger.trace("Mixin HttpHelper: can_socket_connect? failed setting up socket connection: #{e}")
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
|
40
|
+
connected = false
|
41
|
+
|
42
|
+
begin
|
43
|
+
t.connect_nonblock(saddr)
|
44
|
+
rescue Errno::EINPROGRESS
|
45
|
+
_r, w, _e = IO.select(nil, [t], nil, timeout)
|
46
|
+
if !w.nil?
|
47
|
+
connected = true
|
48
|
+
else
|
49
|
+
begin
|
50
|
+
t.connect_nonblock(saddr)
|
51
|
+
rescue Errno::EISCONN
|
52
|
+
t.close
|
53
|
+
connected = true
|
54
|
+
rescue SystemCallError
|
55
|
+
end
|
56
|
+
end
|
57
|
+
rescue SystemCallError
|
58
|
+
end
|
59
|
+
logger.trace("Mixin HttpHelper: can_socket_connect? == #{connected}")
|
60
|
+
connected
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,36 +1,36 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Author:: Renato Covarrubias (<rnt@rnt.cl>)
|
4
|
-
# License:: Apache License, Version 2.0
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
|
18
|
-
module Ohai
|
19
|
-
module Mixin
|
20
|
-
module JsonHelper
|
21
|
-
# parse JSON data from a String to a Hash
|
22
|
-
#
|
23
|
-
# @param [String] response_body json as string to parse
|
24
|
-
# @param [Object] return_on_parse_error value to return if parsing fails
|
25
|
-
#
|
26
|
-
# @return [Hash]
|
27
|
-
def parse_json(response_body, return_on_parse_error = nil)
|
28
|
-
data = String(response_body)
|
29
|
-
parser = FFI_Yajl::Parser.new
|
30
|
-
parser.parse(data)
|
31
|
-
rescue FFI_Yajl::ParseError
|
32
|
-
return_on_parse_error
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Author:: Renato Covarrubias (<rnt@rnt.cl>)
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Ohai
|
19
|
+
module Mixin
|
20
|
+
module JsonHelper
|
21
|
+
# parse JSON data from a String to a Hash
|
22
|
+
#
|
23
|
+
# @param [String] response_body json as string to parse
|
24
|
+
# @param [Object] return_on_parse_error value to return if parsing fails
|
25
|
+
#
|
26
|
+
# @return [Hash]
|
27
|
+
def parse_json(response_body, return_on_parse_error = nil)
|
28
|
+
data = String(response_body)
|
29
|
+
parser = FFI_Yajl::Parser.new
|
30
|
+
parser.parse(data)
|
31
|
+
rescue FFI_Yajl::ParseError
|
32
|
+
return_on_parse_error
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,92 +1,92 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Author:: Serdar Sutay (<serdar@chef.io>)
|
4
|
-
# Copyright:: Copyright (c) Chef Software Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
-
# implied.
|
17
|
-
# See the License for the specific language governing permissions and
|
18
|
-
# limitations under the License.
|
19
|
-
#
|
20
|
-
|
21
|
-
require "socket" unless defined?(Socket)
|
22
|
-
require "resolv" unless defined?(Resolv)
|
23
|
-
|
24
|
-
module Ohai
|
25
|
-
module Mixin
|
26
|
-
module NetworkHelper
|
27
|
-
unless defined?(FAMILIES)
|
28
|
-
FAMILIES = {
|
29
|
-
"inet" => "default",
|
30
|
-
"inet6" => "default_inet6",
|
31
|
-
}.freeze
|
32
|
-
end
|
33
|
-
|
34
|
-
def hex_to_dec_netmask(netmask)
|
35
|
-
# example 'ffff0000' -> '255.255.0.0'
|
36
|
-
dec = netmask[0..1].to_i(16).to_s(10)
|
37
|
-
[2, 4, 6].each { |n| dec = dec + "." + netmask[n..n + 1].to_i(16).to_s(10) }
|
38
|
-
dec
|
39
|
-
end
|
40
|
-
|
41
|
-
# Addrinfo#ip*? methods return true on AI_CANONNAME Addrinfo records that match
|
42
|
-
# the ipv* scheme and #ip? always returns true unless a non tcp Addrinfo
|
43
|
-
def ip?(hostname)
|
44
|
-
Resolv::IPv4::Regex.match?(hostname) || Resolv::IPv6::Regex.match?(hostname)
|
45
|
-
end
|
46
|
-
|
47
|
-
# This does a forward and reverse lookup on the hostname to return what should be
|
48
|
-
# the FQDN for the host determined by name lookup (generally DNS). If the forward
|
49
|
-
# lookup fails this will throw. If the reverse lookup fails this will return the
|
50
|
-
# hostname back. The behavior on failure of the reverse lookup is both vitally important
|
51
|
-
# to this API, and completely untested, so changes to this method (not recommended) need
|
52
|
-
# to be manually validated by hand by setting up a DNS server with a broken A record to
|
53
|
-
# an IP without a PTR record (e.g. any RFC1918 space not served by the configured DNS
|
54
|
-
# server), and the method should return the hostname and not the IP address.
|
55
|
-
#
|
56
|
-
def canonicalize_hostname(hostname)
|
57
|
-
ai = Addrinfo
|
58
|
-
.getaddrinfo(hostname, nil, nil, nil, nil, Socket::AI_CANONNAME)
|
59
|
-
.first
|
60
|
-
|
61
|
-
canonname = ai&.canonname
|
62
|
-
# use canonname if it's an FQDN
|
63
|
-
# This API is preferred as it never gives us an IP address for broken DNS
|
64
|
-
# (see https://github.com/chef/ohai/pull/1705)
|
65
|
-
# However, we have found that Windows hosts that are not joined to a domain
|
66
|
-
# can return a non-qualified hostname).
|
67
|
-
# Use a '.' in the canonname as indicator of FQDN
|
68
|
-
return canonname if canonname.include?(".")
|
69
|
-
|
70
|
-
# If we got a non-qualified name, then we do a standard reverse resolve
|
71
|
-
# which, assuming DNS is working, will work around that windows bug
|
72
|
-
# (and maybe others)
|
73
|
-
canonname = ai&.getnameinfo&.first
|
74
|
-
return canonname unless ip?(canonname)
|
75
|
-
|
76
|
-
# if all else fails, return the name we were given as a safety
|
77
|
-
hostname
|
78
|
-
end
|
79
|
-
|
80
|
-
def canonicalize_hostname_with_retries(hostname)
|
81
|
-
retries = 3
|
82
|
-
begin
|
83
|
-
canonicalize_hostname(hostname)
|
84
|
-
rescue
|
85
|
-
retries -= 1
|
86
|
-
retry if retries > 0
|
87
|
-
nil
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Author:: Serdar Sutay (<serdar@chef.io>)
|
4
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
5
|
+
# License:: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
require "socket" unless defined?(Socket)
|
22
|
+
require "resolv" unless defined?(Resolv)
|
23
|
+
|
24
|
+
module Ohai
|
25
|
+
module Mixin
|
26
|
+
module NetworkHelper
|
27
|
+
unless defined?(FAMILIES)
|
28
|
+
FAMILIES = {
|
29
|
+
"inet" => "default",
|
30
|
+
"inet6" => "default_inet6",
|
31
|
+
}.freeze
|
32
|
+
end
|
33
|
+
|
34
|
+
def hex_to_dec_netmask(netmask)
|
35
|
+
# example 'ffff0000' -> '255.255.0.0'
|
36
|
+
dec = netmask[0..1].to_i(16).to_s(10)
|
37
|
+
[2, 4, 6].each { |n| dec = dec + "." + netmask[n..n + 1].to_i(16).to_s(10) }
|
38
|
+
dec
|
39
|
+
end
|
40
|
+
|
41
|
+
# Addrinfo#ip*? methods return true on AI_CANONNAME Addrinfo records that match
|
42
|
+
# the ipv* scheme and #ip? always returns true unless a non tcp Addrinfo
|
43
|
+
def ip?(hostname)
|
44
|
+
Resolv::IPv4::Regex.match?(hostname) || Resolv::IPv6::Regex.match?(hostname)
|
45
|
+
end
|
46
|
+
|
47
|
+
# This does a forward and reverse lookup on the hostname to return what should be
|
48
|
+
# the FQDN for the host determined by name lookup (generally DNS). If the forward
|
49
|
+
# lookup fails this will throw. If the reverse lookup fails this will return the
|
50
|
+
# hostname back. The behavior on failure of the reverse lookup is both vitally important
|
51
|
+
# to this API, and completely untested, so changes to this method (not recommended) need
|
52
|
+
# to be manually validated by hand by setting up a DNS server with a broken A record to
|
53
|
+
# an IP without a PTR record (e.g. any RFC1918 space not served by the configured DNS
|
54
|
+
# server), and the method should return the hostname and not the IP address.
|
55
|
+
#
|
56
|
+
def canonicalize_hostname(hostname)
|
57
|
+
ai = Addrinfo
|
58
|
+
.getaddrinfo(hostname, nil, nil, nil, nil, Socket::AI_CANONNAME)
|
59
|
+
.first
|
60
|
+
|
61
|
+
canonname = ai&.canonname
|
62
|
+
# use canonname if it's an FQDN
|
63
|
+
# This API is preferred as it never gives us an IP address for broken DNS
|
64
|
+
# (see https://github.com/chef/ohai/pull/1705)
|
65
|
+
# However, we have found that Windows hosts that are not joined to a domain
|
66
|
+
# can return a non-qualified hostname).
|
67
|
+
# Use a '.' in the canonname as indicator of FQDN
|
68
|
+
return canonname if canonname.include?(".")
|
69
|
+
|
70
|
+
# If we got a non-qualified name, then we do a standard reverse resolve
|
71
|
+
# which, assuming DNS is working, will work around that windows bug
|
72
|
+
# (and maybe others)
|
73
|
+
canonname = ai&.getnameinfo&.first
|
74
|
+
return canonname unless ip?(canonname)
|
75
|
+
|
76
|
+
# if all else fails, return the name we were given as a safety
|
77
|
+
hostname
|
78
|
+
end
|
79
|
+
|
80
|
+
def canonicalize_hostname_with_retries(hostname)
|
81
|
+
retries = 3
|
82
|
+
begin
|
83
|
+
canonicalize_hostname(hostname)
|
84
|
+
rescue
|
85
|
+
retries -= 1
|
86
|
+
retry if retries > 0
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -1,60 +1,60 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Author:: Renato Covarrubias (<rnt@rnt.cl>)
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
|
19
|
-
require "net/http" unless defined?(Net::HTTP)
|
20
|
-
|
21
|
-
require_relative "../mixin/json_helper"
|
22
|
-
include Ohai::Mixin::JsonHelper
|
23
|
-
|
24
|
-
module Ohai
|
25
|
-
module Mixin
|
26
|
-
module OCIMetadata
|
27
|
-
OCI_METADATA_ADDR = "169.254.169.254"
|
28
|
-
OCI_METADATA_URL = "/opc/v2"
|
29
|
-
CHASSIS_ASSET_TAG_FILE = "/sys/devices/virtual/dmi/id/chassis_asset_tag"
|
30
|
-
|
31
|
-
# fetch the meta content with a timeout and the required header
|
32
|
-
def http_get(uri)
|
33
|
-
conn = Net::HTTP.start(OCI_METADATA_ADDR)
|
34
|
-
conn.read_timeout = 6
|
35
|
-
conn.get(
|
36
|
-
uri,
|
37
|
-
{
|
38
|
-
"Authorization" => "Bearer Oracle",
|
39
|
-
"User-Agent" => "chef-ohai/#{Ohai::VERSION}",
|
40
|
-
}
|
41
|
-
)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Fetch metadata from api
|
45
|
-
def fetch_metadata(metadata = "instance")
|
46
|
-
response = http_get("#{OCI_METADATA_URL}/#{metadata}")
|
47
|
-
if response.code == "200"
|
48
|
-
json_data = parse_json(response.body)
|
49
|
-
if json_data.nil?
|
50
|
-
logger.warn("Mixin OciMetadata: Metadata response is NOT valid JSON")
|
51
|
-
end
|
52
|
-
json_data
|
53
|
-
else
|
54
|
-
logger.warn("Mixin OciMetadata: Received response code #{response.code} requesting metadata")
|
55
|
-
nil
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Author:: Renato Covarrubias (<rnt@rnt.cl>)
|
5
|
+
# License:: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
|
19
|
+
require "net/http" unless defined?(Net::HTTP)
|
20
|
+
|
21
|
+
require_relative "../mixin/json_helper"
|
22
|
+
include Ohai::Mixin::JsonHelper
|
23
|
+
|
24
|
+
module Ohai
|
25
|
+
module Mixin
|
26
|
+
module OCIMetadata
|
27
|
+
OCI_METADATA_ADDR = "169.254.169.254"
|
28
|
+
OCI_METADATA_URL = "/opc/v2"
|
29
|
+
CHASSIS_ASSET_TAG_FILE = "/sys/devices/virtual/dmi/id/chassis_asset_tag"
|
30
|
+
|
31
|
+
# fetch the meta content with a timeout and the required header
|
32
|
+
def http_get(uri)
|
33
|
+
conn = Net::HTTP.start(OCI_METADATA_ADDR)
|
34
|
+
conn.read_timeout = 6
|
35
|
+
conn.get(
|
36
|
+
uri,
|
37
|
+
{
|
38
|
+
"Authorization" => "Bearer Oracle",
|
39
|
+
"User-Agent" => "chef-ohai/#{Ohai::VERSION}",
|
40
|
+
}
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Fetch metadata from api
|
45
|
+
def fetch_metadata(metadata = "instance")
|
46
|
+
response = http_get("#{OCI_METADATA_URL}/#{metadata}")
|
47
|
+
if response.code == "200"
|
48
|
+
json_data = parse_json(response.body)
|
49
|
+
if json_data.nil?
|
50
|
+
logger.warn("Mixin OciMetadata: Metadata response is NOT valid JSON")
|
51
|
+
end
|
52
|
+
json_data
|
53
|
+
else
|
54
|
+
logger.warn("Mixin OciMetadata: Received response code #{response.code} requesting metadata")
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|