facter 4.0.13 → 4.0.14

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.rubocop_todo.yml +322 -38
  4. data/VERSION +1 -1
  5. data/lib/custom_facts/core/aggregate.rb +2 -2
  6. data/lib/custom_facts/core/execution.rb +2 -2
  7. data/lib/custom_facts/core/execution/base.rb +27 -13
  8. data/lib/custom_facts/core/execution/posix.rb +2 -2
  9. data/lib/custom_facts/core/execution/windows.rb +9 -2
  10. data/lib/custom_facts/core/legacy_facter.rb +3 -3
  11. data/lib/custom_facts/util/collection.rb +3 -3
  12. data/lib/custom_facts/util/fact.rb +2 -2
  13. data/lib/custom_facts/util/resolution.rb +2 -2
  14. data/lib/facter.rb +9 -6
  15. data/lib/facts/aix/mountpoints.rb +15 -0
  16. data/lib/facts/debian/os/distro/release.rb +17 -8
  17. data/lib/facts/debian/os/name.rb +1 -1
  18. data/lib/facts/debian/os/release.rb +14 -2
  19. data/lib/facts/debian/partitions.rb +26 -0
  20. data/lib/facts/el/partitions.rb +26 -0
  21. data/lib/facts/sles/partitions.rb +26 -0
  22. data/lib/facts/solaris/solaris_zones/zone.rb +2 -0
  23. data/lib/framework/core/fact_loaders/internal_fact_loader.rb +11 -7
  24. data/lib/framework/core/{cache_manager.rb → session_cache.rb} +1 -1
  25. data/lib/framework/detector/os_detector.rb +2 -0
  26. data/lib/framework/logging/logger.rb +1 -10
  27. data/lib/resolvers/aix/mountpoints.rb +69 -0
  28. data/lib/resolvers/base_resolver.rb +1 -1
  29. data/lib/resolvers/{debian_version_resolver.rb → debian_version.rb} +4 -6
  30. data/lib/resolvers/partitions.rb +101 -0
  31. data/lib/resolvers/solaris/solaris_zone_name.rb +2 -0
  32. data/lib/resolvers/solaris/zone_resolver.rb +2 -0
  33. data/lib/util/api_debugger.rb +43 -0
  34. metadata +11 -5
  35. data/lib/util/fact.rb +0 -14
@@ -8,9 +8,9 @@ module Facter
8
8
  # require_relative 'execution/posix'
9
9
 
10
10
  @@impl = if LegacyFacter::Util::Config.windows?
11
- LegacyFacter::Core::Execution::Windows.new
11
+ Facter::Core::Execution::Windows.new
12
12
  else
13
- LegacyFacter::Core::Execution::Posix.new
13
+ Facter::Core::Execution::Posix.new
14
14
  end
15
15
 
16
16
  def self.impl
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module LegacyFacter
3
+ module Facter
4
4
  module Core
5
5
  module Execution
6
6
  class Base
@@ -33,12 +33,17 @@ module LegacyFacter
33
33
 
34
34
  def execute(command, options = {})
35
35
  on_fail = options.fetch(:on_fail, :raise)
36
+ expand = options.fetch(:expand, true)
36
37
 
37
38
  # Set LC_ALL and LANG to force i18n to C for the duration of this exec;
38
39
  # this ensures that any code that parses the
39
40
  # output of the command can expect it to be in a consistent / predictable format / locale
40
41
  with_env 'LC_ALL' => 'C', 'LANG' => 'C' do
41
- expanded_command = expand_command(command)
42
+ expanded_command = if !expand && builtin_command?(command)
43
+ command
44
+ else
45
+ expand_command(command)
46
+ end
42
47
 
43
48
  if expanded_command.nil?
44
49
  if on_fail == :raise
@@ -49,17 +54,7 @@ module LegacyFacter
49
54
  return on_fail
50
55
  end
51
56
 
52
- begin
53
- out, stderr, _status_ = Open3.capture3(expanded_command.to_s)
54
- log_stderr_from_file(stderr, expanded_command)
55
- rescue StandardError => e
56
- return on_fail unless on_fail == :raise
57
-
58
- raise Facter::Core::Execution::ExecutionFailure.new,
59
- "Failed while executing '#{expanded_command}': #{e.message}"
60
- end
61
-
62
- out.strip
57
+ execute_command(expanded_command, on_fail)
63
58
  end
64
59
  end
65
60
 
@@ -72,6 +67,25 @@ module LegacyFacter
72
67
  logger = Facter::Log.new(file_name)
73
68
  logger.warn(msg.strip)
74
69
  end
70
+
71
+ def builtin_command?(command)
72
+ output, _status = Open3.capture2("type #{command}")
73
+ output.chomp =~ /builtin/ ? true : false
74
+ end
75
+
76
+ def execute_command(command, on_fail)
77
+ begin
78
+ out, stderr, _status_ = Open3.capture3(command.to_s)
79
+ log_stderr_from_file(stderr, command)
80
+ rescue StandardError => e
81
+ return on_fail unless on_fail == :raise
82
+
83
+ raise Facter::Core::Execution::ExecutionFailure.new,
84
+ "Failed while executing '#{command}': #{e.message}"
85
+ end
86
+
87
+ out.strip
88
+ end
75
89
  end
76
90
  end
77
91
  end
@@ -1,7 +1,7 @@
1
- module LegacyFacter
1
+ module Facter
2
2
  module Core
3
3
  module Execution
4
- class Posix < LegacyFacter::Core::Execution::Base
4
+ class Posix < Facter::Core::Execution::Base
5
5
  DEFAULT_SEARCH_PATHS = ['/sbin', '/usr/sbin'].freeze
6
6
 
7
7
  def search_paths
@@ -1,7 +1,7 @@
1
- module LegacyFacter
1
+ module Facter
2
2
  module Core
3
3
  module Execution
4
- class Windows < LegacyFacter::Core::Execution::Base
4
+ class Windows < Facter::Core::Execution::Base
5
5
  def search_paths
6
6
  ENV['PATH'].split(File::PATH_SEPARATOR)
7
7
  end
@@ -57,6 +57,13 @@ module LegacyFacter
57
57
 
58
58
  expanded
59
59
  end
60
+
61
+ def execute(command, options = {})
62
+ expand = options.fetch(:expand, true)
63
+ raise ArgumentError.new, 'Unsupported argument on Windows expand with value false' unless expand
64
+
65
+ super(command, options)
66
+ end
60
67
  end
61
68
  end
62
69
  end
@@ -73,7 +73,7 @@ module LegacyFacter
73
73
  #
74
74
  # @param name [String] the name of the fact
75
75
  #
76
- # @return [LegacyFacter::Util::Fact, nil] The fact object, or nil if no fact
76
+ # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact
77
77
  # is found.
78
78
  #
79
79
  # @api public
@@ -131,7 +131,7 @@ module LegacyFacter
131
131
  # @param name [Symbol] The name of the fact to define
132
132
  # @param options [Hash] A hash of options to set on the fact
133
133
  #
134
- # @return [LegacyFacter::Util::Fact] The fact that was defined
134
+ # @return [Facter::Util::Fact] The fact that was defined
135
135
  #
136
136
  # @api public
137
137
  # @see {Facter::Util::Collection#define_fact}
@@ -152,7 +152,7 @@ module LegacyFacter
152
152
  # {Facter::Util::Resolution#timeout timeout} for this resolution
153
153
  # @param block [Proc] a block defining a fact resolution
154
154
  #
155
- # @return [LegacyFacter::Util::Fact] the fact object, which includes any previously
155
+ # @return [Facter::Util::Fact] the fact object, which includes any previously
156
156
  # defined resolutions
157
157
  #
158
158
  # @api public
@@ -24,7 +24,7 @@ module LegacyFacter
24
24
  # @param name [Symbol] The name of the fact to define
25
25
  # @param options [Hash] A hash of options to set on the fact
26
26
  #
27
- # @return [LegacyFacter::Util::Fact] The fact that was defined
27
+ # @return [Facter::Util::Fact] The fact that was defined
28
28
  def define_fact(name, options = {}, &block)
29
29
  fact = create_or_return_fact(name, options)
30
30
 
@@ -41,7 +41,7 @@ module LegacyFacter
41
41
  # @param name [Symbol] The name of the fact to define
42
42
  # @param options [Hash] A hash of options to set on the fact and resolution
43
43
  #
44
- # @return [LegacyFacter::Util::Fact] The fact that was defined
44
+ # @return [Facter::Util::Fact] The fact that was defined
45
45
  def add(name, options = {}, &block)
46
46
  fact = create_or_return_fact(name, options)
47
47
 
@@ -163,7 +163,7 @@ module LegacyFacter
163
163
  fact = @facts[name]
164
164
 
165
165
  if fact.nil?
166
- fact = LegacyFacter::Util::Fact.new(name, options)
166
+ fact = Facter::Util::Fact.new(name, options)
167
167
  @facts[name] = fact
168
168
  else
169
169
  fact.extract_ldapname_option!(options)
@@ -6,7 +6,7 @@
6
6
  # Create facts using {Facter.add}
7
7
  #
8
8
  # @api public
9
- module LegacyFacter
9
+ module Facter
10
10
  module Util
11
11
  class Fact
12
12
  # The name of the fact
@@ -201,7 +201,7 @@ module LegacyFacter
201
201
  when :simple
202
202
  resolve = Facter::Util::Resolution.new(resolution_name, self)
203
203
  when :aggregate
204
- resolve = LegacyFacter::Core::Aggregate.new(resolution_name, self)
204
+ resolve = Facter::Core::Aggregate.new(resolution_name, self)
205
205
  else
206
206
  raise ArgumentError,
207
207
  "Expected resolution type to be one of (:simple, :aggregate) but was #{resolution_type}"
@@ -38,7 +38,7 @@ module Facter
38
38
  attr_accessor :name
39
39
 
40
40
  # @!attribute [r] fact
41
- # @return [LegacyFacter::Util::Fact]
41
+ # @return [Facter::Util::Fact]
42
42
  # @api private
43
43
  attr_reader :fact
44
44
 
@@ -115,7 +115,7 @@ module Facter
115
115
  def setcode(string = nil, &block)
116
116
  if string
117
117
  @code = proc do
118
- output = LegacyFacter::Core::Execution.execute(string, on_fail: nil)
118
+ output = Facter::Core::Execution.execute(string, on_fail: nil)
119
119
  if output.nil? || output.empty?
120
120
  nil
121
121
  else
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pathname'
4
+ require_relative 'util/api_debugger' if ENV['API_DEBUG']
4
5
 
5
6
  ROOT_DIR = Pathname.new(File.expand_path('..', __dir__)) unless defined?(ROOT_DIR)
6
7
 
@@ -24,7 +25,7 @@ module Facter
24
25
  # Alias method for Facter.fact()
25
26
  # @param name [string] fact name
26
27
  #
27
- # @return [LegacyFacter::Util::Fact, nil] The fact object, or nil if no fact
28
+ # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact
28
29
  # is found.
29
30
  #
30
31
  # @api public
@@ -39,7 +40,7 @@ module Facter
39
40
  # supplied here
40
41
  # @param block [Proc] a block defining a fact resolution
41
42
  #
42
- # @return [LegacyFacter::Util::Fact] the fact object, which includes any previously
43
+ # @return [Facter::Util::Fact] the fact object, which includes any previously
43
44
  # defined resolutions
44
45
  #
45
46
  # @api public
@@ -114,7 +115,7 @@ module Facter
114
115
  #
115
116
  # @param name [String] the name of the fact
116
117
  #
117
- # @return [LegacyFacter::Util::Fact, nil] The fact object, or nil if no fact
118
+ # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact
118
119
  # is found.
119
120
  #
120
121
  # @api public
@@ -192,7 +193,7 @@ module Facter
192
193
  log_blocked_facts
193
194
 
194
195
  resolved_facts = Facter::FactManager.instance.resolve_facts
195
- CacheManager.invalidate_all_caches
196
+ SessionCache.invalidate_all_caches
196
197
  FactCollection.new.build_fact_collection!(resolved_facts)
197
198
  end
198
199
 
@@ -250,7 +251,7 @@ module Facter
250
251
  log_blocked_facts
251
252
 
252
253
  resolved_facts = Facter::FactManager.instance.resolve_facts(args)
253
- CacheManager.invalidate_all_caches
254
+ SessionCache.invalidate_all_caches
254
255
  fact_formatter = Facter::FormatterFactory.build(@options)
255
256
 
256
257
  status = error_check(args, resolved_facts)
@@ -288,7 +289,7 @@ module Facter
288
289
  @options.refresh([user_query])
289
290
  user_query = user_query.to_s
290
291
  resolved_facts = Facter::FactManager.instance.resolve_facts([user_query])
291
- CacheManager.invalidate_all_caches
292
+ SessionCache.invalidate_all_caches
292
293
  fact_collection = FactCollection.new.build_fact_collection!(resolved_facts)
293
294
  splitted_user_query = Facter::Utils.split_user_query(user_query)
294
295
 
@@ -369,5 +370,7 @@ module Facter
369
370
  )
370
371
  nil
371
372
  end
373
+
374
+ prepend ApiDebugger if ENV['API_DEBUG']
372
375
  end
373
376
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Aix
5
+ class Mountpoints
6
+ FACT_NAME = 'mountpoints'
7
+
8
+ def call_the_resolver
9
+ mountpoints = Facter::Resolvers::Aix::Mountpoints.resolve(:mountpoints)
10
+
11
+ Facter::ResolvedFact.new(FACT_NAME, mountpoints)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -9,20 +9,29 @@ module Facts
9
9
  ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze
10
10
 
11
11
  def call_the_resolver
12
- fact_value = Facter::Resolvers::LsbRelease.resolve(:release)
12
+ fact_value = determine_release_for_os
13
+
13
14
  return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value
14
15
 
15
16
  versions = fact_value.split('.')
16
- release = {
17
- 'full' => fact_value,
18
- 'major' => versions[0],
19
- 'minor' => versions[1]
20
- }
17
+ release = { 'full' => fact_value, 'major' => versions[0], 'minor' => versions[1].gsub(/^0([1-9])/, '\1') }
21
18
 
22
19
  [Facter::ResolvedFact.new(FACT_NAME, release),
23
20
  Facter::ResolvedFact.new(ALIASES[0], fact_value, :legacy),
24
- Facter::ResolvedFact.new(ALIASES[1], versions[0], :legacy),
25
- Facter::ResolvedFact.new(ALIASES[2], versions[1], :legacy)]
21
+ Facter::ResolvedFact.new(ALIASES[1], release['major'], :legacy),
22
+ Facter::ResolvedFact.new(ALIASES[2], release['minor'], :legacy)]
23
+ end
24
+
25
+ private
26
+
27
+ def determine_release_for_os
28
+ os_name = Facter::Resolvers::OsRelease.resolve(:name)
29
+
30
+ if os_name =~ /Debian|Raspbian/
31
+ Facter::Resolvers::DebianVersion.resolve(:version)
32
+ else
33
+ Facter::Resolvers::OsRelease.resolve(:version_id)
34
+ end
26
35
  end
27
36
  end
28
37
  end
@@ -8,7 +8,7 @@ module Facts
8
8
  ALIASES = 'operatingsystem'
9
9
 
10
10
  def call_the_resolver
11
- fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id)
11
+ fact_value = Facter::Resolvers::OsRelease.resolve(:name)
12
12
 
13
13
  [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
14
14
  end
@@ -8,7 +8,7 @@ module Facts
8
8
  ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze
9
9
 
10
10
  def call_the_resolver
11
- fact_value = Facter::Resolvers::LsbRelease.resolve(:release)
11
+ fact_value = determine_release_for_os
12
12
 
13
13
  return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value
14
14
 
@@ -16,13 +16,25 @@ module Facts
16
16
  release = {
17
17
  'full' => fact_value,
18
18
  'major' => versions[0],
19
- 'minor' => versions[1]
19
+ 'minor' => versions[1].gsub(/^0([1-9])/, '\1')
20
20
  }
21
21
 
22
22
  [Facter::ResolvedFact.new(FACT_NAME, release),
23
23
  Facter::ResolvedFact.new(ALIASES.first, versions[0], :legacy),
24
24
  Facter::ResolvedFact.new(ALIASES.last, fact_value, :legacy)]
25
25
  end
26
+
27
+ private
28
+
29
+ def determine_release_for_os
30
+ os_name = Facter::Resolvers::OsRelease.resolve(:name)
31
+
32
+ if os_name =~ /Debian|Raspbian/
33
+ Facter::Resolvers::DebianVersion.resolve(:version)
34
+ else
35
+ Facter::Resolvers::OsRelease.resolve(:version_id)
36
+ end
37
+ end
26
38
  end
27
39
  end
28
40
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Debian
5
+ class Partitions
6
+ FACT_NAME = 'partitions'
7
+
8
+ def call_the_resolver
9
+ Facter::ResolvedFact.new(FACT_NAME, partitions)
10
+ end
11
+
12
+ def partitions
13
+ parts = Facter::Resolvers::Partitions.resolve(:partitions)
14
+ mountpoints = Facter::Resolvers::Linux::Mountpoints.resolve(:mountpoints)
15
+ return parts unless mountpoints
16
+
17
+ mountpoints.each do |mnt|
18
+ next unless parts[mnt[:device]]
19
+
20
+ parts[mnt[:device]].merge!(mount: mnt[:path])
21
+ end
22
+ parts.empty? ? nil : parts
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module El
5
+ class Partitions
6
+ FACT_NAME = 'partitions'
7
+
8
+ def call_the_resolver
9
+ Facter::ResolvedFact.new(FACT_NAME, partitions)
10
+ end
11
+
12
+ def partitions
13
+ parts = Facter::Resolvers::Partitions.resolve(:partitions)
14
+ mountpoints = Facter::Resolvers::Linux::Mountpoints.resolve(:mountpoints)
15
+ return parts unless mountpoints
16
+
17
+ mountpoints.each do |mnt|
18
+ next unless parts[mnt[:device]]
19
+
20
+ parts[mnt[:device]].merge!(mount: mnt[:path])
21
+ end
22
+ parts.empty? ? nil : parts
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facts
4
+ module Sles
5
+ class Partitions
6
+ FACT_NAME = 'partitions'
7
+
8
+ def call_the_resolver
9
+ Facter::ResolvedFact.new(FACT_NAME, partitions)
10
+ end
11
+
12
+ def partitions
13
+ parts = Facter::Resolvers::Partitions.resolve(:partitions)
14
+ mountpoints = Facter::Resolvers::Linux::Mountpoints.resolve(:mountpoints)
15
+ return parts unless mountpoints
16
+
17
+ mountpoints.each do |mnt|
18
+ next unless parts[mnt[:device]]
19
+
20
+ parts[mnt[:device]].merge!(mount: mnt[:path])
21
+ end
22
+ parts.empty? ? nil : parts
23
+ end
24
+ end
25
+ end
26
+ end