ohai 18.0.26 → 18.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) 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 +86 -86
  17. data/lib/ohai/mixin/azure_metadata.rb +111 -111
  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 +256 -256
  24. data/lib/ohai/mixin/gce_metadata.rb +83 -83
  25. data/lib/ohai/mixin/http_helper.rb +64 -64
  26. data/lib/ohai/mixin/network_helper.rb +65 -65
  27. data/lib/ohai/mixin/oci_metadata.rb +69 -0
  28. data/lib/ohai/mixin/os.rb +128 -128
  29. data/lib/ohai/mixin/scaleway_metadata.rb +51 -51
  30. data/lib/ohai/mixin/seconds_to_human.rb +52 -52
  31. data/lib/ohai/mixin/shell_out.rb +51 -51
  32. data/lib/ohai/mixin/softlayer_metadata.rb +74 -74
  33. data/lib/ohai/mixin/string.rb +31 -31
  34. data/lib/ohai/mixin/train_helpers.rb +36 -36
  35. data/lib/ohai/mixin/which.rb +39 -39
  36. data/lib/ohai/plugin_config.rb +47 -47
  37. data/lib/ohai/plugins/aix/kernel.rb +50 -50
  38. data/lib/ohai/plugins/aix/memory.rb +37 -37
  39. data/lib/ohai/plugins/aix/network.rb +142 -142
  40. data/lib/ohai/plugins/aix/platform.rb +30 -30
  41. data/lib/ohai/plugins/aix/uptime.rb +54 -54
  42. data/lib/ohai/plugins/aix/virtualization.rb +154 -154
  43. data/lib/ohai/plugins/alibaba.rb +72 -72
  44. data/lib/ohai/plugins/azure.rb +154 -154
  45. data/lib/ohai/plugins/bsd/virtualization.rb +121 -121
  46. data/lib/ohai/plugins/c.rb +178 -178
  47. data/lib/ohai/plugins/chef.rb +50 -50
  48. data/lib/ohai/plugins/cloud.rb +379 -357
  49. data/lib/ohai/plugins/command.rb +26 -26
  50. data/lib/ohai/plugins/cpu.rb +635 -635
  51. data/lib/ohai/plugins/darwin/hardware.rb +99 -99
  52. data/lib/ohai/plugins/darwin/memory.rb +62 -62
  53. data/lib/ohai/plugins/darwin/network.rb +207 -207
  54. data/lib/ohai/plugins/darwin/platform.rb +38 -38
  55. data/lib/ohai/plugins/darwin/virtualization.rb +90 -93
  56. data/lib/ohai/plugins/digital_ocean.rb +67 -67
  57. data/lib/ohai/plugins/dmi.rb +134 -134
  58. data/lib/ohai/plugins/docker.rb +58 -58
  59. data/lib/ohai/plugins/dragonflybsd/memory.rb +60 -60
  60. data/lib/ohai/plugins/dragonflybsd/network.rb +128 -128
  61. data/lib/ohai/plugins/dragonflybsd/platform.rb +28 -28
  62. data/lib/ohai/plugins/ec2.rb +148 -148
  63. data/lib/ohai/plugins/elixir.rb +36 -36
  64. data/lib/ohai/plugins/erlang.rb +60 -60
  65. data/lib/ohai/plugins/eucalyptus.rb +86 -86
  66. data/lib/ohai/plugins/filesystem.rb +751 -751
  67. data/lib/ohai/plugins/fips.rb +36 -36
  68. data/lib/ohai/plugins/freebsd/memory.rb +60 -60
  69. data/lib/ohai/plugins/freebsd/network.rb +128 -128
  70. data/lib/ohai/plugins/freebsd/platform.rb +28 -28
  71. data/lib/ohai/plugins/gce.rb +89 -89
  72. data/lib/ohai/plugins/go.rb +34 -34
  73. data/lib/ohai/plugins/groovy.rb +38 -38
  74. data/lib/ohai/plugins/grub2.rb +40 -40
  75. data/lib/ohai/plugins/habitat.rb +73 -73
  76. data/lib/ohai/plugins/haskell.rb +96 -96
  77. data/lib/ohai/plugins/hostname.rb +133 -133
  78. data/lib/ohai/plugins/init_package.rb +26 -26
  79. data/lib/ohai/plugins/java.rb +78 -78
  80. data/lib/ohai/plugins/kernel.rb +292 -292
  81. data/lib/ohai/plugins/keys.rb +27 -27
  82. data/lib/ohai/plugins/languages.rb +26 -26
  83. data/lib/ohai/plugins/libvirt.rb +114 -114
  84. data/lib/ohai/plugins/linode.rb +73 -73
  85. data/lib/ohai/plugins/linux/block_device.rb +48 -48
  86. data/lib/ohai/plugins/linux/hostnamectl.rb +34 -34
  87. data/lib/ohai/plugins/linux/interrupts.rb +84 -84
  88. data/lib/ohai/plugins/linux/ipc.rb +52 -52
  89. data/lib/ohai/plugins/linux/livepatch.rb +38 -38
  90. data/lib/ohai/plugins/linux/lsb.rb +46 -46
  91. data/lib/ohai/plugins/linux/lspci.rb +76 -76
  92. data/lib/ohai/plugins/linux/machineid.rb +36 -36
  93. data/lib/ohai/plugins/linux/mdadm.rb +120 -120
  94. data/lib/ohai/plugins/linux/memory.rb +106 -106
  95. data/lib/ohai/plugins/linux/network.rb +879 -879
  96. data/lib/ohai/plugins/linux/os_release.rb +38 -38
  97. data/lib/ohai/plugins/linux/platform.rb +314 -314
  98. data/lib/ohai/plugins/linux/selinux.rb +69 -69
  99. data/lib/ohai/plugins/linux/sessions.rb +54 -54
  100. data/lib/ohai/plugins/linux/sysctl.rb +39 -39
  101. data/lib/ohai/plugins/linux/systemd_paths.rb +36 -36
  102. data/lib/ohai/plugins/linux/tc.rb +61 -61
  103. data/lib/ohai/plugins/linux/virtualization.rb +300 -300
  104. data/lib/ohai/plugins/lua.rb +39 -39
  105. data/lib/ohai/plugins/mono.rb +50 -50
  106. data/lib/ohai/plugins/netbsd/memory.rb +99 -99
  107. data/lib/ohai/plugins/netbsd/network.rb +122 -122
  108. data/lib/ohai/plugins/netbsd/platform.rb +28 -28
  109. data/lib/ohai/plugins/network.rb +186 -186
  110. data/lib/ohai/plugins/nodejs.rb +40 -40
  111. data/lib/ohai/plugins/oci.rb +94 -0
  112. data/lib/ohai/plugins/ohai.rb +29 -29
  113. data/lib/ohai/plugins/ohai_time.rb +26 -26
  114. data/lib/ohai/plugins/openbsd/memory.rb +99 -99
  115. data/lib/ohai/plugins/openbsd/network.rb +122 -122
  116. data/lib/ohai/plugins/openbsd/platform.rb +28 -28
  117. data/lib/ohai/plugins/openstack.rb +84 -84
  118. data/lib/ohai/plugins/os.rb +55 -55
  119. data/lib/ohai/plugins/packages.rb +234 -234
  120. data/lib/ohai/plugins/passwd.rb +104 -104
  121. data/lib/ohai/plugins/perl.rb +45 -45
  122. data/lib/ohai/plugins/php.rb +52 -52
  123. data/lib/ohai/plugins/platform.rb +29 -29
  124. data/lib/ohai/plugins/powershell.rb +82 -82
  125. data/lib/ohai/plugins/ps.rb +35 -35
  126. data/lib/ohai/plugins/python.rb +43 -43
  127. data/lib/ohai/plugins/rackspace.rb +177 -177
  128. data/lib/ohai/plugins/root_group.rb +41 -41
  129. data/lib/ohai/plugins/rpm.rb +121 -121
  130. data/lib/ohai/plugins/ruby.rb +66 -66
  131. data/lib/ohai/plugins/rust.rb +34 -34
  132. data/lib/ohai/plugins/scala.rb +38 -38
  133. data/lib/ohai/plugins/scaleway.rb +58 -58
  134. data/lib/ohai/plugins/scsi.rb +52 -52
  135. data/lib/ohai/plugins/shard.rb +142 -142
  136. data/lib/ohai/plugins/shells.rb +32 -32
  137. data/lib/ohai/plugins/softlayer.rb +48 -48
  138. data/lib/ohai/plugins/solaris2/dmi.rb +191 -191
  139. data/lib/ohai/plugins/solaris2/memory.rb +32 -32
  140. data/lib/ohai/plugins/solaris2/network.rb +192 -192
  141. data/lib/ohai/plugins/solaris2/platform.rb +58 -58
  142. data/lib/ohai/plugins/solaris2/virtualization.rb +90 -90
  143. data/lib/ohai/plugins/ssh_host_key.rb +84 -84
  144. data/lib/ohai/plugins/sysconf.rb +46 -46
  145. data/lib/ohai/plugins/timezone.rb +45 -25
  146. data/lib/ohai/plugins/train.rb +35 -35
  147. data/lib/ohai/plugins/uptime.rb +95 -95
  148. data/lib/ohai/plugins/virtualbox.rb +197 -197
  149. data/lib/ohai/plugins/vmware.rb +109 -94
  150. data/lib/ohai/plugins/windows/dmi.rb +95 -95
  151. data/lib/ohai/plugins/windows/drivers.rb +52 -52
  152. data/lib/ohai/plugins/windows/memory.rb +39 -39
  153. data/lib/ohai/plugins/windows/network.rb +222 -222
  154. data/lib/ohai/plugins/windows/platform.rb +34 -34
  155. data/lib/ohai/plugins/windows/system_enclosure.rb +29 -29
  156. data/lib/ohai/plugins/windows/virtualization.rb +45 -45
  157. data/lib/ohai/plugins/zpools.rb +94 -94
  158. data/lib/ohai/provides_map.rb +208 -208
  159. data/lib/ohai/runner.rb +128 -128
  160. data/lib/ohai/system.rb +258 -258
  161. data/lib/ohai/train_transport.rb +29 -29
  162. data/lib/ohai/util/file_helper.rb +6 -6
  163. data/lib/ohai/util/ip_helper.rb +56 -56
  164. data/lib/ohai/util/win32.rb +47 -47
  165. data/lib/ohai/version.rb +23 -23
  166. data/lib/ohai.rb +23 -23
  167. data/ohai.gemspec +35 -35
  168. metadata +5 -3
data/lib/ohai/hints.rb CHANGED
@@ -1,68 +1,68 @@
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 "ffi_yajl" unless defined?(FFI_Yajl)
22
-
23
- module Ohai
24
- # Ohai hints are json files on disk that give ohai a hint to things that are often
25
- # difficult to discover like certain clouds. Previously they were used for just about
26
- # every cloud, but we've since discoverd better ways to auto-detect these clouds.
27
- # They are generally dropped off by the knife plugins for those clouds during bootstrap,
28
- # but may also be manually dropped off and consumed by 3rd party plugins.
29
- module Hints
30
- # clear out any known hints in the @hints variable
31
- def self.refresh_hints
32
- @hints = {}
33
- end
34
-
35
- # parse the JSON contents of a hint file. Return an empty hash if the file has
36
- # no JSON content
37
- # @param filename [String] the hint file path
38
- def self.parse_hint_file(filename)
39
- json_parser = FFI_Yajl::Parser.new
40
- hash = json_parser.parse(File.read(filename))
41
- hash || {} # hint
42
- # should exist because the file did, even if it didn't
43
- # contain anything
44
- rescue FFI_Yajl::ParseError => e
45
- Ohai::Log.error("Could not parse hint file at #{filename}: #{e.message}")
46
- end
47
-
48
- # retrieve hint contents given a hint name. Looks up in @hints variable first. Attempts
49
- # to load from file in config's :hints_path if not already cached. Saves the contents
50
- # to the hash if the file was successfully parsed
51
- # @param name [String] the name of the hint (not the path)
52
- def self.hint?(name)
53
- @hints ||= {}
54
- return @hints[name] if @hints[name]
55
-
56
- Ohai.config[:hints_path].each do |path|
57
- filename = File.join(path, "#{name}.json")
58
- next unless File.exist?(filename)
59
-
60
- Ohai::Log.trace("Found hint #{name}.json at #{filename}")
61
- @hints[name] = parse_hint_file(filename)
62
- end
63
-
64
- Ohai::Log.trace("Did not find hint #{name}.json in the hint path(s): #{Ohai.config[:hints_path].join(", ")} ") unless @hints.key?(name)
65
- @hints[name]
66
- end
67
- end
68
- 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 "ffi_yajl" unless defined?(FFI_Yajl)
22
+
23
+ module Ohai
24
+ # Ohai hints are json files on disk that give ohai a hint to things that are often
25
+ # difficult to discover like certain clouds. Previously they were used for just about
26
+ # every cloud, but we've since discoverd better ways to auto-detect these clouds.
27
+ # They are generally dropped off by the knife plugins for those clouds during bootstrap,
28
+ # but may also be manually dropped off and consumed by 3rd party plugins.
29
+ module Hints
30
+ # clear out any known hints in the @hints variable
31
+ def self.refresh_hints
32
+ @hints = {}
33
+ end
34
+
35
+ # parse the JSON contents of a hint file. Return an empty hash if the file has
36
+ # no JSON content
37
+ # @param filename [String] the hint file path
38
+ def self.parse_hint_file(filename)
39
+ json_parser = FFI_Yajl::Parser.new
40
+ hash = json_parser.parse(File.read(filename))
41
+ hash || {} # hint
42
+ # should exist because the file did, even if it didn't
43
+ # contain anything
44
+ rescue FFI_Yajl::ParseError => e
45
+ Ohai::Log.error("Could not parse hint file at #{filename}: #{e.message}")
46
+ end
47
+
48
+ # retrieve hint contents given a hint name. Looks up in @hints variable first. Attempts
49
+ # to load from file in config's :hints_path if not already cached. Saves the contents
50
+ # to the hash if the file was successfully parsed
51
+ # @param name [String] the name of the hint (not the path)
52
+ def self.hint?(name)
53
+ @hints ||= {}
54
+ return @hints[name] if @hints[name]
55
+
56
+ Ohai.config[:hints_path].each do |path|
57
+ filename = File.join(path, "#{name}.json")
58
+ next unless File.exist?(filename)
59
+
60
+ Ohai::Log.trace("Found hint #{name}.json at #{filename}")
61
+ @hints[name] = parse_hint_file(filename)
62
+ end
63
+
64
+ Ohai::Log.trace("Did not find hint #{name}.json in the hint path(s): #{Ohai.config[:hints_path].join(", ")} ") unless @hints.key?(name)
65
+ @hints[name]
66
+ end
67
+ end
68
+ end
data/lib/ohai/loader.rb CHANGED
@@ -1,178 +1,178 @@
1
- #
2
- # Author:: Claire McQuin (<claire@chef.io>)
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
-
19
- require "chef-config/path_helper"
20
- require_relative "log"
21
- require_relative "mash"
22
- require_relative "dsl"
23
- require "pathname" unless defined?(Pathname)
24
-
25
- module Ohai
26
-
27
- # Ohai plugin loader. Finds all the plugins specified in the
28
- # Ohai.config :plugin_path (supports a single or multiple path setting
29
- # here), evaluates them and returns plugin objects.
30
- class Loader
31
- attr_reader :logger
32
-
33
- def initialize(controller)
34
- @controller = controller
35
- @logger = controller.logger.with_child(subsystem: "loader")
36
- @v7_plugin_classes = []
37
- end
38
-
39
- # Searches all plugin paths and returns an Array of file paths to plugins
40
- #
41
- # @param dir [Array, String] directory/directories to load plugins from
42
- # @return [Array<String>]
43
- def plugin_files_by_dir(plugin_dir = Ohai.config[:plugin_path])
44
- Array(plugin_dir).map do |path|
45
- if Dir.exist?(path)
46
- Ohai::Log.trace("Searching for Ohai plugins in #{path}")
47
-
48
- escaped = ChefConfig::PathHelper.escape_glob_dir(path)
49
- Dir[File.join(escaped, "**", "*.rb")]
50
- else
51
- Ohai::Log.debug("The plugin path #{path} does not exist. Skipping...")
52
- []
53
- end
54
- end.flatten
55
- end
56
-
57
- # loads all plugin classes
58
- #
59
- # @return [Array<String>]
60
- def load_all
61
- plugin_files_by_dir.each do |plugin_file|
62
- load_plugin_class(plugin_file)
63
- end
64
-
65
- collect_v7_plugins
66
- end
67
-
68
- # load additional plugins classes from a given directory
69
- # @param from [String] path to a directory with additional plugins to load
70
- def load_additional(from)
71
- from = [ Ohai.config[:plugin_path], from].flatten
72
- plugin_files_by_dir(from).collect do |plugin_file|
73
- logger.trace "Loading additional plugin: #{plugin_file}"
74
- load_v7_plugin(load_plugin_class(plugin_file))
75
- end
76
- end
77
-
78
- # Load a specified file as an ohai plugin and creates an instance of it.
79
- # Not used by ohai itself, but is used in the specs to load plugins for testing
80
- #
81
- # @private
82
- # @param plugin_path [String]
83
- def load_plugin(plugin_path)
84
- plugin_class = load_plugin_class(plugin_path)
85
- return nil unless plugin_class.is_a?(Class)
86
-
87
- if plugin_class < Ohai::DSL::Plugin::VersionVII
88
- load_v7_plugin(plugin_class)
89
- else
90
- raise Exceptions::IllegalPluginDefinition, "cannot create plugin of type #{plugin_class}"
91
- end
92
- end
93
-
94
- # load an ohai plugin object class from file
95
- # @param plugin_path String the path to the ohai plugin
96
- #
97
- # @return [Object] class object for the ohai plugin defined in the file
98
- def load_plugin_class(plugin_path)
99
- # Read the contents of the plugin to understand if it's a V6 or V7 plugin.
100
- contents = ""
101
- begin
102
- logger.trace("Loading plugin at #{plugin_path}")
103
- contents << IO.read(plugin_path)
104
- rescue IOError, Errno::ENOENT
105
- logger.warn("Unable to open or read plugin at #{plugin_path}")
106
- return nil
107
- end
108
-
109
- # We assume that a plugin is a V7 plugin if it contains Ohai.plugin in its contents.
110
- if contents.include?("Ohai.plugin")
111
- load_v7_plugin_class(contents, plugin_path)
112
- else
113
- raise Exceptions::IllegalPluginDefinition, "[DEPRECATION] Plugin at #{plugin_path}"\
114
- " is a version 6 plugin. Version 6 plugins are no longer supported by Ohai. This"\
115
- " plugin will need to be updated to the v7 Ohai plugin format. See"\
116
- " https://docs.chef.io/ohai_custom.html for v7 syntax."
117
- end
118
- end
119
-
120
- private
121
-
122
- def collect_provides(plugin)
123
- plugin_provides = plugin.class.provides_attrs
124
- @controller.provides_map.set_providers_for(plugin, plugin_provides)
125
- end
126
-
127
- def collect_v7_plugins
128
- @v7_plugin_classes.each do |plugin_class|
129
- load_v7_plugin(plugin_class)
130
- end
131
- end
132
-
133
- # load an Ohai v7 plugin class from a string of the object
134
- # @param contents [String] text of the plugin object
135
- # @param plugin_path [String] the path to the plugin file where the contents came from
136
- #
137
- # @return [Ohai::DSL::Plugin::VersionVII] Ohai plugin object
138
- def load_v7_plugin_class(contents, plugin_path)
139
- plugin_class = eval(contents, TOPLEVEL_BINDING, plugin_path) # rubocop: disable Security/Eval
140
- unless plugin_class.is_a?(Class) && plugin_class < Ohai::DSL::Plugin
141
- raise Ohai::Exceptions::IllegalPluginDefinition, "Plugin file cannot contain any statements after the plugin definition"
142
- end
143
-
144
- plugin_class.sources << plugin_path
145
- @v7_plugin_classes << plugin_class unless @v7_plugin_classes.include?(plugin_class)
146
- plugin_class
147
- rescue SystemExit, Interrupt # rubocop: disable Lint/ShadowedException
148
- raise
149
- rescue Ohai::Exceptions::InvalidPluginName => e
150
- logger.warn("Plugin Name Error: <#{plugin_path}>: #{e.message}")
151
- rescue Ohai::Exceptions::IllegalPluginDefinition => e
152
- logger.warn("Plugin Definition Error: <#{plugin_path}>: #{e.message}")
153
- rescue NoMethodError => e
154
- logger.warn("Plugin Method Error: <#{plugin_path}>: unsupported operation \'#{e.name}\'")
155
- rescue SyntaxError => e
156
- # split on occurrences of
157
- # <env>: syntax error,
158
- # <env>:##: syntax error,
159
- # to remove from error message
160
- parts = e.message.split(/<.*>[:[0-9]+]*: syntax error, /)
161
- parts.each do |part|
162
- next if part.length == 0
163
-
164
- logger.warn("Plugin Syntax Error: <#{plugin_path}>: #{part}")
165
- end
166
- rescue Exception => e
167
- logger.warn("Plugin Error: <#{plugin_path}>: #{e.message}")
168
- logger.trace("Plugin Error: <#{plugin_path}>: #{e.inspect}, #{e.backtrace.join('\n')}")
169
- end
170
-
171
- def load_v7_plugin(plugin_class)
172
- plugin = plugin_class.new(@controller.data, @controller.logger)
173
- collect_provides(plugin)
174
- plugin
175
- end
176
-
177
- end
178
- end
1
+ #
2
+ # Author:: Claire McQuin (<claire@chef.io>)
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
+
19
+ require "chef-config/path_helper"
20
+ require_relative "log"
21
+ require_relative "mash"
22
+ require_relative "dsl"
23
+ require "pathname" unless defined?(Pathname)
24
+
25
+ module Ohai
26
+
27
+ # Ohai plugin loader. Finds all the plugins specified in the
28
+ # Ohai.config :plugin_path (supports a single or multiple path setting
29
+ # here), evaluates them and returns plugin objects.
30
+ class Loader
31
+ attr_reader :logger
32
+
33
+ def initialize(controller)
34
+ @controller = controller
35
+ @logger = controller.logger.with_child(subsystem: "loader")
36
+ @v7_plugin_classes = []
37
+ end
38
+
39
+ # Searches all plugin paths and returns an Array of file paths to plugins
40
+ #
41
+ # @param dir [Array, String] directory/directories to load plugins from
42
+ # @return [Array<String>]
43
+ def plugin_files_by_dir(plugin_dir = Ohai.config[:plugin_path])
44
+ Array(plugin_dir).map do |path|
45
+ if Dir.exist?(path)
46
+ Ohai::Log.trace("Searching for Ohai plugins in #{path}")
47
+
48
+ escaped = ChefConfig::PathHelper.escape_glob_dir(path)
49
+ Dir[File.join(escaped, "**", "*.rb")]
50
+ else
51
+ Ohai::Log.debug("The plugin path #{path} does not exist. Skipping...")
52
+ []
53
+ end
54
+ end.flatten
55
+ end
56
+
57
+ # loads all plugin classes
58
+ #
59
+ # @return [Array<String>]
60
+ def load_all
61
+ plugin_files_by_dir.each do |plugin_file|
62
+ load_plugin_class(plugin_file)
63
+ end
64
+
65
+ collect_v7_plugins
66
+ end
67
+
68
+ # load additional plugins classes from a given directory
69
+ # @param from [String] path to a directory with additional plugins to load
70
+ def load_additional(from)
71
+ from = [ Ohai.config[:plugin_path], from].flatten
72
+ plugin_files_by_dir(from).collect do |plugin_file|
73
+ logger.trace "Loading additional plugin: #{plugin_file}"
74
+ load_v7_plugin(load_plugin_class(plugin_file))
75
+ end
76
+ end
77
+
78
+ # Load a specified file as an ohai plugin and creates an instance of it.
79
+ # Not used by ohai itself, but is used in the specs to load plugins for testing
80
+ #
81
+ # @private
82
+ # @param plugin_path [String]
83
+ def load_plugin(plugin_path)
84
+ plugin_class = load_plugin_class(plugin_path)
85
+ return nil unless plugin_class.is_a?(Class)
86
+
87
+ if plugin_class < Ohai::DSL::Plugin::VersionVII
88
+ load_v7_plugin(plugin_class)
89
+ else
90
+ raise Exceptions::IllegalPluginDefinition, "cannot create plugin of type #{plugin_class}"
91
+ end
92
+ end
93
+
94
+ # load an ohai plugin object class from file
95
+ # @param plugin_path String the path to the ohai plugin
96
+ #
97
+ # @return [Object] class object for the ohai plugin defined in the file
98
+ def load_plugin_class(plugin_path)
99
+ # Read the contents of the plugin to understand if it's a V6 or V7 plugin.
100
+ contents = ""
101
+ begin
102
+ logger.trace("Loading plugin at #{plugin_path}")
103
+ contents << IO.read(plugin_path)
104
+ rescue IOError, Errno::ENOENT
105
+ logger.warn("Unable to open or read plugin at #{plugin_path}")
106
+ return nil
107
+ end
108
+
109
+ # We assume that a plugin is a V7 plugin if it contains Ohai.plugin in its contents.
110
+ if contents.include?("Ohai.plugin")
111
+ load_v7_plugin_class(contents, plugin_path)
112
+ else
113
+ raise Exceptions::IllegalPluginDefinition, "[DEPRECATION] Plugin at #{plugin_path}"\
114
+ " is a version 6 plugin. Version 6 plugins are no longer supported by Ohai. This"\
115
+ " plugin will need to be updated to the v7 Ohai plugin format. See"\
116
+ " https://docs.chef.io/ohai_custom.html for v7 syntax."
117
+ end
118
+ end
119
+
120
+ private
121
+
122
+ def collect_provides(plugin)
123
+ plugin_provides = plugin.class.provides_attrs
124
+ @controller.provides_map.set_providers_for(plugin, plugin_provides)
125
+ end
126
+
127
+ def collect_v7_plugins
128
+ @v7_plugin_classes.each do |plugin_class|
129
+ load_v7_plugin(plugin_class)
130
+ end
131
+ end
132
+
133
+ # load an Ohai v7 plugin class from a string of the object
134
+ # @param contents [String] text of the plugin object
135
+ # @param plugin_path [String] the path to the plugin file where the contents came from
136
+ #
137
+ # @return [Ohai::DSL::Plugin::VersionVII] Ohai plugin object
138
+ def load_v7_plugin_class(contents, plugin_path)
139
+ plugin_class = eval(contents, TOPLEVEL_BINDING, plugin_path) # rubocop: disable Security/Eval
140
+ unless plugin_class.is_a?(Class) && plugin_class < Ohai::DSL::Plugin
141
+ raise Ohai::Exceptions::IllegalPluginDefinition, "Plugin file cannot contain any statements after the plugin definition"
142
+ end
143
+
144
+ plugin_class.sources << plugin_path
145
+ @v7_plugin_classes << plugin_class unless @v7_plugin_classes.include?(plugin_class)
146
+ plugin_class
147
+ rescue SystemExit, Interrupt # rubocop: disable Lint/ShadowedException
148
+ raise
149
+ rescue Ohai::Exceptions::InvalidPluginName => e
150
+ logger.warn("Plugin Name Error: <#{plugin_path}>: #{e.message}")
151
+ rescue Ohai::Exceptions::IllegalPluginDefinition => e
152
+ logger.warn("Plugin Definition Error: <#{plugin_path}>: #{e.message}")
153
+ rescue NoMethodError => e
154
+ logger.warn("Plugin Method Error: <#{plugin_path}>: unsupported operation \'#{e.name}\'")
155
+ rescue SyntaxError => e
156
+ # split on occurrences of
157
+ # <env>: syntax error,
158
+ # <env>:##: syntax error,
159
+ # to remove from error message
160
+ parts = e.message.split(/<.*>[:[0-9]+]*: syntax error, /)
161
+ parts.each do |part|
162
+ next if part.length == 0
163
+
164
+ logger.warn("Plugin Syntax Error: <#{plugin_path}>: #{part}")
165
+ end
166
+ rescue Exception => e
167
+ logger.warn("Plugin Error: <#{plugin_path}>: #{e.message}")
168
+ logger.trace("Plugin Error: <#{plugin_path}>: #{e.inspect}, #{e.backtrace.join('\n')}")
169
+ end
170
+
171
+ def load_v7_plugin(plugin_class)
172
+ plugin = plugin_class.new(@controller.data, @controller.logger)
173
+ collect_provides(plugin)
174
+ plugin
175
+ end
176
+
177
+ end
178
+ end
data/lib/ohai/log.rb CHANGED
@@ -1,34 +1,34 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Adam Jacob (<adam@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 implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
- #
19
-
20
- require "mixlib/log" unless defined?(Mixlib::Log)
21
-
22
- module Ohai
23
- # the Ohai Logger which is just Mixlib::Log defaulting to STDERR and :info level
24
- # unless otherwise configured via CLI or config
25
- class Log
26
- extend Mixlib::Log
27
-
28
- # this class loading initialization is so that we don't lose early logger
29
- # messages when run from the CLI?
30
- init(STDERR)
31
- level = :info # rubocop:disable Lint/UselessAssignment
32
-
33
- end
34
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Adam Jacob (<adam@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 implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require "mixlib/log" unless defined?(Mixlib::Log)
21
+
22
+ module Ohai
23
+ # the Ohai Logger which is just Mixlib::Log defaulting to STDERR and :info level
24
+ # unless otherwise configured via CLI or config
25
+ class Log
26
+ extend Mixlib::Log
27
+
28
+ # this class loading initialization is so that we don't lose early logger
29
+ # messages when run from the CLI?
30
+ init(STDERR)
31
+ level = :info # rubocop:disable Lint/UselessAssignment
32
+
33
+ end
34
+ end
data/lib/ohai/mash.rb CHANGED
@@ -1,22 +1,22 @@
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
-
19
- require "chef-utils/mash" unless defined?(ChefUtils::Mash)
20
-
21
- # For historical reasons we inject Mash directly into the top level class namespace
22
- Mash = ChefUtils::Mash unless defined?(Mash)
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
+
19
+ require "chef-utils/mash" unless defined?(ChefUtils::Mash)
20
+
21
+ # For historical reasons we inject Mash directly into the top level class namespace
22
+ Mash = ChefUtils::Mash unless defined?(Mash)