facter 4.4.0 → 4.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/facter/custom_facts/core/execution/base.rb +3 -3
  3. data/lib/facter/custom_facts/core/execution.rb +1 -1
  4. data/lib/facter/custom_facts/util/collection.rb +3 -1
  5. data/lib/facter/custom_facts/util/fact.rb +1 -1
  6. data/lib/facter/custom_facts/util/normalization.rb +4 -0
  7. data/lib/facter/facts/linux/partitions.rb +4 -0
  8. data/lib/facter/facts/linux/processors/isa.rb +1 -10
  9. data/lib/facter/facts/ol/lsbdistdescription.rb +16 -0
  10. data/lib/facter/facts/ol/lsbdistid.rb +16 -0
  11. data/lib/facter/facts/ol/os/distro/description.rb +19 -0
  12. data/lib/facter/facts/ol/os/distro/id.rb +19 -0
  13. data/lib/facter/framework/config/config_reader.rb +4 -0
  14. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +13 -1
  15. data/lib/facter/framework/core/file_loader.rb +4 -1
  16. data/lib/facter/framework/core/options/config_file_options.rb +4 -0
  17. data/lib/facter/framework/core/options/options_validator.rb +9 -2
  18. data/lib/facter/framework/parsers/query_parser.rb +2 -1
  19. data/lib/facter/resolvers/aix/networking.rb +4 -2
  20. data/lib/facter/resolvers/augeas.rb +3 -0
  21. data/lib/facter/resolvers/base_resolver.rb +1 -4
  22. data/lib/facter/resolvers/dmi.rb +1 -1
  23. data/lib/facter/resolvers/freebsd/swap_memory.rb +1 -1
  24. data/lib/facter/resolvers/gce.rb +9 -0
  25. data/lib/facter/resolvers/macosx/swap_memory.rb +1 -1
  26. data/lib/facter/resolvers/os_release.rb +12 -1
  27. data/lib/facter/resolvers/solaris/ffi/functions.rb +5 -3
  28. data/lib/facter/resolvers/solaris/mountpoints.rb +33 -14
  29. data/lib/facter/resolvers/windows/timezone.rb +1 -1
  30. data/lib/facter/util/api_debugger.rb +1 -1
  31. data/lib/facter/util/resolvers/ffi/hostname.rb +1 -1
  32. data/lib/facter/util/resolvers/filesystem_helper.rb +1 -1
  33. data/lib/facter/util/resolvers/networking/networking.rb +4 -2
  34. data/lib/facter/version.rb +1 -1
  35. metadata +6 -3
  36. data/lib/facter/facts/windows/augeas/version.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a329a8e0a2281e2640784c89bd374f16a2cb75dbbde5a19b5608340371d92601
4
- data.tar.gz: 9374fd76feb4d7d583b566e6f5c6daffb613fff8c6adeca0fffd9201e6dd676c
3
+ metadata.gz: c01a91258966862aa3d5b43fca18899206b64cefa3fd42446ac1c012132e90ea
4
+ data.tar.gz: 3e1c32c10e166a3dcb8ed55d709b4ce8cbe9c56b9238ed42964519caf48b82be
5
5
  SHA512:
6
- metadata.gz: 7c1ef71b91e17ba0441a4a56c10fcf1eaea3c09e99754e9a42035e3ddbf41de82268d49b9debef5096eed6673b499b6fd3368473c7cdeaddc0b8ab0a3d0ad4a0
7
- data.tar.gz: 7c431855c6d26c5bda0f17f647d80c7c593c455ad8bad56aa0b9d5077bb4d59ea0f34a53b512cfe3569d13c46ff477e887e14c45e01d9e55044e0b3311257d81
6
+ metadata.gz: a9f7a49e2297d1dd06b1544118e58a5cba75aa04a5991e61e3450039ff86caa934c30d1d7b584d4432a081d010be6f978f6bc6fef8cfdfa38367ec858f0a2754
7
+ data.tar.gz: c7793db89e1fd72269eba0b1f195942020a60d699374b661cd87f418be2aff38cb128ab45d0959696e696601c0bb70b7715d85c5c6404bb1aa77e9727e5f659b
@@ -8,7 +8,7 @@ module Facter
8
8
  class Base
9
9
  STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s'
10
10
  VALID_OPTIONS = %i[on_fail expand logger timeout].freeze
11
-
11
+ DEFAULT_EXECUTION_TIMEOUT = 300
12
12
  def initialize
13
13
  @log = Log.new(self)
14
14
  end
@@ -65,7 +65,7 @@ module Facter
65
65
  end
66
66
 
67
67
  def execute_command(command, on_fail = nil, logger = nil, timeout = nil)
68
- timeout ||= 300
68
+ timeout ||= DEFAULT_EXECUTION_TIMEOUT
69
69
  begin
70
70
  # Set LC_ALL and LANG to force i18n to C for the duration of this exec;
71
71
  # this ensures that any code that parses the
@@ -98,7 +98,7 @@ module Facter
98
98
  message = "Failed while executing '#{command}': #{e.message}"
99
99
  if logger
100
100
  @log.debug(message)
101
- return ''
101
+ return +''
102
102
  end
103
103
 
104
104
  return on_fail unless on_fail == :raise
@@ -131,7 +131,7 @@ module Facter
131
131
  #
132
132
  # @param on_fail[Object] How to behave when the command could
133
133
  # not be run. Specifying :raise will raise an error, anything else will
134
- # return that object on failure. Default is :raise.
134
+ # return that object on failure. Default is to not raise.
135
135
  # @param logger Optional logger used to log the command's stderr.
136
136
  # @param timeout Optional time out for the specified command. If no timeout is passed,
137
137
  # a default of 300 seconds is used.
@@ -32,7 +32,7 @@ module LegacyFacter
32
32
 
33
33
  fact
34
34
  rescue StandardError => e
35
- log.log_exception("Unable to add fact #{name}: #{e}")
35
+ log.log_exception(e)
36
36
  end
37
37
 
38
38
  # Add a resolution mechanism for a named fact. This does not distinguish
@@ -48,6 +48,8 @@ module LegacyFacter
48
48
  fact.add(options, &block)
49
49
 
50
50
  fact
51
+ rescue StandardError => e
52
+ log.log_exception(e)
51
53
  end
52
54
 
53
55
  include Enumerable
@@ -35,7 +35,7 @@ module Facter
35
35
  #
36
36
  # @api private
37
37
  def initialize(name, options = {})
38
- @name = name.to_s.downcase.intern
38
+ @name = LegacyFacter::Util::Normalization.normalize(name.to_s.downcase).intern
39
39
 
40
40
  @options = options.dup
41
41
  extract_ldapname_option!(options)
@@ -54,6 +54,10 @@ module LegacyFacter
54
54
  raise NormalizationError, "String #{value.inspect} doesn't match the reported encoding #{value.encoding}"
55
55
  end
56
56
 
57
+ if value.codepoints.include?(0)
58
+ raise NormalizationError, "String #{value.inspect} contains a null byte reference; unsupported for all facts."
59
+ end
60
+
57
61
  value
58
62
  rescue EncodingError
59
63
  raise NormalizationError, "String encoding #{value.encoding} is not UTF-8 and could not be converted to UTF-8"
@@ -11,6 +11,10 @@ module Facts
11
11
 
12
12
  def partitions
13
13
  parts = Facter::Resolvers::Partitions.resolve(:partitions)
14
+ # We should exit early if we are running on a node with no partitions
15
+ # (e.g. a diskless, netbooted VM)
16
+ return nil unless parts
17
+
14
18
  mountpoints = Facter::Resolvers::Mountpoints.resolve(:mountpoints)
15
19
  return parts unless mountpoints
16
20
 
@@ -9,16 +9,7 @@ module Facts
9
9
 
10
10
  def call_the_resolver
11
11
  fact_value = Facter::Resolvers::Uname.resolve(:processor)
12
- isa = get_isa(fact_value)
13
-
14
- [Facter::ResolvedFact.new(FACT_NAME, isa), Facter::ResolvedFact.new(ALIASES, isa, :legacy)]
15
- end
16
-
17
- private
18
-
19
- def get_isa(fact_value)
20
- value_split = fact_value.split('.')
21
- value_split.last
12
+ [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
22
13
  end
23
14
  end
24
15
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Ol
5
+ class Lsbdistdescription
6
+ FACT_NAME = 'lsbdistdescription'
7
+ TYPE = :legacy
8
+
9
+ def call_the_resolver
10
+ fact_value = Facter::Resolvers::LsbRelease.resolve(:description)
11
+
12
+ Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Ol
5
+ class Lsbdistid
6
+ FACT_NAME = 'lsbdistid'
7
+ TYPE = :legacy
8
+
9
+ def call_the_resolver
10
+ fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id)
11
+
12
+ Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Ol
5
+ module Os
6
+ module Distro
7
+ class Description
8
+ FACT_NAME = 'os.distro.description'
9
+
10
+ def call_the_resolver
11
+ fact_value = Facter::Resolvers::OsRelease.resolve(:pretty_name)
12
+
13
+ Facter::ResolvedFact.new(FACT_NAME, fact_value)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Ol
5
+ module Os
6
+ module Distro
7
+ class Id
8
+ FACT_NAME = 'os.distro.id'
9
+
10
+ def call_the_resolver
11
+ fact_value = Facter::Resolvers::OsRelease.resolve(:id).capitalize
12
+
13
+ Facter::ResolvedFact.new(FACT_NAME, fact_value)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -38,6 +38,10 @@ module Facter
38
38
  @conf = {}
39
39
  end
40
40
 
41
+ def clear
42
+ @conf = {}
43
+ end
44
+
41
45
  private
42
46
 
43
47
  def log
@@ -21,7 +21,19 @@ module Facter
21
21
  def load(user_query, options)
22
22
  @internal_facts = load_internal_facts(user_query, options)
23
23
  @custom_facts = load_custom_facts(options)
24
- @external_facts = load_external_facts(options)
24
+ if ENV['INSIDE_FACTER']
25
+ @log.debug('INSIDE_FACTER env var detected, not loading external facts to prevent recursion')
26
+ if options[:external_facts]
27
+ @log.warn('Recursion detected, skipping external facts. Silence this warning by adding --no-external-facts')
28
+ end
29
+ else
30
+ begin
31
+ ENV['INSIDE_FACTER'] = 'true'
32
+ @external_facts = load_external_facts(options)
33
+ ensure
34
+ ENV.delete('INSIDE_FACTER')
35
+ end
36
+ end
25
37
 
26
38
  filter_env_facts
27
39
 
@@ -642,6 +642,10 @@ os_hierarchy.each do |os|
642
642
 
643
643
  when 'ol'
644
644
  require_relative '../../facts/ol/os/release.rb'
645
+ require_relative '../../facts/ol/lsbdistdescription.rb'
646
+ require_relative '../../facts/ol/lsbdistid.rb'
647
+ require_relative '../../facts/ol/os/distro/description.rb'
648
+ require_relative '../../facts/ol/os/distro/id.rb'
645
649
 
646
650
  when 'openwrt'
647
651
  require_relative '../../facts/openwrt/os/release.rb'
@@ -802,7 +806,6 @@ os_hierarchy.each do |os|
802
806
  require_relative '../../util/windows/win32ole.rb'
803
807
 
804
808
  require_relative '../../facts/windows/aio_agent_version.rb'
805
- require_relative '../../facts/windows/augeas/version.rb'
806
809
  require_relative '../../facts/windows/az_metadata.rb'
807
810
  require_relative '../../facts/windows/cloud/provider.rb'
808
811
  require_relative '../../facts/windows/dhcp_servers.rb'
@@ -16,6 +16,10 @@ module Facter
16
16
  @options || {}
17
17
  end
18
18
 
19
+ def clear
20
+ @options = {}
21
+ end
22
+
19
23
  private
20
24
 
21
25
  def augment_structured_facts(global_conf)
@@ -55,8 +55,15 @@ module Facter
55
55
  no_custom_facts = !options[:custom_facts]
56
56
  puppet = options[:puppet]
57
57
  custom_dir = options[:custom_dir].nil? ? false : options[:custom_dir].any?
58
- external_dir = options[:external_dir].nil? ? false : options[:external_dir].any?
59
-
58
+ default_external_dir = Facter::OptionStore.default_external_dir
59
+ # --puppet/-p option adds an external directory and is not an explicitly
60
+ # set external_dir from cli or config file
61
+ default_external_dir += [Puppet[:pluginfactdest]] if puppet && const_defined?('Puppet')
62
+ external_dir = if options[:external_dir].nil? || options[:external_dir].none?
63
+ false
64
+ else
65
+ options[:external_dir] != default_external_dir
66
+ end
60
67
  [
61
68
  { 'no-ruby' => no_ruby, 'custom-dir' => custom_dir },
62
69
  { 'no-external-facts' => !options[:external_facts], 'external-dir' => external_dir },
@@ -85,7 +85,8 @@ module Facter
85
85
 
86
86
  return false if fact_with_wildcard && !query_fact.match("^#{fact_name}$")
87
87
 
88
- return false unless fact_with_wildcard || fact_name.match("^#{processed_equery_fact}($|\\.)")
88
+ # Must escape metacharacters (like dots) to ensure the correct fact is found
89
+ return false unless fact_with_wildcard || fact_name.match("^#{Regexp.escape(processed_equery_fact)}($|\\.)")
89
90
 
90
91
  true
91
92
  end
@@ -48,8 +48,10 @@ module Facter
48
48
  info = line.split("\s")
49
49
  interface_name = info[0]
50
50
  mac = info[3][/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/]
51
- interfaces[interface_name][:mtu] = info[1].to_i
52
- interfaces[interface_name][:mac] = format_mac_address(mac) if mac
51
+ if interfaces[interface_name]
52
+ interfaces[interface_name][:mtu] = info[1].to_i
53
+ interfaces[interface_name][:mac] = format_mac_address(mac) if mac
54
+ end
53
55
  end
54
56
  end
55
57
 
@@ -17,6 +17,9 @@ module Facter
17
17
  @fact_list[:augeas_version] ||= read_augeas_from_gem
18
18
 
19
19
  @fact_list[fact_name]
20
+ rescue LoadError => e
21
+ log.debug("Resolving fact #{fact_name}, but got #{e} at #{e.backtrace[0]}")
22
+ @fact_list[:augeas_version] = nil
20
23
  end
21
24
 
22
25
  def read_augeas_from_cli
@@ -27,11 +27,8 @@ module Facter
27
27
 
28
28
  cache_nil_for_unresolved_facts(fact_name)
29
29
  end
30
- rescue NoMethodError => e
31
- log.debug("Could not resolve #{fact_name}, got #{e} at #{e.backtrace[0]}")
32
- @fact_list[fact_name] = nil
33
30
  rescue LoadError, NameError => e
34
- log.debug("Resolving fact #{fact_name}, but got #{e} at #{e.backtrace[0]}")
31
+ log.error("Resolving fact #{fact_name}, but got #{e} at #{e.backtrace[0]}")
35
32
  @fact_list[fact_name] = nil
36
33
  end
37
34
 
@@ -36,7 +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
+ file_content = file_content.encode('UTF-8', invalid: :replace) if file_content
40
40
  if files.include?(fact_name.to_s) && file_content
41
41
  file_content = file_content.strip
42
42
  @fact_list[fact_name] = file_content unless file_content.empty?
@@ -13,7 +13,7 @@ module Facter
13
13
  @fact_list.fetch(fact_name) { read_swap_memory(fact_name) }
14
14
  end
15
15
 
16
- def read_swap_memory(fact_name) # rubocop:disable Metrics/AbcSize
16
+ def read_swap_memory(fact_name)
17
17
  output = Facter::Core::Execution.execute('swapinfo -k', logger: log)
18
18
  data = output.split("\n")[1..-1].map { |line| line.split(/\s+/) }
19
19
 
@@ -39,6 +39,15 @@ module Facter
39
39
  instance_data = gce_data['instance']
40
40
  return if instance_data.nil? || instance_data.empty?
41
41
 
42
+ # See https://cloud.google.com/compute/docs/metadata for information about these values
43
+ %w[sshKeys ssh-keys].each do |name|
44
+ keys = gce_data.dig('project', 'attributes', name)
45
+ gce_data['project']['attributes'][name] = keys.strip.split("\n") if keys
46
+
47
+ keys = instance_data.dig('attributes', name)
48
+ instance_data['attributes'][name] = keys.strip.split("\n") if keys
49
+ end
50
+
42
51
  %w[image machineType zone].each do |key|
43
52
  instance_data[key] = instance_data[key].split('/').last if instance_data[key]
44
53
  end
@@ -13,7 +13,7 @@ module Facter
13
13
  @fact_list.fetch(fact_name) { read_swap_memory(fact_name) }
14
14
  end
15
15
 
16
- def read_swap_memory(fact_name) # rubocop:disable Metrics/AbcSize
16
+ def read_swap_memory(fact_name)
17
17
  output = Facter::Core::Execution.execute('sysctl -n vm.swapusage', logger: log)
18
18
  data = output.match(/^total = ([\d.]+)M used = ([\d.]+)M free = ([\d.]+)M (\(encrypted\))$/)
19
19
 
@@ -49,7 +49,7 @@ module Facter
49
49
 
50
50
  pairs = []
51
51
  content.each do |line|
52
- pairs << line.strip.delete('"').split('=', 2)
52
+ pairs << line.strip.delete('"').split('=', 2) unless line.start_with?('#')
53
53
  end
54
54
 
55
55
  pairs
@@ -69,17 +69,28 @@ module Facter
69
69
  def process_id
70
70
  return unless @fact_list[:id]
71
71
 
72
+ @fact_list[:id] = 'sles' if /sles_sap/i.match?(@fact_list[:id])
72
73
  @fact_list[:id] = 'opensuse' if /opensuse/i.match?(@fact_list[:id])
73
74
  end
74
75
 
75
76
  def process_name
76
77
  return unless @fact_list[:name]
77
78
 
79
+ normalize_os_name
78
80
  join_os_name
79
81
  capitalize_os_name
80
82
  append_linux_to_os_name
81
83
  end
82
84
 
85
+ def normalize_os_name
86
+ os_name = @fact_list[:name]
87
+ @fact_list[:name] = if os_name.downcase.start_with?('sles')
88
+ 'SLES'
89
+ else
90
+ os_name
91
+ end
92
+ end
93
+
83
94
  def join_os_name
84
95
  os_name = @fact_list[:name]
85
96
  @fact_list[:name] = if os_name.downcase.start_with?('red', 'oracle', 'arch', 'manjaro')
@@ -15,9 +15,11 @@ module Facter
15
15
 
16
16
  def self.ioctl(call_const, pointer, address_family = AF_INET)
17
17
  fd = Ioctl.open_socket(address_family, SOCK_DGRAM, 0)
18
- result = ioctl_base(fd, call_const, pointer)
19
- Ioctl.close_socket(fd, 2)
20
- result
18
+ begin
19
+ ioctl_base(fd, call_const, pointer)
20
+ ensure
21
+ Ioctl.close_socket(fd, 2)
22
+ end
21
23
  end
22
24
  end
23
25
  end
@@ -21,11 +21,11 @@ module Facter
21
21
  end
22
22
  end
23
23
 
24
- def read_mounts(fact_name) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
24
+ def read_mounts(fact_name) # rubocop:disable Metrics/MethodLength
25
25
  @mounts = []
26
26
  @auto_home_paths = []
27
27
 
28
- Facter::Util::Resolvers::FilesystemHelper.read_mountpoints.each do |fs|
28
+ Facter::Util::Resolvers::FilesystemHelper.read_mountpoints&.each do |fs|
29
29
  if fs.name == 'auto_home'
30
30
  @auto_home_paths << fs.mount_point
31
31
  next
@@ -33,26 +33,22 @@ module Facter
33
33
 
34
34
  next if fs.mount_type == 'autofs'
35
35
 
36
+ mounts = {}
36
37
  device = fs.name
37
38
  filesystem = fs.mount_type
38
39
  path = fs.mount_point
39
40
  options = fs.options.split(',').map(&:strip)
40
41
 
41
- stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(path)
42
- size_bytes = stats.bytes_total.abs
43
- available_bytes = stats.bytes_available.abs
44
-
45
- used_bytes = stats.bytes_used.abs
46
- total_bytes = used_bytes + available_bytes
47
- capacity = Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, total_bytes)
48
-
49
- size = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes)
50
- available = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes)
51
- used = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes)
42
+ mounts = read_stats(path).tap do |hash|
43
+ hash[:device] = device
44
+ hash[:filesystem] = filesystem
45
+ hash[:path] = path
46
+ hash[:options] = options if options.any?
47
+ end
52
48
 
53
49
  @mounts << Hash[Facter::Util::Resolvers::FilesystemHelper::MOUNT_KEYS
54
50
  .zip(Facter::Util::Resolvers::FilesystemHelper::MOUNT_KEYS
55
- .map { |v| binding.local_variable_get(v) })]
51
+ .map { |v| mounts[v] })]
56
52
  end
57
53
 
58
54
  exclude_auto_home_mounts!
@@ -60,6 +56,29 @@ module Facter
60
56
  @fact_list[:mountpoints] = @mounts
61
57
  @fact_list[fact_name]
62
58
  end
59
+
60
+ def read_stats(path)
61
+ begin
62
+ stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(path)
63
+ size_bytes = stats.bytes_total.abs
64
+ available_bytes = stats.bytes_available.abs
65
+ used_bytes = stats.bytes_used.abs
66
+ total_bytes = used_bytes + available_bytes
67
+ rescue Sys::Filesystem::Error
68
+ size_bytes = used_bytes = available_bytes = 0
69
+ end
70
+
71
+ {
72
+ size_bytes: size_bytes,
73
+ available_bytes: available_bytes,
74
+ used_bytes: used_bytes,
75
+ total_bytes: total_bytes,
76
+ capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, total_bytes),
77
+ size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes),
78
+ available: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes),
79
+ used: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes)
80
+ }
81
+ end
63
82
  end
64
83
  end
65
84
  end
@@ -22,7 +22,7 @@ module Facter
22
22
 
23
23
  def codepage
24
24
  result = codepage_from_api
25
- result.empty? ? codepage_from_registry : result
25
+ result&.empty? ? codepage_from_registry : result
26
26
  end
27
27
 
28
28
  def codepage_from_registry
@@ -3,7 +3,7 @@
3
3
  module Facter
4
4
  module Util
5
5
  module ApiDebugger
6
- def self.prepended(receiver) # rubocop:disable Metrics/AbcSize
6
+ def self.prepended(receiver)
7
7
  exclude, print_caller = parse_options(ENV['API_DEBUG'])
8
8
 
9
9
  receiver_methods = receiver.instance_methods - Object.methods
@@ -36,7 +36,7 @@ module Facter
36
36
  raw_hostname.read_string
37
37
  end
38
38
 
39
- def self.getffiaddrinfo(hostname) # rubocop:disable Metrics/AbcSize
39
+ def self.getffiaddrinfo(hostname)
40
40
  ret = FFI::MemoryPointer.new(:pointer)
41
41
 
42
42
  hints = Facter::Util::Resolvers::Ffi::AddrInfo.new
@@ -33,7 +33,7 @@ module Facter
33
33
  private
34
34
 
35
35
  def force_utf(mounts)
36
- mounts.each do |mount|
36
+ mounts&.each do |mount|
37
37
  mount.name.force_encoding('UTF-8')
38
38
  mount.mount_type.force_encoding('UTF-8')
39
39
  mount.mount_point.force_encoding('UTF-8')
@@ -36,7 +36,9 @@ module Facter
36
36
  interfaces = networking_facts[:interfaces]
37
37
 
38
38
  expand_interfaces(interfaces) unless interfaces.nil?
39
- expand_primary_interface(networking_facts, primary) unless primary.nil? || interfaces.nil?
39
+ return if primary.nil? || interfaces.nil? || networking_facts.nil?
40
+
41
+ expand_primary_interface(networking_facts, primary)
40
42
  end
41
43
 
42
44
  def get_scope(ip)
@@ -105,7 +107,7 @@ module Facter
105
107
  end
106
108
 
107
109
  def expand_primary_interface(networking_facts, primary)
108
- networking_facts[:interfaces][primary].each do |key, value|
110
+ networking_facts[:interfaces][primary]&.each do |key, value|
109
111
  networking_facts[key] = value unless %i[bindings bindings6].include?(key)
110
112
  end
111
113
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Facter
4
- VERSION = '4.4.0' unless defined?(VERSION)
4
+ VERSION = '4.4.2' 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.4.0
4
+ version: 4.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-21 00:00:00.000000000 Z
11
+ date: 2023-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -649,6 +649,10 @@ files:
649
649
  - lib/facter/facts/mariner/os/release.rb
650
650
  - lib/facter/facts/meego/os/release.rb
651
651
  - lib/facter/facts/oel/os/release.rb
652
+ - lib/facter/facts/ol/lsbdistdescription.rb
653
+ - lib/facter/facts/ol/lsbdistid.rb
654
+ - lib/facter/facts/ol/os/distro/description.rb
655
+ - lib/facter/facts/ol/os/distro/id.rb
652
656
  - lib/facter/facts/ol/os/release.rb
653
657
  - lib/facter/facts/openwrt/os/release.rb
654
658
  - lib/facter/facts/ovs/os/release.rb
@@ -776,7 +780,6 @@ files:
776
780
  - lib/facter/facts/ubuntu/os/distro/release.rb
777
781
  - lib/facter/facts/ubuntu/os/release.rb
778
782
  - lib/facter/facts/windows/aio_agent_version.rb
779
- - lib/facter/facts/windows/augeas/version.rb
780
783
  - lib/facter/facts/windows/az_metadata.rb
781
784
  - lib/facter/facts/windows/cloud/provider.rb
782
785
  - lib/facter/facts/windows/dhcp_servers.rb
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facts
4
- module Windows
5
- module Augeas
6
- class Version
7
- FACT_NAME = 'augeas.version'
8
- ALIASES = 'augeasversion'
9
-
10
- def call_the_resolver
11
- fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version)
12
-
13
- [Facter::ResolvedFact.new(FACT_NAME, fact_value),
14
- Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
15
- end
16
- end
17
- end
18
- end
19
- end