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.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -28
  3. data/LICENSE +201 -201
  4. data/bin/ohai +25 -25
  5. data/lib/ohai/application.rb +189 -189
  6. data/lib/ohai/common/dmi.rb +167 -167
  7. data/lib/ohai/config.rb +51 -51
  8. data/lib/ohai/dsl/plugin/versionvii.rb +203 -203
  9. data/lib/ohai/dsl/plugin.rb +232 -232
  10. data/lib/ohai/dsl.rb +22 -22
  11. data/lib/ohai/exception.rb +36 -36
  12. data/lib/ohai/hints.rb +68 -68
  13. data/lib/ohai/loader.rb +178 -178
  14. data/lib/ohai/log.rb +34 -34
  15. data/lib/ohai/mash.rb +22 -22
  16. data/lib/ohai/mixin/alibaba_metadata.rb +83 -83
  17. data/lib/ohai/mixin/azure_metadata.rb +105 -105
  18. data/lib/ohai/mixin/chef_utils_wiring.rb +52 -52
  19. data/lib/ohai/mixin/command.rb +4 -4
  20. data/lib/ohai/mixin/constant_helper.rb +55 -55
  21. data/lib/ohai/mixin/dmi_decode.rb +54 -54
  22. data/lib/ohai/mixin/do_metadata.rb +48 -48
  23. data/lib/ohai/mixin/ec2_metadata.rb +264 -270
  24. data/lib/ohai/mixin/gce_metadata.rb +79 -79
  25. data/lib/ohai/mixin/http_helper.rb +64 -64
  26. data/lib/ohai/mixin/json_helper.rb +36 -36
  27. data/lib/ohai/mixin/network_helper.rb +92 -92
  28. data/lib/ohai/mixin/oci_metadata.rb +60 -60
  29. data/lib/ohai/mixin/os.rb +128 -128
  30. data/lib/ohai/mixin/scaleway_metadata.rb +51 -51
  31. data/lib/ohai/mixin/seconds_to_human.rb +52 -52
  32. data/lib/ohai/mixin/shell_out.rb +51 -51
  33. data/lib/ohai/mixin/softlayer_metadata.rb +74 -74
  34. data/lib/ohai/mixin/string.rb +31 -31
  35. data/lib/ohai/mixin/train_helpers.rb +36 -36
  36. data/lib/ohai/mixin/which.rb +39 -39
  37. data/lib/ohai/plugin_config.rb +47 -47
  38. data/lib/ohai/plugins/aix/kernel.rb +50 -50
  39. data/lib/ohai/plugins/aix/memory.rb +37 -37
  40. data/lib/ohai/plugins/aix/network.rb +142 -142
  41. data/lib/ohai/plugins/aix/platform.rb +30 -30
  42. data/lib/ohai/plugins/aix/uptime.rb +54 -54
  43. data/lib/ohai/plugins/aix/virtualization.rb +154 -154
  44. data/lib/ohai/plugins/alibaba.rb +72 -72
  45. data/lib/ohai/plugins/azure.rb +154 -154
  46. data/lib/ohai/plugins/bsd/virtualization.rb +121 -121
  47. data/lib/ohai/plugins/c.rb +178 -178
  48. data/lib/ohai/plugins/chef.rb +50 -50
  49. data/lib/ohai/plugins/cloud.rb +379 -379
  50. data/lib/ohai/plugins/command.rb +26 -26
  51. data/lib/ohai/plugins/cpu.rb +642 -642
  52. data/lib/ohai/plugins/darwin/hardware.rb +99 -99
  53. data/lib/ohai/plugins/darwin/memory.rb +62 -62
  54. data/lib/ohai/plugins/darwin/network.rb +207 -207
  55. data/lib/ohai/plugins/darwin/platform.rb +40 -40
  56. data/lib/ohai/plugins/darwin/virtualization.rb +104 -104
  57. data/lib/ohai/plugins/digital_ocean.rb +67 -67
  58. data/lib/ohai/plugins/dmi.rb +134 -134
  59. data/lib/ohai/plugins/docker.rb +58 -58
  60. data/lib/ohai/plugins/dragonflybsd/memory.rb +60 -60
  61. data/lib/ohai/plugins/dragonflybsd/network.rb +128 -128
  62. data/lib/ohai/plugins/dragonflybsd/platform.rb +28 -28
  63. data/lib/ohai/plugins/ec2.rb +148 -148
  64. data/lib/ohai/plugins/elixir.rb +36 -36
  65. data/lib/ohai/plugins/erlang.rb +60 -60
  66. data/lib/ohai/plugins/eucalyptus.rb +86 -86
  67. data/lib/ohai/plugins/filesystem.rb +753 -753
  68. data/lib/ohai/plugins/fips.rb +36 -36
  69. data/lib/ohai/plugins/freebsd/memory.rb +60 -60
  70. data/lib/ohai/plugins/freebsd/network.rb +128 -128
  71. data/lib/ohai/plugins/freebsd/platform.rb +28 -28
  72. data/lib/ohai/plugins/gce.rb +89 -89
  73. data/lib/ohai/plugins/go.rb +34 -34
  74. data/lib/ohai/plugins/groovy.rb +38 -38
  75. data/lib/ohai/plugins/grub2.rb +40 -40
  76. data/lib/ohai/plugins/habitat.rb +73 -73
  77. data/lib/ohai/plugins/haskell.rb +96 -96
  78. data/lib/ohai/plugins/hostname.rb +133 -133
  79. data/lib/ohai/plugins/init_package.rb +26 -26
  80. data/lib/ohai/plugins/java.rb +78 -78
  81. data/lib/ohai/plugins/kernel.rb +292 -292
  82. data/lib/ohai/plugins/keys.rb +27 -27
  83. data/lib/ohai/plugins/languages.rb +26 -26
  84. data/lib/ohai/plugins/libvirt.rb +114 -114
  85. data/lib/ohai/plugins/linode.rb +73 -73
  86. data/lib/ohai/plugins/linux/block_device.rb +48 -48
  87. data/lib/ohai/plugins/linux/hostnamectl.rb +34 -34
  88. data/lib/ohai/plugins/linux/interrupts.rb +84 -83
  89. data/lib/ohai/plugins/linux/ipc.rb +52 -52
  90. data/lib/ohai/plugins/linux/livepatch.rb +38 -38
  91. data/lib/ohai/plugins/linux/lsb.rb +46 -46
  92. data/lib/ohai/plugins/linux/lspci.rb +80 -80
  93. data/lib/ohai/plugins/linux/machineid.rb +36 -36
  94. data/lib/ohai/plugins/linux/mdadm.rb +120 -120
  95. data/lib/ohai/plugins/linux/memory.rb +106 -106
  96. data/lib/ohai/plugins/linux/network.rb +879 -879
  97. data/lib/ohai/plugins/linux/os_release.rb +38 -38
  98. data/lib/ohai/plugins/linux/platform.rb +314 -314
  99. data/lib/ohai/plugins/linux/selinux.rb +69 -69
  100. data/lib/ohai/plugins/linux/sessions.rb +54 -54
  101. data/lib/ohai/plugins/linux/sysctl.rb +39 -39
  102. data/lib/ohai/plugins/linux/systemd_paths.rb +36 -36
  103. data/lib/ohai/plugins/linux/tc.rb +61 -61
  104. data/lib/ohai/plugins/linux/virtualization.rb +300 -300
  105. data/lib/ohai/plugins/lua.rb +39 -39
  106. data/lib/ohai/plugins/mono.rb +50 -50
  107. data/lib/ohai/plugins/netbsd/memory.rb +99 -99
  108. data/lib/ohai/plugins/netbsd/network.rb +122 -122
  109. data/lib/ohai/plugins/netbsd/platform.rb +28 -28
  110. data/lib/ohai/plugins/network.rb +186 -186
  111. data/lib/ohai/plugins/nodejs.rb +40 -40
  112. data/lib/ohai/plugins/oci.rb +94 -94
  113. data/lib/ohai/plugins/ohai.rb +29 -29
  114. data/lib/ohai/plugins/ohai_time.rb +26 -26
  115. data/lib/ohai/plugins/openbsd/memory.rb +99 -99
  116. data/lib/ohai/plugins/openbsd/network.rb +122 -122
  117. data/lib/ohai/plugins/openbsd/platform.rb +28 -28
  118. data/lib/ohai/plugins/openstack.rb +84 -84
  119. data/lib/ohai/plugins/os.rb +55 -55
  120. data/lib/ohai/plugins/packages.rb +234 -234
  121. data/lib/ohai/plugins/passwd.rb +104 -104
  122. data/lib/ohai/plugins/perl.rb +45 -45
  123. data/lib/ohai/plugins/php.rb +52 -52
  124. data/lib/ohai/plugins/platform.rb +41 -41
  125. data/lib/ohai/plugins/powershell.rb +82 -82
  126. data/lib/ohai/plugins/ps.rb +35 -35
  127. data/lib/ohai/plugins/python.rb +43 -43
  128. data/lib/ohai/plugins/rackspace.rb +177 -177
  129. data/lib/ohai/plugins/root_group.rb +41 -41
  130. data/lib/ohai/plugins/rpm.rb +121 -121
  131. data/lib/ohai/plugins/ruby.rb +66 -66
  132. data/lib/ohai/plugins/rust.rb +34 -34
  133. data/lib/ohai/plugins/scala.rb +38 -38
  134. data/lib/ohai/plugins/scaleway.rb +58 -58
  135. data/lib/ohai/plugins/scsi.rb +52 -52
  136. data/lib/ohai/plugins/shard.rb +142 -142
  137. data/lib/ohai/plugins/shells.rb +32 -32
  138. data/lib/ohai/plugins/softlayer.rb +48 -48
  139. data/lib/ohai/plugins/solaris2/dmi.rb +191 -191
  140. data/lib/ohai/plugins/solaris2/memory.rb +32 -32
  141. data/lib/ohai/plugins/solaris2/network.rb +192 -192
  142. data/lib/ohai/plugins/solaris2/platform.rb +58 -58
  143. data/lib/ohai/plugins/solaris2/virtualization.rb +90 -90
  144. data/lib/ohai/plugins/ssh_host_key.rb +84 -84
  145. data/lib/ohai/plugins/sysconf.rb +46 -46
  146. data/lib/ohai/plugins/timezone.rb +45 -45
  147. data/lib/ohai/plugins/train.rb +35 -35
  148. data/lib/ohai/plugins/uptime.rb +95 -95
  149. data/lib/ohai/plugins/virtualbox.rb +197 -197
  150. data/lib/ohai/plugins/vmware.rb +109 -109
  151. data/lib/ohai/plugins/windows/dmi.rb +95 -95
  152. data/lib/ohai/plugins/windows/drivers.rb +52 -52
  153. data/lib/ohai/plugins/windows/memory.rb +39 -39
  154. data/lib/ohai/plugins/windows/network.rb +222 -222
  155. data/lib/ohai/plugins/windows/platform.rb +34 -34
  156. data/lib/ohai/plugins/windows/system_enclosure.rb +29 -29
  157. data/lib/ohai/plugins/windows/virtualization.rb +45 -45
  158. data/lib/ohai/plugins/zpools.rb +94 -94
  159. data/lib/ohai/provides_map.rb +208 -208
  160. data/lib/ohai/runner.rb +128 -126
  161. data/lib/ohai/system.rb +258 -258
  162. data/lib/ohai/train_transport.rb +29 -29
  163. data/lib/ohai/util/file_helper.rb +6 -6
  164. data/lib/ohai/util/ip_helper.rb +56 -56
  165. data/lib/ohai/util/win32.rb +47 -47
  166. data/lib/ohai/version.rb +23 -23
  167. data/lib/ohai.rb +23 -23
  168. data/ohai.gemspec +35 -35
  169. metadata +9 -15
@@ -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
@@ -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