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/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 <<
|
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)
|