facter 4.2.5 → 4.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fa80567c0c01b5ceed0181b78f9e9e813d4eea3c70905733ba1aa5e9298ad15
4
- data.tar.gz: 1541ade4a87eacbbaa569c0ace340312dfde0c8299b12cd1973d8861449a798f
3
+ metadata.gz: a0c594d7e1c0b1242696bfff37bb65cfa378f08a80b79d68cc03ec277a3622c9
4
+ data.tar.gz: ba4ed34667a934a131241583e0c520460e6e94b6ff31e78c0d02851c9064e752
5
5
  SHA512:
6
- metadata.gz: ea3608714cc012b4f64de7f4b472c904152e82387b980d7b3740a318b3b500228dc2e57a41bab27c113d7d6cb9ce8985394d69db2c6ef49d0fd1483b0608b220
7
- data.tar.gz: 33f8a676b5a70c964f90f2576e4b1a65d5e2b27c9b2b09edd12145f77da20f303ab295ee3de1998aed74eff967e4765ac0ad48a885a9ffbe175bbda2f6ce3b20
6
+ metadata.gz: 066123daac0a1b601f3c480bfef30aee5d481b1f810b0d99f4c5542493a1aba83f8a600d462b935347aa65f967417dc4522669ffdba54e36cf1ebaf6879cdaa1
7
+ data.tar.gz: 48133fe43104a4e0bb1fd47d230ecd6debed1bf8b0eeae1096aab5e0324272e8162efde1fc6804a0c1afd5840b08d863c5ee9c953f731f564f7f69976ec976e8
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
@@ -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
 
@@ -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
+ "/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
@@ -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?
@@ -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.6' 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.6
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: 2021-12-07 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
@@ -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