facter 4.4.0 → 4.4.2

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.
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