facter 4.2.5 → 4.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fa80567c0c01b5ceed0181b78f9e9e813d4eea3c70905733ba1aa5e9298ad15
4
- data.tar.gz: 1541ade4a87eacbbaa569c0ace340312dfde0c8299b12cd1973d8861449a798f
3
+ metadata.gz: 3abae20894fc4d31ecfa8190b26307c05f73dce8454b1caa5ae0753cf6f17928
4
+ data.tar.gz: 7f5e4ed7f8eda7306ef86101e8a7d61c59b1dd1e56104875378bbd7113b19632
5
5
  SHA512:
6
- metadata.gz: ea3608714cc012b4f64de7f4b472c904152e82387b980d7b3740a318b3b500228dc2e57a41bab27c113d7d6cb9ce8985394d69db2c6ef49d0fd1483b0608b220
7
- data.tar.gz: 33f8a676b5a70c964f90f2576e4b1a65d5e2b27c9b2b09edd12145f77da20f303ab295ee3de1998aed74eff967e4765ac0ad48a885a9ffbe175bbda2f6ce3b20
6
+ metadata.gz: dcfeebbb72dd925224405095a1043bd6e99ef30afc4395f896172f1441b88a1c4c454ff812c4d23e71da823e20e54b30ae76e08602dd70fd5376c7f5a583f23a
7
+ data.tar.gz: 3cccf97b96203afddc850670e73ddc96bfffa9dc5f7949d567f89f44be68a39ba642ec04d930154b874d1b02cc9c98a5a0ae0d78cd96f6a17089ee6b4c01e7c2
data/lib/facter/config.rb CHANGED
@@ -167,6 +167,7 @@ module Facter
167
167
  macosx_productversion_major
168
168
  macosx_productversion_minor
169
169
  macosx_productversion_patch
170
+ windows_display_version
170
171
  windows_edition_id
171
172
  windows_installation_type
172
173
  windows_product_name
@@ -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)
@@ -117,9 +118,10 @@ module Facter
117
118
  timeout = (options[:timeout] || options[:time_limit] || options[:limit]).to_i
118
119
  timeout = timeout.positive? ? timeout : nil
119
120
 
120
- extra_keys = options.keys - %i[on_fail expand logger timeout]
121
+ extra_keys = options.keys - VALID_OPTIONS
121
122
  unless extra_keys.empty?
122
- @log.warn("Unexpected key passed to Facter::Core::Execution.execute option: #{options.keys.join(',')}")
123
+ @log.warn("Unexpected key passed to Facter::Core::Execution.execute option: #{extra_keys.join(',')}" \
124
+ " - valid keys: #{VALID_OPTIONS.join(',')}")
123
125
  end
124
126
 
125
127
  [on_fail, expand, logger, timeout]
@@ -117,7 +117,7 @@ module Facter
117
117
  #
118
118
  # @api public
119
119
  def value
120
- return @value if @value
120
+ return @value unless @value.nil?
121
121
 
122
122
  if @resolves.empty?
123
123
  log.debug format('No resolves for %<name>s', name: @name)
@@ -188,7 +188,7 @@ module Facter
188
188
  end
189
189
 
190
190
  def resolve_value
191
- if @value
191
+ if !@value.nil?
192
192
  @value
193
193
  elsif @code.nil?
194
194
  nil
@@ -10,6 +10,8 @@ module Facts
10
10
  provider = case Facter::Util::Facts::Posix::VirtualDetector.platform
11
11
  when 'hyperv'
12
12
  'azure' unless Facter::Resolvers::Az.resolve(:metadata).empty?
13
+ when 'kvm', 'xen'
14
+ 'aws' unless Facter::Resolvers::Ec2.resolve(:metadata).empty?
13
15
  end
14
16
 
15
17
  Facter::ResolvedFact.new(FACT_NAME, provider)
@@ -8,7 +8,7 @@ module Facts
8
8
 
9
9
  def call_the_resolver
10
10
  facts = []
11
- disks = Facter::Resolvers::Linux::Disk.resolve(:disks)
11
+ disks = Facter::Resolvers::Linux::Disks.resolve(:disks)
12
12
 
13
13
  return Facter::ResolvedFact.new(FACT_NAME, nil) if disks.nil? || disks.empty?
14
14
 
@@ -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
@@ -11,6 +11,8 @@ module Facts
11
11
  provider = case virtual
12
12
  when 'hyperv'
13
13
  'azure' unless Facter::Resolvers::Az.resolve(:metadata).empty?
14
+ when 'kvm', 'xen'
15
+ 'aws' unless Facter::Resolvers::Ec2.resolve(:metadata).empty?
14
16
  end
15
17
 
16
18
  Facter::ResolvedFact.new(FACT_NAME, provider)
@@ -6,11 +6,12 @@ module Facts
6
6
  module Windows
7
7
  class DisplayVersion
8
8
  FACT_NAME = 'os.windows.display_version'
9
+ ALIASES = 'windows_display_version'
9
10
 
10
11
  def call_the_resolver
11
12
  fact_value = Facter::Resolvers::ProductRelease.resolve(:display_version)
12
13
 
13
- Facter::ResolvedFact.new(FACT_NAME, fact_value)
14
+ [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
14
15
  end
15
16
  end
16
17
  end
@@ -6,7 +6,7 @@ module Facts
6
6
  FACT_NAME = 'timezone'
7
7
 
8
8
  def call_the_resolver
9
- fact_value = Facter::Resolvers::Timezone.resolve(:timezone)
9
+ fact_value = Facter::Resolvers::Windows::Timezone.resolve(:timezone)
10
10
 
11
11
  Facter::ResolvedFact.new(FACT_NAME, fact_value)
12
12
  end
@@ -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
- next if File.readable?(cache_file_name)
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
 
@@ -55,10 +55,25 @@ module Facter
55
55
 
56
56
  def store(options)
57
57
  options.each do |key, value|
58
- value = '' if key == 'log_level' && value == 'log_level'
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, :version, :hierarchy
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(:identifier)
79
- @version = resolver.resolve(:version)
78
+ @identifier = resolver.resolve(:id)
80
79
  break if @identifier
81
80
  end
82
81
 
@@ -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 =~ /\s+node\s+|---|procfs|ahafs/
21
+ output.split("\n").drop(2).map do |line|
22
+ next if line =~ /procfs|ahafs/
23
23
 
24
- elem = line.split("\s")
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 =~ /Filesystem|-\s+-\s+-/
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])
@@ -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
+ "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
@@ -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?
@@ -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
 
@@ -38,8 +38,6 @@ module Facter
38
38
 
39
39
  result = Hash[*release_info.flatten]
40
40
  result.each { |k, v| @fact_list[k.downcase.gsub(/\s/, '_').to_sym] = v }
41
-
42
- @fact_list[:identifier] = @fact_list[:distributor_id]
43
41
  end
44
42
  end
45
43
  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) { read_os_release_file(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 read_os_release_file(fact_name)
27
- output = Facter::Util::FileHelper.safe_readlines('/etc/os-release')
28
- return @fact_list[:name] = nil if output.empty?
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
- fill_fact_list(pairs)
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 pad_version_id
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
- os_name = @fact_list[:name]
57
- return unless os_name
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 normalize_opensuse_identifier
69
- @fact_list[:identifier] = 'opensuse' if @fact_list[:identifier] =~ /opensuse/i
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[:identifier] = identifier(@fact_list[:name])
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 identifier(value)
47
- identifier = value.downcase
48
- identifier = 'rhel' if @fact_list[:name].casecmp('Red Hat Enterprise Linux')
46
+ def id(value)
47
+ id = value.downcase
48
+ id = 'rhel' if @fact_list[:name].casecmp('Red Hat Enterprise Linux')
49
49
 
50
- identifier
50
+ id
51
51
  end
52
52
 
53
53
  def codename(value)
@@ -24,7 +24,7 @@ module Facter
24
24
 
25
25
  @fact_list[:name] = output_strings[0]
26
26
  @fact_list[:version] = output_strings[1]
27
- @fact_list[:identifier] = @fact_list[:name].downcase
27
+ @fact_list[:id] = @fact_list[:name].downcase
28
28
 
29
29
  @fact_list[fact_name]
30
30
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'facter/resolvers/windows/ffi/ffi'
4
+
5
+ module WinnlsFFI
6
+ extend FFI::Library
7
+
8
+ ffi_convention :stdcall
9
+ ffi_lib :kernel32
10
+ attach_function :GetACP, [], :uint
11
+ 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
@@ -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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- VERSION = '4.2.5' unless defined?(VERSION)
4
+ VERSION = '4.2.8' unless defined?(VERSION)
5
5
  end
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.5
4
+ version: 4.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-29 00:00:00.000000000 Z
11
+ date: 2022-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -934,7 +934,7 @@ files:
934
934
  - lib/facter/resolvers/bsd/processors.rb
935
935
  - lib/facter/resolvers/containers.rb
936
936
  - lib/facter/resolvers/debian_version.rb
937
- - lib/facter/resolvers/disk.rb
937
+ - lib/facter/resolvers/disks.rb
938
938
  - lib/facter/resolvers/dmi.rb
939
939
  - lib/facter/resolvers/dmi_decode.rb
940
940
  - lib/facter/resolvers/ec2.rb
@@ -1022,6 +1022,7 @@ files:
1022
1022
  - lib/facter/resolvers/windows/ffi/performance_information.rb
1023
1023
  - lib/facter/resolvers/windows/ffi/system32_ffi.rb
1024
1024
  - lib/facter/resolvers/windows/ffi/system_info.rb
1025
+ - lib/facter/resolvers/windows/ffi/winnls_ffi.rb
1025
1026
  - lib/facter/resolvers/windows/fips.rb
1026
1027
  - lib/facter/resolvers/windows/hardware_architecture.rb
1027
1028
  - lib/facter/resolvers/windows/identity.rb
@@ -1033,6 +1034,7 @@ files:
1033
1034
  - lib/facter/resolvers/windows/product_release.rb
1034
1035
  - lib/facter/resolvers/windows/ssh.rb
1035
1036
  - lib/facter/resolvers/windows/system32.rb
1037
+ - lib/facter/resolvers/windows/timezone.rb
1036
1038
  - lib/facter/resolvers/windows/uptime.rb
1037
1039
  - lib/facter/resolvers/windows/virtualization.rb
1038
1040
  - lib/facter/resolvers/windows/win_os_description.rb
@@ -1092,7 +1094,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1092
1094
  - !ruby/object:Gem::Version
1093
1095
  version: '0'
1094
1096
  requirements: []
1095
- rubygems_version: 3.0.8
1097
+ rubygems_version: 3.1.6
1096
1098
  signing_key:
1097
1099
  specification_version: 4
1098
1100
  summary: Facter, a system inventory tool
@@ -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