facter 4.4.0 → 4.4.1

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: a329a8e0a2281e2640784c89bd374f16a2cb75dbbde5a19b5608340371d92601
4
- data.tar.gz: 9374fd76feb4d7d583b566e6f5c6daffb613fff8c6adeca0fffd9201e6dd676c
3
+ metadata.gz: 74662429c9115d4eb8feca42d49031fa3be3ff42c200a8c6ee58c664f8afa9da
4
+ data.tar.gz: e1c21ea94af446c6700c27db8c24f150671f7ee8410b8e070436e709ff85fc87
5
5
  SHA512:
6
- metadata.gz: 7c1ef71b91e17ba0441a4a56c10fcf1eaea3c09e99754e9a42035e3ddbf41de82268d49b9debef5096eed6673b499b6fd3368473c7cdeaddc0b8ab0a3d0ad4a0
7
- data.tar.gz: 7c431855c6d26c5bda0f17f647d80c7c593c455ad8bad56aa0b9d5077bb4d59ea0f34a53b512cfe3569d13c46ff477e887e14c45e01d9e55044e0b3311257d81
6
+ metadata.gz: 9a1a2529c0fe5df5da517bbcc8b76b2a53c5c138af5d83ebf8dc25b051d28861816ed4b8ab6c1e167ec4c6bcef50df7d68a34abd22f04442f44eaebd499f3bef
7
+ data.tar.gz: 6c31e966940c2d1a525c5fb1f416b5af15e2b8c57516c92eab6e74be361d198bd6494e26b85316758e7e42ff1eecc6fc3480c3f718b8de2e7d452bcde39911f0
@@ -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.
@@ -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
 
@@ -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
@@ -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,7 +21,7 @@ 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
 
@@ -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
@@ -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.1' 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.1
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-06-12 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