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
data/lib/ohai/plugins/zpools.rb
CHANGED
@@ -1,94 +1,94 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Author:: Jason J. W. Williams (williamsjj@digitar.com)
|
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 implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
Ohai.plugin(:Zpools) do
|
21
|
-
provides "zpools"
|
22
|
-
depends "platform_family"
|
23
|
-
|
24
|
-
# If zpool status doesn't know about a field it returns '-'.
|
25
|
-
# We don't want to fill a field with that
|
26
|
-
def sanitize_value(value)
|
27
|
-
value == "-" ? nil : value
|
28
|
-
end
|
29
|
-
|
30
|
-
def gather_pool_info
|
31
|
-
pools = Mash.new
|
32
|
-
begin
|
33
|
-
# Grab ZFS zpools overall health and attributes
|
34
|
-
so = shell_out("zpool list -H -o name,size,alloc,free,cap,dedup,health,version")
|
35
|
-
so.stdout.lines do |line|
|
36
|
-
case line
|
37
|
-
when /^([-_0-9A-Za-z]*)\s+([.0-9]+[MGTPE])\s+([.0-9]+[MGTPE])\s+([.0-9]+[MGTPE])\s+(\d+%)\s+([.0-9]+x)\s+([-_0-9A-Za-z]+)\s+(\d+|-)$/
|
38
|
-
Ohai::Log.debug("Plugin Zpools: Parsing zpool list line: #{line.chomp}")
|
39
|
-
pools[$1] = Mash.new
|
40
|
-
pools[$1][:pool_size] = sanitize_value($2)
|
41
|
-
pools[$1][:pool_allocated] = sanitize_value($3)
|
42
|
-
pools[$1][:pool_free] = sanitize_value($4)
|
43
|
-
pools[$1][:capacity_used] = sanitize_value($5)
|
44
|
-
pools[$1][:dedup_factor] = sanitize_value($6)
|
45
|
-
pools[$1][:health] = sanitize_value($7)
|
46
|
-
pools[$1][:zpool_version] = sanitize_value($8)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
rescue Ohai::Exceptions::Exec
|
50
|
-
Ohai::Log.debug('Plugin Zpools: Could not shell_out "zpool list -H -o name,size,alloc,free,cap,dedup,health,version". Skipping plugin.')
|
51
|
-
end
|
52
|
-
pools
|
53
|
-
end
|
54
|
-
|
55
|
-
collect_data(:solaris2, :linux, :freebsd, :openbsd, :netbsd, :dragonflybsd) do
|
56
|
-
pools = gather_pool_info
|
57
|
-
|
58
|
-
# Grab individual health for devices in the zpools
|
59
|
-
pools.each_key do |pool|
|
60
|
-
pools[pool][:devices] = Mash.new
|
61
|
-
|
62
|
-
# Run "zpool status" as non-root user (adm) so that
|
63
|
-
# the command won't try to open() each device which can
|
64
|
-
# hang the command if any of the disks are bad.
|
65
|
-
if platform_family == "solaris2"
|
66
|
-
command = "su adm -c \"zpool status #{pool}\""
|
67
|
-
else
|
68
|
-
# -L is used to give us real device names not label or uuid
|
69
|
-
# for example sda instead of ata-WDC_WD60EZAZ-00SF3B0_WD-WX32D203UXYK
|
70
|
-
command = "zpool status #{pool} -L"
|
71
|
-
end
|
72
|
-
|
73
|
-
so = shell_out(command)
|
74
|
-
so.stdout.lines do |line|
|
75
|
-
case line
|
76
|
-
# linux: http://rubular.com/r/J3wQC6E2lH
|
77
|
-
# solaris: http://rubular.com/r/FqOBzUQQ4p
|
78
|
-
# freebsd: http://rubular.com/r/RYkMNlytXl
|
79
|
-
when /^\s+((sd|c|ad|da|nvme|xvd)[-_a-zA-Z0-9]+)\s+([-_a-zA-Z0-9]+)\s+(\d+)\s+(\d+)\s+(\d+)$/
|
80
|
-
logger.trace("Plugin Zpools: Parsing zpool status line: #{line.chomp}")
|
81
|
-
pools[pool][:devices][$1] = Mash.new
|
82
|
-
pools[pool][:devices][$1][:state] = $3
|
83
|
-
pools[pool][:devices][$1][:errors] = Mash.new
|
84
|
-
pools[pool][:devices][$1][:errors][:read] = $4
|
85
|
-
pools[pool][:devices][$1][:errors][:write] = $5
|
86
|
-
pools[pool][:devices][$1][:errors][:checksum] = $6
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
# Set the zpools data
|
92
|
-
zpools pools unless pools.empty?
|
93
|
-
end
|
94
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Author:: Jason J. W. Williams (williamsjj@digitar.com)
|
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 implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
|
20
|
+
Ohai.plugin(:Zpools) do
|
21
|
+
provides "zpools"
|
22
|
+
depends "platform_family"
|
23
|
+
|
24
|
+
# If zpool status doesn't know about a field it returns '-'.
|
25
|
+
# We don't want to fill a field with that
|
26
|
+
def sanitize_value(value)
|
27
|
+
value == "-" ? nil : value
|
28
|
+
end
|
29
|
+
|
30
|
+
def gather_pool_info
|
31
|
+
pools = Mash.new
|
32
|
+
begin
|
33
|
+
# Grab ZFS zpools overall health and attributes
|
34
|
+
so = shell_out("zpool list -H -o name,size,alloc,free,cap,dedup,health,version")
|
35
|
+
so.stdout.lines do |line|
|
36
|
+
case line
|
37
|
+
when /^([-_0-9A-Za-z]*)\s+([.0-9]+[MGTPE])\s+([.0-9]+[MGTPE])\s+([.0-9]+[MGTPE])\s+(\d+%)\s+([.0-9]+x)\s+([-_0-9A-Za-z]+)\s+(\d+|-)$/
|
38
|
+
Ohai::Log.debug("Plugin Zpools: Parsing zpool list line: #{line.chomp}")
|
39
|
+
pools[$1] = Mash.new
|
40
|
+
pools[$1][:pool_size] = sanitize_value($2)
|
41
|
+
pools[$1][:pool_allocated] = sanitize_value($3)
|
42
|
+
pools[$1][:pool_free] = sanitize_value($4)
|
43
|
+
pools[$1][:capacity_used] = sanitize_value($5)
|
44
|
+
pools[$1][:dedup_factor] = sanitize_value($6)
|
45
|
+
pools[$1][:health] = sanitize_value($7)
|
46
|
+
pools[$1][:zpool_version] = sanitize_value($8)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
rescue Ohai::Exceptions::Exec
|
50
|
+
Ohai::Log.debug('Plugin Zpools: Could not shell_out "zpool list -H -o name,size,alloc,free,cap,dedup,health,version". Skipping plugin.')
|
51
|
+
end
|
52
|
+
pools
|
53
|
+
end
|
54
|
+
|
55
|
+
collect_data(:solaris2, :linux, :freebsd, :openbsd, :netbsd, :dragonflybsd) do
|
56
|
+
pools = gather_pool_info
|
57
|
+
|
58
|
+
# Grab individual health for devices in the zpools
|
59
|
+
pools.each_key do |pool|
|
60
|
+
pools[pool][:devices] = Mash.new
|
61
|
+
|
62
|
+
# Run "zpool status" as non-root user (adm) so that
|
63
|
+
# the command won't try to open() each device which can
|
64
|
+
# hang the command if any of the disks are bad.
|
65
|
+
if platform_family == "solaris2"
|
66
|
+
command = "su adm -c \"zpool status #{pool}\""
|
67
|
+
else
|
68
|
+
# -L is used to give us real device names not label or uuid
|
69
|
+
# for example sda instead of ata-WDC_WD60EZAZ-00SF3B0_WD-WX32D203UXYK
|
70
|
+
command = "zpool status #{pool} -L"
|
71
|
+
end
|
72
|
+
|
73
|
+
so = shell_out(command)
|
74
|
+
so.stdout.lines do |line|
|
75
|
+
case line
|
76
|
+
# linux: http://rubular.com/r/J3wQC6E2lH
|
77
|
+
# solaris: http://rubular.com/r/FqOBzUQQ4p
|
78
|
+
# freebsd: http://rubular.com/r/RYkMNlytXl
|
79
|
+
when /^\s+((sd|c|ad|da|nvme|xvd)[-_a-zA-Z0-9]+)\s+([-_a-zA-Z0-9]+)\s+(\d+)\s+(\d+)\s+(\d+)$/
|
80
|
+
logger.trace("Plugin Zpools: Parsing zpool status line: #{line.chomp}")
|
81
|
+
pools[pool][:devices][$1] = Mash.new
|
82
|
+
pools[pool][:devices][$1][:state] = $3
|
83
|
+
pools[pool][:devices][$1][:errors] = Mash.new
|
84
|
+
pools[pool][:devices][$1][:errors][:read] = $4
|
85
|
+
pools[pool][:devices][$1][:errors][:write] = $5
|
86
|
+
pools[pool][:devices][$1][:errors][:checksum] = $6
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Set the zpools data
|
92
|
+
zpools pools unless pools.empty?
|
93
|
+
end
|
94
|
+
end
|
data/lib/ohai/provides_map.rb
CHANGED
@@ -1,208 +1,208 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
4
|
-
# Author:: Daniel DeLeo (<dan@chef.io>)
|
5
|
-
# Copyright:: Copyright (c) Chef Software Inc.
|
6
|
-
# License:: Apache License, Version 2.0
|
7
|
-
#
|
8
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
-
# you may not use this file except in compliance with the License.
|
10
|
-
# You may obtain a copy of the License at
|
11
|
-
#
|
12
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
-
#
|
14
|
-
# Unless required by applicable law or agreed to in writing, software
|
15
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
-
# See the License for the specific language governing permissions and
|
18
|
-
# limitations under the License.
|
19
|
-
#
|
20
|
-
|
21
|
-
require_relative "mash"
|
22
|
-
require_relative "exception"
|
23
|
-
require_relative "mixin/os"
|
24
|
-
require_relative "dsl"
|
25
|
-
|
26
|
-
module Ohai
|
27
|
-
class ProvidesMap
|
28
|
-
|
29
|
-
attr_reader :map
|
30
|
-
|
31
|
-
def initialize
|
32
|
-
@map = Mash.new
|
33
|
-
end
|
34
|
-
|
35
|
-
# @param [Ohai::DSL::Plugin] plugin
|
36
|
-
# @param [Array] provided_attributes
|
37
|
-
#
|
38
|
-
# @return void
|
39
|
-
#
|
40
|
-
def set_providers_for(plugin, provided_attributes)
|
41
|
-
unless plugin.is_a?(Ohai::DSL::Plugin)
|
42
|
-
raise ArgumentError, "set_providers_for only accepts Ohai Plugin classes (got: #{plugin})"
|
43
|
-
end
|
44
|
-
|
45
|
-
provided_attributes.each do |attribute|
|
46
|
-
attrs = @map
|
47
|
-
parts = normalize_and_validate(attribute)
|
48
|
-
parts.each do |part|
|
49
|
-
attrs[part] ||= Mash.new
|
50
|
-
attrs = attrs[part]
|
51
|
-
end
|
52
|
-
attrs[:_plugins] ||= []
|
53
|
-
attrs[:_plugins] << plugin
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
#
|
58
|
-
# gather plugins providing exactly the attributes listed
|
59
|
-
#
|
60
|
-
# @param [Array] attributes
|
61
|
-
#
|
62
|
-
# @return [Array] plugin names
|
63
|
-
#
|
64
|
-
def find_providers_for(attributes)
|
65
|
-
plugins = []
|
66
|
-
attributes.each do |attribute|
|
67
|
-
attrs = select_subtree(@map, attribute)
|
68
|
-
raise Ohai::Exceptions::AttributeNotFound, "No such attribute: '#{attribute}'" unless attrs
|
69
|
-
raise Ohai::Exceptions::ProviderNotFound, "Cannot find plugin providing attribute: '#{attribute}'" unless attrs[:_plugins]
|
70
|
-
|
71
|
-
plugins += attrs[:_plugins]
|
72
|
-
end
|
73
|
-
plugins.uniq
|
74
|
-
end
|
75
|
-
|
76
|
-
# This function is used to fetch the plugins for the attributes specified
|
77
|
-
# in the CLI options to Ohai.
|
78
|
-
# It first attempts to find the plugins for the attributes
|
79
|
-
# or the sub attributes given.
|
80
|
-
# If it can't find any, it looks for plugins that might
|
81
|
-
# provide the parents of a given attribute and returns the
|
82
|
-
# first parent found.
|
83
|
-
#
|
84
|
-
# @param [Array] attributes
|
85
|
-
#
|
86
|
-
# @return [Array] plugin names
|
87
|
-
def deep_find_providers_for(attributes)
|
88
|
-
plugins = []
|
89
|
-
attributes.each do |attribute|
|
90
|
-
attrs = select_subtree(@map, attribute)
|
91
|
-
|
92
|
-
unless attrs
|
93
|
-
attrs = select_closest_subtree(@map, attribute)
|
94
|
-
|
95
|
-
unless attrs
|
96
|
-
raise Ohai::Exceptions::AttributeNotFound, "No such attribute: '#{attribute}'"
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
collect_plugins_in(attrs, plugins)
|
101
|
-
end
|
102
|
-
|
103
|
-
plugins.uniq
|
104
|
-
end
|
105
|
-
|
106
|
-
# This function is used to fetch the plugins from
|
107
|
-
# 'depends "languages"' statements in plugins.
|
108
|
-
# It gathers plugins providing each of the attributes listed, or the
|
109
|
-
# plugins providing the closest parent attribute
|
110
|
-
#
|
111
|
-
# @param [Array] attributes
|
112
|
-
#
|
113
|
-
# @return [Array] plugin names
|
114
|
-
def find_closest_providers_for(attributes)
|
115
|
-
plugins = []
|
116
|
-
attributes.each do |attribute|
|
117
|
-
parts = normalize_and_validate(attribute)
|
118
|
-
raise Ohai::Exceptions::AttributeNotFound, "No such attribute: '#{attribute}'" unless @map[parts[0]]
|
119
|
-
|
120
|
-
attrs = select_closest_subtree(@map, attribute)
|
121
|
-
raise Ohai::Exceptions::ProviderNotFound, "Cannot find plugin providing attribute: '#{attribute}'" unless attrs
|
122
|
-
|
123
|
-
plugins += attrs[:_plugins]
|
124
|
-
end
|
125
|
-
plugins.uniq
|
126
|
-
end
|
127
|
-
|
128
|
-
def all_plugins(attribute_filter = nil)
|
129
|
-
if attribute_filter.nil?
|
130
|
-
collected = []
|
131
|
-
collect_plugins_in(map, collected).uniq
|
132
|
-
else
|
133
|
-
deep_find_providers_for(Array(attribute_filter))
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
private
|
138
|
-
|
139
|
-
def normalize_and_validate(attribute)
|
140
|
-
raise Ohai::Exceptions::AttributeSyntaxError, "Attribute contains duplicate '/' characters: #{attribute}" if %r{//+}.match?(attribute)
|
141
|
-
raise Ohai::Exceptions::AttributeSyntaxError, "Attribute contains a trailing '/': #{attribute}" if %r{/$}.match?(attribute)
|
142
|
-
|
143
|
-
parts = attribute.split("/")
|
144
|
-
parts.shift if parts.length != 0 && parts[0].length == 0 # attribute begins with a '/'
|
145
|
-
parts
|
146
|
-
end
|
147
|
-
|
148
|
-
def select_subtree(provides_map, attribute)
|
149
|
-
subtree = provides_map
|
150
|
-
parts = normalize_and_validate(attribute)
|
151
|
-
parts.each do |part|
|
152
|
-
return nil unless subtree[part]
|
153
|
-
|
154
|
-
subtree = subtree[part]
|
155
|
-
end
|
156
|
-
subtree
|
157
|
-
end
|
158
|
-
|
159
|
-
def select_closest_subtree(provides_map, attribute)
|
160
|
-
attr, *rest = normalize_and_validate(attribute)
|
161
|
-
|
162
|
-
# return nil if the top-level part of the attribute is not a
|
163
|
-
# top-level key in the provides_map (can't search any lower, and
|
164
|
-
# no information to return from this level of the search)
|
165
|
-
return nil unless provides_map[attr]
|
166
|
-
|
167
|
-
# attr is a key in the provides_map, search for the sub
|
168
|
-
# attribute under attr (if attribute = attr/sub1/sub2 then we
|
169
|
-
# search provides_map[attr] for sub1/sub2)
|
170
|
-
unless rest.empty?
|
171
|
-
subtree = select_closest_subtree(provides_map[attr], rest.join("/"))
|
172
|
-
end
|
173
|
-
|
174
|
-
if subtree.nil?
|
175
|
-
# no subtree of provides_map[attr] either 1) has a
|
176
|
-
# subattribute, 2) has a plugin providing a subattribute.
|
177
|
-
unless provides_map[attr][:_plugins]
|
178
|
-
# no providers for this attribute, this subtree won't do.
|
179
|
-
return nil # no providers for this attribute
|
180
|
-
else
|
181
|
-
# there are providers for this attribute, return its subtree
|
182
|
-
# to indicate this is the closest subtree
|
183
|
-
return provides_map[attr]
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
# we've already found a closest subtree or we've search all
|
188
|
-
# parent attributes of the original attribute and found no
|
189
|
-
# providers (subtree is nil in this case)
|
190
|
-
subtree
|
191
|
-
end
|
192
|
-
|
193
|
-
# Takes a section of the map, recursively searches for a `_plugins` key
|
194
|
-
# to find all the plugins in that section of the map. If given the whole
|
195
|
-
# map, it will find all of the plugins that have at least one provided
|
196
|
-
# attribute.
|
197
|
-
def collect_plugins_in(provides_map, collected)
|
198
|
-
provides_map.each_key do |plugin|
|
199
|
-
if plugin.eql?("_plugins")
|
200
|
-
collected.concat(provides_map[plugin])
|
201
|
-
else
|
202
|
-
collect_plugins_in(provides_map[plugin], collected)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
collected
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
4
|
+
# Author:: Daniel DeLeo (<dan@chef.io>)
|
5
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
6
|
+
# License:: Apache License, Version 2.0
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
require_relative "mash"
|
22
|
+
require_relative "exception"
|
23
|
+
require_relative "mixin/os"
|
24
|
+
require_relative "dsl"
|
25
|
+
|
26
|
+
module Ohai
|
27
|
+
class ProvidesMap
|
28
|
+
|
29
|
+
attr_reader :map
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@map = Mash.new
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param [Ohai::DSL::Plugin] plugin
|
36
|
+
# @param [Array] provided_attributes
|
37
|
+
#
|
38
|
+
# @return void
|
39
|
+
#
|
40
|
+
def set_providers_for(plugin, provided_attributes)
|
41
|
+
unless plugin.is_a?(Ohai::DSL::Plugin)
|
42
|
+
raise ArgumentError, "set_providers_for only accepts Ohai Plugin classes (got: #{plugin})"
|
43
|
+
end
|
44
|
+
|
45
|
+
provided_attributes.each do |attribute|
|
46
|
+
attrs = @map
|
47
|
+
parts = normalize_and_validate(attribute)
|
48
|
+
parts.each do |part|
|
49
|
+
attrs[part] ||= Mash.new
|
50
|
+
attrs = attrs[part]
|
51
|
+
end
|
52
|
+
attrs[:_plugins] ||= []
|
53
|
+
attrs[:_plugins] << plugin
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# gather plugins providing exactly the attributes listed
|
59
|
+
#
|
60
|
+
# @param [Array] attributes
|
61
|
+
#
|
62
|
+
# @return [Array] plugin names
|
63
|
+
#
|
64
|
+
def find_providers_for(attributes)
|
65
|
+
plugins = []
|
66
|
+
attributes.each do |attribute|
|
67
|
+
attrs = select_subtree(@map, attribute)
|
68
|
+
raise Ohai::Exceptions::AttributeNotFound, "No such attribute: \'#{attribute}\'" unless attrs
|
69
|
+
raise Ohai::Exceptions::ProviderNotFound, "Cannot find plugin providing attribute: \'#{attribute}\'" unless attrs[:_plugins]
|
70
|
+
|
71
|
+
plugins += attrs[:_plugins]
|
72
|
+
end
|
73
|
+
plugins.uniq
|
74
|
+
end
|
75
|
+
|
76
|
+
# This function is used to fetch the plugins for the attributes specified
|
77
|
+
# in the CLI options to Ohai.
|
78
|
+
# It first attempts to find the plugins for the attributes
|
79
|
+
# or the sub attributes given.
|
80
|
+
# If it can't find any, it looks for plugins that might
|
81
|
+
# provide the parents of a given attribute and returns the
|
82
|
+
# first parent found.
|
83
|
+
#
|
84
|
+
# @param [Array] attributes
|
85
|
+
#
|
86
|
+
# @return [Array] plugin names
|
87
|
+
def deep_find_providers_for(attributes)
|
88
|
+
plugins = []
|
89
|
+
attributes.each do |attribute|
|
90
|
+
attrs = select_subtree(@map, attribute)
|
91
|
+
|
92
|
+
unless attrs
|
93
|
+
attrs = select_closest_subtree(@map, attribute)
|
94
|
+
|
95
|
+
unless attrs
|
96
|
+
raise Ohai::Exceptions::AttributeNotFound, "No such attribute: \'#{attribute}\'"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
collect_plugins_in(attrs, plugins)
|
101
|
+
end
|
102
|
+
|
103
|
+
plugins.uniq
|
104
|
+
end
|
105
|
+
|
106
|
+
# This function is used to fetch the plugins from
|
107
|
+
# 'depends "languages"' statements in plugins.
|
108
|
+
# It gathers plugins providing each of the attributes listed, or the
|
109
|
+
# plugins providing the closest parent attribute
|
110
|
+
#
|
111
|
+
# @param [Array] attributes
|
112
|
+
#
|
113
|
+
# @return [Array] plugin names
|
114
|
+
def find_closest_providers_for(attributes)
|
115
|
+
plugins = []
|
116
|
+
attributes.each do |attribute|
|
117
|
+
parts = normalize_and_validate(attribute)
|
118
|
+
raise Ohai::Exceptions::AttributeNotFound, "No such attribute: \'#{attribute}\'" unless @map[parts[0]]
|
119
|
+
|
120
|
+
attrs = select_closest_subtree(@map, attribute)
|
121
|
+
raise Ohai::Exceptions::ProviderNotFound, "Cannot find plugin providing attribute: \'#{attribute}\'" unless attrs
|
122
|
+
|
123
|
+
plugins += attrs[:_plugins]
|
124
|
+
end
|
125
|
+
plugins.uniq
|
126
|
+
end
|
127
|
+
|
128
|
+
def all_plugins(attribute_filter = nil)
|
129
|
+
if attribute_filter.nil?
|
130
|
+
collected = []
|
131
|
+
collect_plugins_in(map, collected).uniq
|
132
|
+
else
|
133
|
+
deep_find_providers_for(Array(attribute_filter))
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
def normalize_and_validate(attribute)
|
140
|
+
raise Ohai::Exceptions::AttributeSyntaxError, "Attribute contains duplicate '/' characters: #{attribute}" if %r{//+}.match?(attribute)
|
141
|
+
raise Ohai::Exceptions::AttributeSyntaxError, "Attribute contains a trailing '/': #{attribute}" if %r{/$}.match?(attribute)
|
142
|
+
|
143
|
+
parts = attribute.split("/")
|
144
|
+
parts.shift if parts.length != 0 && parts[0].length == 0 # attribute begins with a '/'
|
145
|
+
parts
|
146
|
+
end
|
147
|
+
|
148
|
+
def select_subtree(provides_map, attribute)
|
149
|
+
subtree = provides_map
|
150
|
+
parts = normalize_and_validate(attribute)
|
151
|
+
parts.each do |part|
|
152
|
+
return nil unless subtree[part]
|
153
|
+
|
154
|
+
subtree = subtree[part]
|
155
|
+
end
|
156
|
+
subtree
|
157
|
+
end
|
158
|
+
|
159
|
+
def select_closest_subtree(provides_map, attribute)
|
160
|
+
attr, *rest = normalize_and_validate(attribute)
|
161
|
+
|
162
|
+
# return nil if the top-level part of the attribute is not a
|
163
|
+
# top-level key in the provides_map (can't search any lower, and
|
164
|
+
# no information to return from this level of the search)
|
165
|
+
return nil unless provides_map[attr]
|
166
|
+
|
167
|
+
# attr is a key in the provides_map, search for the sub
|
168
|
+
# attribute under attr (if attribute = attr/sub1/sub2 then we
|
169
|
+
# search provides_map[attr] for sub1/sub2)
|
170
|
+
unless rest.empty?
|
171
|
+
subtree = select_closest_subtree(provides_map[attr], rest.join("/"))
|
172
|
+
end
|
173
|
+
|
174
|
+
if subtree.nil?
|
175
|
+
# no subtree of provides_map[attr] either 1) has a
|
176
|
+
# subattribute, 2) has a plugin providing a subattribute.
|
177
|
+
unless provides_map[attr][:_plugins]
|
178
|
+
# no providers for this attribute, this subtree won't do.
|
179
|
+
return nil # no providers for this attribute
|
180
|
+
else
|
181
|
+
# there are providers for this attribute, return its subtree
|
182
|
+
# to indicate this is the closest subtree
|
183
|
+
return provides_map[attr]
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
# we've already found a closest subtree or we've search all
|
188
|
+
# parent attributes of the original attribute and found no
|
189
|
+
# providers (subtree is nil in this case)
|
190
|
+
subtree
|
191
|
+
end
|
192
|
+
|
193
|
+
# Takes a section of the map, recursively searches for a `_plugins` key
|
194
|
+
# to find all the plugins in that section of the map. If given the whole
|
195
|
+
# map, it will find all of the plugins that have at least one provided
|
196
|
+
# attribute.
|
197
|
+
def collect_plugins_in(provides_map, collected)
|
198
|
+
provides_map.each_key do |plugin|
|
199
|
+
if plugin.eql?("_plugins")
|
200
|
+
collected.concat(provides_map[plugin])
|
201
|
+
else
|
202
|
+
collect_plugins_in(provides_map[plugin], collected)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
collected
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|