facter 4.2.3 → 4.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/facter/config.rb +1 -0
- data/lib/facter/custom_facts/core/execution/base.rb +16 -9
- data/lib/facter/custom_facts/core/execution.rb +25 -17
- data/lib/facter/custom_facts/util/fact.rb +1 -1
- data/lib/facter/custom_facts/util/loader.rb +2 -2
- data/lib/facter/custom_facts/util/resolution.rb +1 -1
- data/lib/facter/facts/linux/disks.rb +1 -1
- data/lib/facter/facts/linux/hypervisors/kvm.rb +3 -1
- data/lib/facter/facts/windows/os/windows/display_version.rb +20 -0
- data/lib/facter/facts/windows/timezone.rb +1 -1
- data/lib/facter/framework/cli/cli.rb +4 -0
- data/lib/facter/framework/core/cache_manager.rb +17 -1
- data/lib/facter/framework/core/fact_manager.rb +3 -1
- data/lib/facter/framework/core/options/option_store.rb +3 -1
- data/lib/facter/framework/core/options.rb +16 -1
- data/lib/facter/framework/detector/os_detector.rb +2 -3
- data/lib/facter/models/resolved_fact.rb +4 -0
- data/lib/facter/resolvers/aix/disks.rb +1 -1
- data/lib/facter/resolvers/aix/mountpoints.rb +14 -8
- data/lib/facter/resolvers/aix/partitions.rb +1 -1
- data/lib/facter/resolvers/aix/processors.rb +2 -1
- data/lib/facter/resolvers/disks.rb +86 -0
- data/lib/facter/resolvers/dmi.rb +1 -0
- data/lib/facter/resolvers/ec2.rb +1 -1
- data/lib/facter/resolvers/lsb_release.rb +0 -2
- data/lib/facter/resolvers/macosx/{processor.rb → processors.rb} +21 -21
- data/lib/facter/resolvers/os_release.rb +51 -20
- data/lib/facter/resolvers/redhat_release.rb +5 -5
- data/lib/facter/resolvers/suse_release.rb +1 -1
- data/lib/facter/resolvers/windows/ffi/winnls_ffi.rb +11 -0
- data/lib/facter/resolvers/windows/product_release.rb +13 -4
- data/lib/facter/resolvers/windows/timezone.rb +41 -0
- data/lib/facter/util/aix/info_extractor.rb +60 -9
- data/lib/facter/util/facts/windows_release_finder.rb +4 -2
- data/lib/facter/util/file_helper.rb +10 -0
- data/lib/facter/util/resolvers/http.rb +3 -0
- data/lib/facter/version.rb +1 -1
- data/lib/facter.rb +21 -2
- metadata +7 -4
- data/lib/facter/resolvers/disk.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5648b99a92b05c556d728186e4df5fed506b8edf3ca2ac1e77708a2ebe9b8359
|
4
|
+
data.tar.gz: 9e58e46ab92d8d4aeffcf54a4b13b8d25ca751e08669f73c067a245cb96bdd93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 467e8ef226865d0ae6d88fca05bc8c44e4dbbc10dec1e8117947e68dac09b5046878eaf3e2a45d1dd572b9b3b76f44ff14a7c62653df83854ee38172a0e576cf
|
7
|
+
data.tar.gz: 71405bf059cbba0572136a4d67db8700542f62f668a4f50f7fe99a818f82bc5f114bb8f12baa3a86be5bd59e50337e23e34f485dd5bae522c0d0a8ee8206a928
|
data/lib/facter/config.rb
CHANGED
@@ -7,6 +7,7 @@ module Facter
|
|
7
7
|
module Execution
|
8
8
|
class Base
|
9
9
|
STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s'
|
10
|
+
VALID_OPTIONS = %i[on_fail expand logger timeout].freeze
|
10
11
|
|
11
12
|
def initialize
|
12
13
|
@log = Log.new(self)
|
@@ -42,7 +43,7 @@ module Facter
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def execute(command, options = {})
|
45
|
-
on_fail, expand, logger,
|
46
|
+
on_fail, expand, logger, timeout = extract_options(options)
|
46
47
|
|
47
48
|
expanded_command = if !expand && builtin_command?(command) || logger
|
48
49
|
command
|
@@ -59,12 +60,12 @@ module Facter
|
|
59
60
|
return on_fail
|
60
61
|
end
|
61
62
|
|
62
|
-
out, = execute_command(expanded_command, on_fail, logger,
|
63
|
+
out, = execute_command(expanded_command, on_fail, logger, timeout)
|
63
64
|
out
|
64
65
|
end
|
65
66
|
|
66
|
-
def execute_command(command, on_fail = nil, logger = nil,
|
67
|
-
|
67
|
+
def execute_command(command, on_fail = nil, logger = nil, timeout = nil)
|
68
|
+
timeout ||= 300
|
68
69
|
begin
|
69
70
|
# Set LC_ALL and LANG to force i18n to C for the duration of this exec;
|
70
71
|
# this ensures that any code that parses the
|
@@ -78,12 +79,12 @@ module Facter
|
|
78
79
|
out_reader = Thread.new { stdout.read }
|
79
80
|
err_reader = Thread.new { stderr.read }
|
80
81
|
begin
|
81
|
-
Timeout.timeout(
|
82
|
+
Timeout.timeout(timeout) do
|
82
83
|
stdout_messages << out_reader.value
|
83
84
|
stderr_messages << err_reader.value
|
84
85
|
end
|
85
86
|
rescue Timeout::Error
|
86
|
-
message = "Timeout encounter after #{
|
87
|
+
message = "Timeout encounter after #{timeout}s, killing process with pid: #{pid}"
|
87
88
|
Process.kill('KILL', pid)
|
88
89
|
on_fail == :raise ? (raise StandardError, message) : @log.debug(message)
|
89
90
|
ensure
|
@@ -114,10 +115,16 @@ module Facter
|
|
114
115
|
on_fail = options.fetch(:on_fail, :raise)
|
115
116
|
expand = options.fetch(:expand, true)
|
116
117
|
logger = options[:logger]
|
117
|
-
|
118
|
-
|
118
|
+
timeout = (options[:timeout] || options[:time_limit] || options[:limit]).to_i
|
119
|
+
timeout = timeout.positive? ? timeout : nil
|
119
120
|
|
120
|
-
|
121
|
+
extra_keys = options.keys - VALID_OPTIONS
|
122
|
+
unless extra_keys.empty?
|
123
|
+
@log.warn("Unexpected key passed to Facter::Core::Execution.execute option: #{extra_keys.join(',')}" \
|
124
|
+
" - valid keys: #{VALID_OPTIONS.join(',')}")
|
125
|
+
end
|
126
|
+
|
127
|
+
[on_fail, expand, logger, timeout]
|
121
128
|
end
|
122
129
|
|
123
130
|
def log_stderr(msg, command, logger)
|
@@ -15,9 +15,9 @@ module Facter
|
|
15
15
|
|
16
16
|
module_function
|
17
17
|
|
18
|
-
# Returns the locations to be searched when looking for a binary. This
|
19
|
-
#
|
20
|
-
#
|
18
|
+
# Returns the locations to be searched when looking for a binary. This is
|
19
|
+
# currently determined by the +PATH+ environment variable plus `/sbin`
|
20
|
+
# and `/usr/sbin` when run on unix
|
21
21
|
#
|
22
22
|
# @return [Array<String>] The paths to be searched for binaries
|
23
23
|
#
|
@@ -27,8 +27,9 @@ module Facter
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# Determines the full path to a binary. If the supplied filename does not
|
30
|
-
#
|
31
|
-
#
|
30
|
+
# already describe an absolute path then different locations (determined
|
31
|
+
# by {search_paths}) will be searched for a match.
|
32
|
+
#
|
32
33
|
# @param bin [String] The executable to locate
|
33
34
|
#
|
34
35
|
# @return [String/nil] The full path to the executable or nil if not
|
@@ -40,7 +41,8 @@ module Facter
|
|
40
41
|
end
|
41
42
|
|
42
43
|
# Determine in a platform-specific way whether a path is absolute. This
|
43
|
-
#
|
44
|
+
# defaults to the local platform if none is specified.
|
45
|
+
#
|
44
46
|
# @param path [String] The path to check
|
45
47
|
|
46
48
|
# @param platform [:posix/:windows/nil] The platform logic to use
|
@@ -58,8 +60,9 @@ module Facter
|
|
58
60
|
end
|
59
61
|
|
60
62
|
# Given a command line, this returns the command line with the
|
61
|
-
#
|
62
|
-
#
|
63
|
+
# executable written as an absolute path. If the executable contains
|
64
|
+
# spaces, it has to be put in double quotes to be properly recognized.
|
65
|
+
#
|
63
66
|
# @param command [String] the command line
|
64
67
|
#
|
65
68
|
# @return [String/nil] The command line with the executable's path
|
@@ -71,8 +74,9 @@ module Facter
|
|
71
74
|
end
|
72
75
|
|
73
76
|
# Overrides environment variables within a block of code. The
|
74
|
-
#
|
75
|
-
#
|
77
|
+
# specified values will be set for the duration of the block, after
|
78
|
+
# which the original values (if any) will be restored.
|
79
|
+
#
|
76
80
|
# @param values [Hash<String=>String>] A hash of the environment
|
77
81
|
# variables to override
|
78
82
|
#
|
@@ -84,6 +88,7 @@ module Facter
|
|
84
88
|
end
|
85
89
|
|
86
90
|
# Try to execute a command and return the output.
|
91
|
+
#
|
87
92
|
# @param command [String] Command to run
|
88
93
|
#
|
89
94
|
# @return [String/nil] Output of the program, or nil if the command does
|
@@ -96,16 +101,18 @@ module Facter
|
|
96
101
|
end
|
97
102
|
|
98
103
|
# Execute a command and return the output of that program.
|
104
|
+
#
|
99
105
|
# @param command [String] Command to run
|
100
106
|
#
|
101
107
|
# @param options [Hash] Hash with options for the command
|
102
108
|
#
|
103
|
-
#
|
109
|
+
# @option options [Object] :on_fail How to behave when the command could
|
104
110
|
# not be run. Specifying :raise will raise an error, anything else will
|
105
111
|
# return that object on failure. Default is :raise.
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
112
|
+
# @option options [Object] :logger Optional logger used to log the
|
113
|
+
# command's stderr.
|
114
|
+
# @option options :timeout Optional time out for the specified
|
115
|
+
# command. If no timeout is passed, a default of 300 seconds is used.
|
109
116
|
#
|
110
117
|
# @raise [Facter::Core::Execution::ExecutionFailure] If the command does
|
111
118
|
# not exist or could not be executed and :on_fail is set to :raise
|
@@ -119,13 +126,14 @@ module Facter
|
|
119
126
|
end
|
120
127
|
|
121
128
|
# Execute a command and return the stdout and stderr of that program.
|
129
|
+
#
|
122
130
|
# @param command [String] Command to run
|
123
131
|
#
|
124
132
|
# @param on_fail[Object] How to behave when the command could
|
125
133
|
# not be run. Specifying :raise will raise an error, anything else will
|
126
134
|
# return that object on failure. Default is :raise.
|
127
135
|
# @param logger Optional logger used to log the command's stderr.
|
128
|
-
# @param
|
136
|
+
# @param timeout Optional time out for the specified command. If no timeout is passed,
|
129
137
|
# a default of 300 seconds is used.
|
130
138
|
#
|
131
139
|
# @raise [Facter::Core::Execution::ExecutionFailure] If the command does
|
@@ -135,8 +143,8 @@ module Facter
|
|
135
143
|
# :on_fail if command execution failed and :on_fail was specified.
|
136
144
|
#
|
137
145
|
# @api private
|
138
|
-
def execute_command(command, on_fail = nil, logger = nil,
|
139
|
-
@@impl.execute_command(command, on_fail, logger,
|
146
|
+
def execute_command(command, on_fail = nil, logger = nil, timeout = nil)
|
147
|
+
@@impl.execute_command(command, on_fail, logger, timeout)
|
140
148
|
end
|
141
149
|
|
142
150
|
class ExecutionFailure < StandardError; end
|
@@ -141,13 +141,13 @@ module LegacyFacter
|
|
141
141
|
# Skip anything that doesn't match our regex.
|
142
142
|
next unless name =~ /^facter_?(\w+)$/i
|
143
143
|
|
144
|
-
env_name = Regexp.last_match(1)
|
144
|
+
env_name = Regexp.last_match(1).downcase
|
145
145
|
|
146
146
|
# If a fact name was specified, skip anything that doesn't
|
147
147
|
# match it.
|
148
148
|
next if fact && (env_name != fact)
|
149
149
|
|
150
|
-
LegacyFacter.add(
|
150
|
+
LegacyFacter.add(env_name, fact_type: :external, is_env: true) do
|
151
151
|
has_weight 1_000_000
|
152
152
|
setcode { value }
|
153
153
|
end
|
@@ -35,13 +35,15 @@ module Facts
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def kvm?
|
38
|
+
product_name = discover_hypervisor
|
38
39
|
bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor)
|
39
40
|
@log.debug("Detected bios vendor: #{bios_vendor}")
|
40
41
|
|
41
42
|
Facter::Resolvers::VirtWhat.resolve(:vm) == 'kvm' ||
|
42
43
|
Facter::Resolvers::Lspci.resolve(:vm) == 'kvm' ||
|
43
44
|
bios_vendor&.include?('Amazon EC2') ||
|
44
|
-
bios_vendor&.include?('Google')
|
45
|
+
bios_vendor&.include?('Google') ||
|
46
|
+
product_name&.include?('OpenStack')
|
45
47
|
end
|
46
48
|
|
47
49
|
def discover_provider
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facts
|
4
|
+
module Windows
|
5
|
+
module Os
|
6
|
+
module Windows
|
7
|
+
class DisplayVersion
|
8
|
+
FACT_NAME = 'os.windows.display_version'
|
9
|
+
ALIASES = 'windows_display_version'
|
10
|
+
|
11
|
+
def call_the_resolver
|
12
|
+
fact_value = Facter::Resolvers::ProductRelease.resolve(:display_version)
|
13
|
+
|
14
|
+
[Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -97,6 +97,10 @@ module Facter
|
|
97
97
|
type: :boolean,
|
98
98
|
desc: 'Resolve facts sequentially'
|
99
99
|
|
100
|
+
class_option :http_debug,
|
101
|
+
type: :boolean,
|
102
|
+
desc: 'Whether to write HTTP request and responses to stderr. This should never be used in production.'
|
103
|
+
|
100
104
|
class_option :puppet,
|
101
105
|
type: :boolean,
|
102
106
|
aliases: '-p',
|
@@ -167,7 +167,8 @@ cache_format_version is incorrect!")
|
|
167
167
|
next unless check_ttls?(group_name, @fact_groups.get_group_ttls(group_name))
|
168
168
|
|
169
169
|
cache_file_name = File.join(@cache_dir, group_name)
|
170
|
-
|
170
|
+
|
171
|
+
next if facts_already_cached?(cache_file_name, data)
|
171
172
|
|
172
173
|
@log.debug("caching values for #{group_name} facts")
|
173
174
|
|
@@ -176,6 +177,21 @@ cache_format_version is incorrect!")
|
|
176
177
|
end
|
177
178
|
end
|
178
179
|
|
180
|
+
def facts_already_cached?(cache_file_name, data)
|
181
|
+
if File.readable?(cache_file_name)
|
182
|
+
file = Facter::Util::FileHelper.safe_read(cache_file_name)
|
183
|
+
begin
|
184
|
+
cached_data = JSON.parse(file) unless file.nil?
|
185
|
+
return true if (data.keys - cached_data.keys).empty?
|
186
|
+
rescue JSON::ParserError => e
|
187
|
+
@log.debug("Failed to read cache file #{cache_file_name}. Detail: #{e.message}")
|
188
|
+
rescue NoMethodError => e
|
189
|
+
@log.debug("No keys found in #{cache_file_name}. Detail: #{e.message}")
|
190
|
+
end
|
191
|
+
end
|
192
|
+
false
|
193
|
+
end
|
194
|
+
|
179
195
|
def read_group_json(group_name)
|
180
196
|
return @groups[group_name] if @groups.key?(group_name)
|
181
197
|
|
@@ -51,7 +51,9 @@ module Facter
|
|
51
51
|
core_and_external_facts = core_or_external_fact(user_query) || []
|
52
52
|
resolved_facts = core_and_external_facts + custom_facts
|
53
53
|
|
54
|
-
resolved_facts
|
54
|
+
if resolved_facts.empty? || resolved_facts.none? { |rf| rf.resolves?(user_query) }
|
55
|
+
resolved_facts.concat(all_custom_facts(user_query))
|
56
|
+
end
|
55
57
|
|
56
58
|
@cache_manager.cache_facts(resolved_facts)
|
57
59
|
|
@@ -36,6 +36,7 @@ module Facter
|
|
36
36
|
@hocon = false
|
37
37
|
@allow_external_loggers = true
|
38
38
|
@force_dot_resolution = false
|
39
|
+
@http_debug = false
|
39
40
|
|
40
41
|
class << self
|
41
42
|
attr_reader :debug, :verbose, :log_level, :show_legacy,
|
@@ -44,7 +45,7 @@ module Facter
|
|
44
45
|
attr_accessor :config, :strict, :json,
|
45
46
|
:cache, :yaml, :puppet, :ttls, :block, :cli, :config_file_custom_dir,
|
46
47
|
:config_file_external_dir, :default_external_dir, :fact_groups, :force_dot_resolution,
|
47
|
-
:block_list, :color, :trace, :sequential, :timing, :hocon, :allow_external_loggers
|
48
|
+
:block_list, :color, :trace, :sequential, :timing, :hocon, :allow_external_loggers, :http_debug
|
48
49
|
|
49
50
|
attr_writer :external_dir
|
50
51
|
|
@@ -179,6 +180,7 @@ module Facter
|
|
179
180
|
@ttls = []
|
180
181
|
@block = true
|
181
182
|
@cli = nil
|
183
|
+
@http_debug = false
|
182
184
|
reset_config
|
183
185
|
end
|
184
186
|
|
@@ -55,10 +55,25 @@ module Facter
|
|
55
55
|
|
56
56
|
def store(options)
|
57
57
|
options.each do |key, value|
|
58
|
-
value =
|
58
|
+
value = munge_option(key, value)
|
59
59
|
OptionStore.set(key, value)
|
60
60
|
end
|
61
61
|
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def munge_option(key, value)
|
66
|
+
return value unless key.to_sym == :log_level
|
67
|
+
|
68
|
+
case value.to_sym
|
69
|
+
when :log_level
|
70
|
+
''
|
71
|
+
when :none
|
72
|
+
'unknown'
|
73
|
+
else
|
74
|
+
value
|
75
|
+
end
|
76
|
+
end
|
62
77
|
end
|
63
78
|
end
|
64
79
|
end
|
@@ -5,7 +5,7 @@ require 'rbconfig'
|
|
5
5
|
class OsDetector
|
6
6
|
include Singleton
|
7
7
|
|
8
|
-
attr_reader :identifier, :
|
8
|
+
attr_reader :identifier, :hierarchy
|
9
9
|
|
10
10
|
def initialize(*_args)
|
11
11
|
@log = Facter::Log.new(self)
|
@@ -75,8 +75,7 @@ class OsDetector
|
|
75
75
|
[Facter::Resolvers::OsRelease,
|
76
76
|
Facter::Resolvers::RedHatRelease,
|
77
77
|
Facter::Resolvers::SuseRelease].each do |resolver|
|
78
|
-
@identifier = resolver.resolve(:
|
79
|
-
@version = resolver.resolve(:version)
|
78
|
+
@identifier = resolver.resolve(:id)
|
80
79
|
break if @identifier
|
81
80
|
end
|
82
81
|
|
@@ -34,7 +34,7 @@ module Facter
|
|
34
34
|
|
35
35
|
return if stdout.empty?
|
36
36
|
|
37
|
-
info_size = Facter::Util::Aix::InfoExtractor.extract(stdout,
|
37
|
+
info_size = Facter::Util::Aix::InfoExtractor.extract(stdout, :lspv)
|
38
38
|
|
39
39
|
return unless info_size['PV STATE']
|
40
40
|
|
@@ -18,23 +18,29 @@ module Facter
|
|
18
18
|
def read_mount(fact_name)
|
19
19
|
@fact_list[:mountpoints] = {}
|
20
20
|
output = Facter::Core::Execution.execute('mount', logger: log)
|
21
|
-
output.split("\n").map do |line|
|
22
|
-
next if line =~ /
|
21
|
+
output.split("\n").drop(2).map do |line|
|
22
|
+
next if line =~ /procfs|ahafs/
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
@fact_list[:mountpoints][elem[1]] = { device: elem[0], filesystem: elem[2],
|
27
|
-
options: elem.last.split(',') }
|
24
|
+
add_mount_points_fact(line)
|
28
25
|
end
|
29
26
|
|
30
27
|
retrieve_sizes_for_mounts
|
31
28
|
@fact_list[fact_name]
|
32
29
|
end
|
33
30
|
|
31
|
+
def add_mount_points_fact(line)
|
32
|
+
elem = line.split("\s")
|
33
|
+
|
34
|
+
elem.shift unless line[0] == ' '
|
35
|
+
|
36
|
+
@fact_list[:mountpoints][elem[1]] = { device: elem[0], filesystem: elem[2],
|
37
|
+
options: elem.last.include?(':') ? [] : elem.last.split(',') }
|
38
|
+
end
|
39
|
+
|
34
40
|
def retrieve_sizes_for_mounts
|
35
41
|
output = Facter::Core::Execution.execute('df -P', logger: log)
|
36
|
-
output.split("\n").map do |line|
|
37
|
-
next if line =~
|
42
|
+
output.split("\n").drop(1).map do |line|
|
43
|
+
next if line =~ /-\s+-\s+-/
|
38
44
|
|
39
45
|
mount_info = line.split("\s")
|
40
46
|
mount_info[3] = translate_to_bytes(mount_info[3])
|
@@ -40,7 +40,7 @@ module Facter
|
|
40
40
|
|
41
41
|
return if stdout.empty?
|
42
42
|
|
43
|
-
info_hash = Facter::Util::Aix::InfoExtractor.extract(stdout,
|
43
|
+
info_hash = Facter::Util::Aix::InfoExtractor.extract(stdout, :lslv)
|
44
44
|
size_bytes = compute_size(info_hash)
|
45
45
|
|
46
46
|
part_info = {
|
@@ -42,8 +42,9 @@ module Facter
|
|
42
42
|
return unless result
|
43
43
|
|
44
44
|
names = retrieve_from_array(result.scan(/name\s=\s.*/), 1)
|
45
|
+
status = retrieve_from_array(result.scan(/\s+status\s=\s.*/), 1)
|
45
46
|
|
46
|
-
names.
|
47
|
+
names.each_with_index { |elem, idx| query_cuat(elem) if status[idx] == '1' }
|
47
48
|
end
|
48
49
|
|
49
50
|
def query_cuat(name)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Resolvers
|
5
|
+
module Linux
|
6
|
+
class Disks < BaseResolver
|
7
|
+
@log = Facter::Log.new(self)
|
8
|
+
|
9
|
+
init_resolver
|
10
|
+
|
11
|
+
DIR = '/sys/block'
|
12
|
+
FILE_PATHS = { model: 'device/model',
|
13
|
+
size: 'size',
|
14
|
+
vendor: 'device/vendor',
|
15
|
+
type: 'queue/rotational',
|
16
|
+
serial: 'false',
|
17
|
+
wwn: 'false' }.freeze
|
18
|
+
|
19
|
+
class << self
|
20
|
+
private
|
21
|
+
|
22
|
+
def post_resolve(fact_name, _options)
|
23
|
+
@fact_list.fetch(fact_name) do
|
24
|
+
return unless @fact_list.empty?
|
25
|
+
|
26
|
+
build_disks_hash
|
27
|
+
|
28
|
+
read_facts
|
29
|
+
|
30
|
+
@fact_list[:disks] = nil if @fact_list[:disks].empty?
|
31
|
+
@fact_list[fact_name]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def lsblk(option, disk)
|
36
|
+
result = Facter::Core::Execution.execute(
|
37
|
+
"/usr/bin/lsblk -dn -o #{option} /dev/#{disk}", on_fail: '', timeout: 1
|
38
|
+
).strip
|
39
|
+
result.empty? ? nil : result
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_facts
|
43
|
+
FILE_PATHS.each do |key, file|
|
44
|
+
@fact_list[:disks].each do |disk, value|
|
45
|
+
file_path = File.join(DIR, disk, file)
|
46
|
+
|
47
|
+
result = if file == 'false'
|
48
|
+
lsblk(key, disk)
|
49
|
+
else
|
50
|
+
Facter::Util::FileHelper.safe_read(file_path, nil)&.strip
|
51
|
+
end
|
52
|
+
|
53
|
+
next unless result
|
54
|
+
|
55
|
+
value[key] = case key
|
56
|
+
when :size
|
57
|
+
# Linux always considers sectors to be 512 bytes long
|
58
|
+
# independently of the devices real block size.
|
59
|
+
construct_size(value, result)
|
60
|
+
when :type
|
61
|
+
result == '0' ? 'ssd' : 'hdd'
|
62
|
+
else
|
63
|
+
result
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def build_disks_hash
|
70
|
+
valid_disks = Facter::Util::FileHelper.dir_children(DIR)
|
71
|
+
.select { |disk| File.readable?(File.join(DIR, disk, 'device')) }
|
72
|
+
|
73
|
+
@fact_list[:disks] = {}
|
74
|
+
valid_disks.each { |disk| @fact_list[:disks][disk] = {} }
|
75
|
+
end
|
76
|
+
|
77
|
+
def construct_size(facts, value)
|
78
|
+
value = value.to_i * 512
|
79
|
+
facts[:size_bytes] = value
|
80
|
+
facts[:size] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(value)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/facter/resolvers/dmi.rb
CHANGED
@@ -36,6 +36,7 @@ module Facter
|
|
36
36
|
return unless File.directory?('/sys/class/dmi')
|
37
37
|
|
38
38
|
file_content = Facter::Util::FileHelper.safe_read("/sys/class/dmi/id/#{fact_name}", nil)
|
39
|
+
.encode('UTF-8', invalid: :replace)
|
39
40
|
if files.include?(fact_name.to_s) && file_content
|
40
41
|
file_content = file_content.strip
|
41
42
|
@fact_list[fact_name] = file_content unless file_content.empty?
|
data/lib/facter/resolvers/ec2.rb
CHANGED
@@ -20,7 +20,7 @@ module Facter
|
|
20
20
|
def read_facts(fact_name)
|
21
21
|
@fact_list[:metadata] = {}
|
22
22
|
query_for_metadata(EC2_METADATA_ROOT_URL, @fact_list[:metadata])
|
23
|
-
@fact_list[:userdata] = get_data_from(EC2_USERDATA_ROOT_URL).strip
|
23
|
+
@fact_list[:userdata] = get_data_from(EC2_USERDATA_ROOT_URL).strip.force_encoding('UTF-8')
|
24
24
|
@fact_list[fact_name]
|
25
25
|
end
|
26
26
|
|
@@ -29,42 +29,42 @@ module Facter
|
|
29
29
|
|
30
30
|
def read_processor_data(fact_name)
|
31
31
|
output = Facter::Core::Execution.execute("sysctl #{ITEMS.values.join(' ')}", logger: log)
|
32
|
-
|
32
|
+
processors_hash = Hash[*output.split("\n").collect { |v| [v.split(': ')[0], v.split(': ')[1]] }.flatten]
|
33
|
+
build_fact_list(processors_hash)
|
33
34
|
@fact_list[fact_name]
|
34
35
|
end
|
35
36
|
|
36
|
-
def build_fact_list(
|
37
|
-
build_logical_count(
|
38
|
-
build_physical_count(
|
39
|
-
build_models(
|
40
|
-
build_speed(
|
41
|
-
build_cores_per_socket(
|
42
|
-
build_threads_per_core(
|
37
|
+
def build_fact_list(hash)
|
38
|
+
build_logical_count(hash)
|
39
|
+
build_physical_count(hash)
|
40
|
+
build_models(hash)
|
41
|
+
build_speed(hash)
|
42
|
+
build_cores_per_socket(hash)
|
43
|
+
build_threads_per_core(hash)
|
43
44
|
end
|
44
45
|
|
45
|
-
def build_logical_count(
|
46
|
-
@fact_list[:logicalcount] =
|
46
|
+
def build_logical_count(hash)
|
47
|
+
@fact_list[:logicalcount] = hash[ITEMS[:logical_count]].to_i
|
47
48
|
end
|
48
49
|
|
49
|
-
def build_physical_count(
|
50
|
-
@fact_list[:physicalcount] =
|
50
|
+
def build_physical_count(hash)
|
51
|
+
@fact_list[:physicalcount] = hash[ITEMS[:physical_count]].to_i
|
51
52
|
end
|
52
53
|
|
53
|
-
def build_models(
|
54
|
-
|
55
|
-
@fact_list[:models] = Array.new(@fact_list[:logicalcount].to_i, brand)
|
54
|
+
def build_models(hash)
|
55
|
+
@fact_list[:models] = Array.new(@fact_list[:logicalcount].to_i, hash[ITEMS[:brand]])
|
56
56
|
end
|
57
57
|
|
58
|
-
def build_speed(
|
59
|
-
@fact_list[:speed] =
|
58
|
+
def build_speed(hash)
|
59
|
+
@fact_list[:speed] = hash[ITEMS[:speed]].to_i
|
60
60
|
end
|
61
61
|
|
62
|
-
def build_cores_per_socket(
|
63
|
-
@fact_list[:cores_per_socket] =
|
62
|
+
def build_cores_per_socket(hash)
|
63
|
+
@fact_list[:cores_per_socket] = hash[ITEMS[:cores_per_socket]].to_i
|
64
64
|
end
|
65
65
|
|
66
|
-
def build_threads_per_core(
|
67
|
-
@fact_list[:threads_per_core] =
|
66
|
+
def build_threads_per_core(hash)
|
67
|
+
@fact_list[:threads_per_core] = hash[ITEMS[:threads_per_core]].to_i / hash[ITEMS[:cores_per_socket]].to_i
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
@@ -20,53 +20,84 @@ module Facter
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def post_resolve(fact_name, _options)
|
23
|
-
@fact_list.fetch(fact_name)
|
23
|
+
@fact_list.fetch(fact_name) do
|
24
|
+
# If we get here multiple times per run it's probably because
|
25
|
+
# someone's asking for a os-release value not present in the file
|
26
|
+
# (e.g. VERSION is not a thing on rolling distributions, so this
|
27
|
+
# code will always run if the resolver is being asked for :version,
|
28
|
+
# because it'll never get cached).
|
29
|
+
#
|
30
|
+
# Just return early to avoid reparsing the file.
|
31
|
+
return unless @fact_list.empty?
|
32
|
+
|
33
|
+
pairs = read_and_parse_os_release_file
|
34
|
+
return unless pairs
|
35
|
+
|
36
|
+
fill_fact_list(pairs)
|
37
|
+
|
38
|
+
process_name
|
39
|
+
process_version_id
|
40
|
+
process_id
|
41
|
+
|
42
|
+
@fact_list[fact_name]
|
43
|
+
end
|
24
44
|
end
|
25
45
|
|
26
|
-
def
|
27
|
-
|
28
|
-
return
|
46
|
+
def read_and_parse_os_release_file
|
47
|
+
content = Facter::Util::FileHelper.safe_readlines('/etc/os-release')
|
48
|
+
return nil if content.empty?
|
29
49
|
|
30
50
|
pairs = []
|
31
|
-
|
32
|
-
output.each do |line|
|
51
|
+
content.each do |line|
|
33
52
|
pairs << line.strip.delete('"').split('=', 2)
|
34
53
|
end
|
35
54
|
|
36
|
-
|
37
|
-
process_name
|
38
|
-
pad_version_id
|
39
|
-
normalize_opensuse_identifier
|
40
|
-
|
41
|
-
@fact_list[fact_name]
|
55
|
+
pairs
|
42
56
|
end
|
43
57
|
|
44
58
|
def fill_fact_list(pairs)
|
45
59
|
result = Hash[*pairs.flatten]
|
46
60
|
result.each { |k, v| @fact_list[k.downcase.to_sym] = v }
|
47
|
-
|
48
|
-
@fact_list[:identifier] = @fact_list[:id]
|
49
61
|
end
|
50
62
|
|
51
|
-
def
|
63
|
+
def process_version_id
|
64
|
+
return unless @fact_list[:version_id]
|
65
|
+
|
52
66
|
@fact_list[:version_id] = "#{@fact_list[:version_id]}.0" unless @fact_list[:version_id] =~ /\./
|
53
67
|
end
|
54
68
|
|
69
|
+
def process_id
|
70
|
+
return unless @fact_list[:id]
|
71
|
+
|
72
|
+
@fact_list[:id] = 'opensuse' if @fact_list[:id] =~ /opensuse/i
|
73
|
+
end
|
74
|
+
|
55
75
|
def process_name
|
56
|
-
|
57
|
-
|
76
|
+
return unless @fact_list[:name]
|
77
|
+
|
78
|
+
join_os_name
|
79
|
+
capitalize_os_name
|
80
|
+
append_linux_to_os_name
|
81
|
+
end
|
58
82
|
|
83
|
+
def join_os_name
|
84
|
+
os_name = @fact_list[:name]
|
59
85
|
@fact_list[:name] = if os_name.downcase.start_with?('red', 'oracle', 'arch', 'manjaro')
|
60
86
|
os_name = os_name.split(' ')[0..1].join
|
61
|
-
os_name = os_name.capitalize if os_name.downcase.start_with?('arch', 'manjaro')
|
62
87
|
os_name
|
63
88
|
else
|
64
89
|
os_name.split(' ')[0].strip
|
65
90
|
end
|
66
91
|
end
|
67
92
|
|
68
|
-
def
|
69
|
-
|
93
|
+
def capitalize_os_name
|
94
|
+
os_name = @fact_list[:name]
|
95
|
+
@fact_list[:name] = os_name.capitalize if os_name.downcase.start_with?('arch', 'manjaro')
|
96
|
+
end
|
97
|
+
|
98
|
+
def append_linux_to_os_name
|
99
|
+
os_name = @fact_list[:name]
|
100
|
+
@fact_list[:name] = os_name + 'Linux' if os_name.downcase.start_with?('virtuozzo')
|
70
101
|
end
|
71
102
|
end
|
72
103
|
end
|
@@ -36,18 +36,18 @@ module Facter
|
|
36
36
|
@fact_list[:distributor_id] = distributor_id(output_strings[0])
|
37
37
|
@fact_list[:name] = release_name(output_strings[0])
|
38
38
|
@fact_list[:version] = version(output_strings)
|
39
|
-
@fact_list[:
|
39
|
+
@fact_list[:id] = id(@fact_list[:name])
|
40
40
|
end
|
41
41
|
|
42
42
|
def release_name(value)
|
43
43
|
value.split.reject { |el| el.casecmp('linux').zero? }[0..1].join
|
44
44
|
end
|
45
45
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
46
|
+
def id(value)
|
47
|
+
id = value.downcase
|
48
|
+
id = 'rhel' if @fact_list[:name].casecmp('Red Hat Enterprise Linux')
|
49
49
|
|
50
|
-
|
50
|
+
id
|
51
51
|
end
|
52
52
|
|
53
53
|
def codename(value)
|
@@ -24,10 +24,19 @@ module Facter
|
|
24
24
|
|
25
25
|
def build_fact_list(reg)
|
26
26
|
reg.each do |name, _value|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
case name
|
28
|
+
when 'EditionID'
|
29
|
+
@fact_list[:edition_id] = reg[name]
|
30
|
+
when 'InstallationType'
|
31
|
+
@fact_list[:installation_type] = reg[name]
|
32
|
+
when 'ProductName'
|
33
|
+
@fact_list[:product_name] = reg[name]
|
34
|
+
when 'DisplayVersion'
|
35
|
+
@fact_list[:release_id] = reg[name]
|
36
|
+
@fact_list[:display_version] = reg[name]
|
37
|
+
when 'ReleaseId'
|
38
|
+
@fact_list[:release_id] = reg[name] unless @fact_list[:release_id]
|
39
|
+
end
|
31
40
|
end
|
32
41
|
end
|
33
42
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Facter
|
4
|
+
module Resolvers
|
5
|
+
module Windows
|
6
|
+
class Timezone < BaseResolver
|
7
|
+
init_resolver
|
8
|
+
|
9
|
+
class << self
|
10
|
+
private
|
11
|
+
|
12
|
+
def post_resolve(fact_name, _options)
|
13
|
+
@fact_list.fetch(fact_name) { determine_timezone }
|
14
|
+
end
|
15
|
+
|
16
|
+
def determine_timezone
|
17
|
+
timezone = Time.now.zone
|
18
|
+
@fact_list[:timezone] = timezone.force_encoding("CP#{codepage}").encode('UTF-8', invalid: :replace)
|
19
|
+
rescue ArgumentError
|
20
|
+
@fact_list[:timezone] = timezone
|
21
|
+
end
|
22
|
+
|
23
|
+
def codepage
|
24
|
+
result = codepage_from_api
|
25
|
+
result.empty? ? codepage_from_registry : result
|
26
|
+
end
|
27
|
+
|
28
|
+
def codepage_from_registry
|
29
|
+
require 'win32/registry'
|
30
|
+
::Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Nls\CodePage')['ACP']
|
31
|
+
end
|
32
|
+
|
33
|
+
def codepage_from_api
|
34
|
+
require 'facter/resolvers/windows/ffi/winnls_ffi'
|
35
|
+
WinnlsFFI.GetACP.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -6,17 +6,68 @@ module Facter
|
|
6
6
|
module InfoExtractor
|
7
7
|
MEGABYTES_EXPONENT = 1024**2
|
8
8
|
GIGABYTES_EXPONENT = 1024**3
|
9
|
+
PROPERTIES = {
|
10
|
+
lslv: [
|
11
|
+
'LOGICAL VOLUME:',
|
12
|
+
'VOLUME GROUP:',
|
13
|
+
'LV IDENTIFIER:',
|
14
|
+
'PERMISSION:',
|
15
|
+
'VG STATE:',
|
16
|
+
'LV STATE:',
|
17
|
+
'TYPE:',
|
18
|
+
'WRITE VERIFY:',
|
19
|
+
'MAX LPs:',
|
20
|
+
'PP SIZE:',
|
21
|
+
'COPIES:',
|
22
|
+
'SCHED POLICY:',
|
23
|
+
'LPs:',
|
24
|
+
'PPs:',
|
25
|
+
'STALE PPs:',
|
26
|
+
'BB POLICY:',
|
27
|
+
'INTER-POLICY:',
|
28
|
+
'RELOCATABLE:',
|
29
|
+
'INTRA-POLICY:',
|
30
|
+
'UPPER BOUND:',
|
31
|
+
'MOUNT POINT:',
|
32
|
+
'LABEL:',
|
33
|
+
'MIRROR WRITE CONSISTENCY:',
|
34
|
+
'EACH LP COPY ON A SEPARATE PV ?:',
|
35
|
+
'Serialize IO ?:'
|
36
|
+
],
|
37
|
+
lspv: [
|
38
|
+
'PHYSICAL VOLUME:',
|
39
|
+
'VOLUME GROUP:',
|
40
|
+
'PV IDENTIFIER:',
|
41
|
+
'VG IDENTIFIER',
|
42
|
+
'PV STATE:',
|
43
|
+
'STALE PARTITIONS:',
|
44
|
+
'ALLOCATABLE:',
|
45
|
+
'PP SIZE:',
|
46
|
+
'LOGICAL VOLUMES:',
|
47
|
+
'TOTAL PPs:',
|
48
|
+
'VG DESCRIPTORS:',
|
49
|
+
'FREE PPs:',
|
50
|
+
'HOT SPARE:',
|
51
|
+
'USED PPs:',
|
52
|
+
'MAX REQUEST:',
|
53
|
+
'FREE DISTRIBUTION:',
|
54
|
+
'USED DISTRIBUTION:',
|
55
|
+
'MIRROR POOL:'
|
56
|
+
]
|
57
|
+
}.freeze
|
9
58
|
|
10
|
-
def self.extract(content,
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
59
|
+
def self.extract(content, cmd)
|
60
|
+
property_hash = {}
|
61
|
+
properties = PROPERTIES[cmd]
|
62
|
+
properties.each do |property|
|
63
|
+
str = (properties - [property]).join('|')
|
64
|
+
matcher = content.match(/#{Regexp.escape(property)}([^\n]*?)(#{str}|\n|$)/s)
|
65
|
+
if matcher
|
66
|
+
value = matcher[1].strip
|
67
|
+
property_hash[property.split(':').first] = value
|
68
|
+
end
|
15
69
|
end
|
16
|
-
|
17
|
-
content.flatten!.reject!(&:nil?)
|
18
|
-
|
19
|
-
Hash[*content]
|
70
|
+
property_hash
|
20
71
|
end
|
21
72
|
end
|
22
73
|
end
|
@@ -23,9 +23,11 @@ module Facter
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def check_version_10(consumerrel, kernel_version)
|
26
|
+
return '10' if consumerrel
|
27
|
+
|
26
28
|
build_number = kernel_version[/([^.]*)$/].to_i
|
27
|
-
if
|
28
|
-
'
|
29
|
+
if build_number >= 20_348
|
30
|
+
'2022'
|
29
31
|
elsif build_number >= 17_623
|
30
32
|
'2019'
|
31
33
|
else
|
@@ -22,6 +22,16 @@ module Facter
|
|
22
22
|
default_return
|
23
23
|
end
|
24
24
|
|
25
|
+
def dir_children(path)
|
26
|
+
children = if RUBY_VERSION.to_f < 2.5
|
27
|
+
Dir.entries(path).reject { |dir| ['.', '..'].include?(dir) }
|
28
|
+
else
|
29
|
+
Dir.children(path)
|
30
|
+
end
|
31
|
+
|
32
|
+
children
|
33
|
+
end
|
34
|
+
|
25
35
|
private
|
26
36
|
|
27
37
|
def log_failed_to_read(path)
|
@@ -60,6 +60,9 @@ module Facter
|
|
60
60
|
http = Net::HTTP.new(parsed_url.host)
|
61
61
|
http.read_timeout = timeouts[:session] || SESSION_TIMEOUT
|
62
62
|
http.open_timeout = timeouts[:connection] || CONNECTION_TIMEOUT
|
63
|
+
|
64
|
+
http.set_debug_output($stderr) if Options[:http_debug]
|
65
|
+
|
63
66
|
http
|
64
67
|
end
|
65
68
|
|
data/lib/facter/version.rb
CHANGED
data/lib/facter.rb
CHANGED
@@ -205,6 +205,25 @@ module Facter
|
|
205
205
|
Facter::Options[:debug] = debug_bool
|
206
206
|
end
|
207
207
|
|
208
|
+
# Check whether http debugging is enabled
|
209
|
+
#
|
210
|
+
# @return [bool]
|
211
|
+
#
|
212
|
+
# @api public
|
213
|
+
def http_debug?
|
214
|
+
Options[:http_debug]
|
215
|
+
end
|
216
|
+
|
217
|
+
# Enable or disable http debugging
|
218
|
+
# @param debug_bool [bool] State which http debugging should have
|
219
|
+
#
|
220
|
+
# @return [type] [description]
|
221
|
+
#
|
222
|
+
# @api public
|
223
|
+
def http_debug(http_debug_bool)
|
224
|
+
Facter::Options[:http_debug] = http_debug_bool
|
225
|
+
end
|
226
|
+
|
208
227
|
# Enable sequential resolving of facts
|
209
228
|
#
|
210
229
|
# @return [bool]
|
@@ -390,7 +409,7 @@ module Facter
|
|
390
409
|
#
|
391
410
|
# @api public
|
392
411
|
def value(user_query)
|
393
|
-
user_query = user_query.to_s
|
412
|
+
user_query = user_query.to_s.downcase
|
394
413
|
resolve_fact(user_query)
|
395
414
|
|
396
415
|
@already_searched[user_query]&.value
|
@@ -407,7 +426,7 @@ module Facter
|
|
407
426
|
#
|
408
427
|
# @api public
|
409
428
|
def fact(user_query)
|
410
|
-
user_query = user_query.to_s
|
429
|
+
user_query = user_query.to_s.downcase
|
411
430
|
resolve_fact(user_query)
|
412
431
|
|
413
432
|
@already_searched[user_query]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -846,6 +846,7 @@ files:
|
|
846
846
|
- lib/facter/facts/windows/os/hardware.rb
|
847
847
|
- lib/facter/facts/windows/os/name.rb
|
848
848
|
- lib/facter/facts/windows/os/release.rb
|
849
|
+
- lib/facter/facts/windows/os/windows/display_version.rb
|
849
850
|
- lib/facter/facts/windows/os/windows/edition_id.rb
|
850
851
|
- lib/facter/facts/windows/os/windows/installation_type.rb
|
851
852
|
- lib/facter/facts/windows/os/windows/product_name.rb
|
@@ -933,7 +934,7 @@ files:
|
|
933
934
|
- lib/facter/resolvers/bsd/processors.rb
|
934
935
|
- lib/facter/resolvers/containers.rb
|
935
936
|
- lib/facter/resolvers/debian_version.rb
|
936
|
-
- lib/facter/resolvers/
|
937
|
+
- lib/facter/resolvers/disks.rb
|
937
938
|
- lib/facter/resolvers/dmi.rb
|
938
939
|
- lib/facter/resolvers/dmi_decode.rb
|
939
940
|
- lib/facter/resolvers/ec2.rb
|
@@ -964,7 +965,7 @@ files:
|
|
964
965
|
- lib/facter/resolvers/macosx/filesystems.rb
|
965
966
|
- lib/facter/resolvers/macosx/load_averages.rb
|
966
967
|
- lib/facter/resolvers/macosx/mountpoints.rb
|
967
|
-
- lib/facter/resolvers/macosx/
|
968
|
+
- lib/facter/resolvers/macosx/processors.rb
|
968
969
|
- lib/facter/resolvers/macosx/swap_memory.rb
|
969
970
|
- lib/facter/resolvers/macosx/system_memory.rb
|
970
971
|
- lib/facter/resolvers/macosx/system_profiler.rb
|
@@ -1021,6 +1022,7 @@ files:
|
|
1021
1022
|
- lib/facter/resolvers/windows/ffi/performance_information.rb
|
1022
1023
|
- lib/facter/resolvers/windows/ffi/system32_ffi.rb
|
1023
1024
|
- lib/facter/resolvers/windows/ffi/system_info.rb
|
1025
|
+
- lib/facter/resolvers/windows/ffi/winnls_ffi.rb
|
1024
1026
|
- lib/facter/resolvers/windows/fips.rb
|
1025
1027
|
- lib/facter/resolvers/windows/hardware_architecture.rb
|
1026
1028
|
- lib/facter/resolvers/windows/identity.rb
|
@@ -1032,6 +1034,7 @@ files:
|
|
1032
1034
|
- lib/facter/resolvers/windows/product_release.rb
|
1033
1035
|
- lib/facter/resolvers/windows/ssh.rb
|
1034
1036
|
- lib/facter/resolvers/windows/system32.rb
|
1037
|
+
- lib/facter/resolvers/windows/timezone.rb
|
1035
1038
|
- lib/facter/resolvers/windows/uptime.rb
|
1036
1039
|
- lib/facter/resolvers/windows/virtualization.rb
|
1037
1040
|
- lib/facter/resolvers/windows/win_os_description.rb
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Facter
|
4
|
-
module Resolvers
|
5
|
-
module Linux
|
6
|
-
class Disk < BaseResolver
|
7
|
-
@log = Facter::Log.new(self)
|
8
|
-
|
9
|
-
init_resolver
|
10
|
-
|
11
|
-
DIR = '/sys/block'
|
12
|
-
FILE_PATHS = { model: 'device/model', size: 'size', vendor: 'device/vendor', type: 'queue/rotational' }.freeze
|
13
|
-
|
14
|
-
class << self
|
15
|
-
private
|
16
|
-
|
17
|
-
def post_resolve(fact_name, _options)
|
18
|
-
@fact_list.fetch(fact_name) { read_facts(fact_name) }
|
19
|
-
end
|
20
|
-
|
21
|
-
def read_facts(fact_name)
|
22
|
-
build_disks_hash
|
23
|
-
|
24
|
-
FILE_PATHS.each do |key, file|
|
25
|
-
@fact_list[:disks].each do |disk, value|
|
26
|
-
file_path = File.join(DIR, disk, file)
|
27
|
-
|
28
|
-
result = Facter::Util::FileHelper.safe_read(file_path).strip
|
29
|
-
next if result.empty?
|
30
|
-
|
31
|
-
value[key] = case key
|
32
|
-
when :size
|
33
|
-
# Linux always considers sectors to be 512 bytes long
|
34
|
-
# independently of the devices real block size.
|
35
|
-
construct_size(value, result)
|
36
|
-
when :type
|
37
|
-
result == '0' ? 'ssd' : 'hdd'
|
38
|
-
else
|
39
|
-
result
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
@fact_list[:disks] = nil if @fact_list[:disks].empty?
|
45
|
-
@fact_list[fact_name]
|
46
|
-
end
|
47
|
-
|
48
|
-
def build_disks_hash
|
49
|
-
@fact_list[:disks] = {}
|
50
|
-
directories = Dir.entries(DIR).reject { |dir| dir =~ /\.+/ }
|
51
|
-
directories.each { |disk| @fact_list[:disks].merge!(disk => {}) }
|
52
|
-
@fact_list[:disks].select! { |disk, _fact| File.readable?(File.join(DIR, disk, 'device')) }
|
53
|
-
end
|
54
|
-
|
55
|
-
def construct_size(facts, value)
|
56
|
-
value = value.to_i * 512
|
57
|
-
facts[:size_bytes] = value
|
58
|
-
facts[:size] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(value)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|