facter 4.4.0 → 4.4.1

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