facter 4.0.36 → 4.0.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/bin/facter +3 -4
  3. data/lib/facter.rb +163 -23
  4. data/lib/facter/custom_facts/core/execution/base.rb +36 -6
  5. data/lib/facter/custom_facts/util/directory_loader.rb +10 -2
  6. data/lib/facter/custom_facts/util/fact.rb +4 -1
  7. data/lib/facter/facts/aix/disks.rb +1 -1
  8. data/lib/facter/facts/aix/kernel.rb +1 -1
  9. data/lib/facter/facts/aix/kernelmajversion.rb +1 -1
  10. data/lib/facter/facts/aix/kernelrelease.rb +1 -1
  11. data/lib/facter/facts/aix/kernelversion.rb +1 -1
  12. data/lib/facter/facts/aix/os/release.rb +1 -1
  13. data/lib/facter/facts/linux/cloud.rb +15 -0
  14. data/lib/facter/facts/linux/disks.rb +1 -1
  15. data/lib/facter/facts/linux/ec2_metadata.rb +5 -27
  16. data/lib/facter/facts/linux/ec2_userdata.rb +5 -27
  17. data/lib/facter/facts/linux/is_virtual.rb +7 -46
  18. data/lib/facter/facts/linux/partitions.rb +1 -1
  19. data/lib/facter/facts/linux/virtual.rb +3 -58
  20. data/lib/facter/facts/rhel/os/release.rb +2 -2
  21. data/lib/facter/facts/solaris/disks.rb +1 -1
  22. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +23 -0
  23. data/lib/facter/facts_utils/virtual_detector.rb +78 -0
  24. data/lib/facter/framework/benchmarking/timer.rb +23 -0
  25. data/lib/facter/framework/cli/cli.rb +86 -34
  26. data/lib/facter/framework/cli/cli_launcher.rb +34 -38
  27. data/lib/facter/framework/config/fact_groups.rb +36 -2
  28. data/lib/facter/framework/core/cache_manager.rb +30 -18
  29. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +2 -1
  30. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +14 -11
  31. data/lib/facter/framework/core/fact_loaders/internal_fact_loader.rb +7 -7
  32. data/lib/facter/framework/core/file_loader.rb +2 -0
  33. data/lib/facter/framework/core/options/config_file_options.rb +5 -3
  34. data/lib/facter/framework/core/options/option_store.rb +30 -11
  35. data/lib/facter/framework/core/session_cache.rb +1 -4
  36. data/lib/facter/framework/logging/logger.rb +3 -11
  37. data/lib/facter/patches/sysfilesystem/sys/statvfs.rb +92 -0
  38. data/lib/facter/resolvers/aio_agent_version.rb +0 -1
  39. data/lib/facter/resolvers/aix/architecture_resolver.rb +0 -1
  40. data/lib/facter/resolvers/aix/disks.rb +2 -3
  41. data/lib/facter/resolvers/aix/filesystem_resolver.rb +0 -1
  42. data/lib/facter/resolvers/aix/hardware_resolver.rb +0 -1
  43. data/lib/facter/resolvers/aix/load_averages_resolver.rb +0 -1
  44. data/lib/facter/resolvers/aix/memory.rb +2 -3
  45. data/lib/facter/resolvers/aix/mountpoints.rb +0 -1
  46. data/lib/facter/resolvers/aix/networking_resolver.rb +0 -1
  47. data/lib/facter/resolvers/aix/nim.rb +0 -1
  48. data/lib/facter/resolvers/aix/os_level.rb +27 -0
  49. data/lib/facter/resolvers/aix/partitions.rb +2 -3
  50. data/lib/facter/resolvers/aix/processors.rb +0 -1
  51. data/lib/facter/resolvers/aix/serialnumber.rb +0 -1
  52. data/lib/facter/resolvers/augeas_resolver.rb +0 -1
  53. data/lib/facter/resolvers/base_resolver.rb +9 -4
  54. data/lib/facter/resolvers/bsd/processors.rb +0 -1
  55. data/lib/facter/resolvers/cloud.rb +39 -0
  56. data/lib/facter/resolvers/containers.rb +0 -1
  57. data/lib/facter/resolvers/debian_version.rb +0 -1
  58. data/lib/facter/resolvers/disk_resolver.rb +0 -1
  59. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  60. data/lib/facter/resolvers/dmi_resolver.rb +0 -1
  61. data/lib/facter/resolvers/ec2.rb +0 -1
  62. data/lib/facter/resolvers/eos_release_resolver.rb +0 -1
  63. data/lib/facter/resolvers/facterversion_resolver.rb +0 -1
  64. data/lib/facter/resolvers/filesystems_resolver.rb +0 -1
  65. data/lib/facter/resolvers/fips_enabled_resolver.rb +0 -1
  66. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +0 -1
  67. data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +0 -1
  68. data/lib/facter/resolvers/freebsd/geom_resolver.rb +0 -1
  69. data/lib/facter/resolvers/freebsd/processors.rb +0 -1
  70. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +0 -1
  71. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +0 -1
  72. data/lib/facter/resolvers/gce.rb +0 -1
  73. data/lib/facter/resolvers/hostname_resolver.rb +0 -1
  74. data/lib/facter/resolvers/identity_resolver.rb +0 -1
  75. data/lib/facter/resolvers/linux/docker_uptime.rb +0 -1
  76. data/lib/facter/resolvers/linux/load_averages.rb +0 -1
  77. data/lib/facter/resolvers/load_averages.rb +0 -1
  78. data/lib/facter/resolvers/lpar_resolver.rb +0 -1
  79. data/lib/facter/resolvers/lsb_release_resolver.rb +0 -1
  80. data/lib/facter/resolvers/lspci.rb +0 -1
  81. data/lib/facter/resolvers/macosx/dmi_resolver.rb +0 -1
  82. data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -6
  83. data/lib/facter/resolvers/macosx/load_averages_resolver.rb +0 -1
  84. data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +3 -3
  85. data/lib/facter/resolvers/macosx/processor_resolver.rb +0 -1
  86. data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +0 -1
  87. data/lib/facter/resolvers/macosx/system_memory_resolver.rb +0 -1
  88. data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +0 -1
  89. data/lib/facter/resolvers/memory_resolver.rb +6 -2
  90. data/lib/facter/resolvers/mountpoints_resolver.rb +0 -1
  91. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -2
  92. data/lib/facter/resolvers/networking_resolver.rb +0 -1
  93. data/lib/facter/resolvers/open_vz.rb +0 -1
  94. data/lib/facter/resolvers/os_release_resolver.rb +0 -1
  95. data/lib/facter/resolvers/partitions.rb +37 -2
  96. data/lib/facter/resolvers/path_resolver.rb +0 -1
  97. data/lib/facter/resolvers/processors_resolver.rb +0 -1
  98. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -1
  99. data/lib/facter/resolvers/redhat_release_resolver.rb +0 -1
  100. data/lib/facter/resolvers/ruby_resolver.rb +0 -1
  101. data/lib/facter/resolvers/selinux_resolver.rb +0 -1
  102. data/lib/facter/resolvers/solaris/disks.rb +0 -1
  103. data/lib/facter/resolvers/solaris/dmi.rb +0 -1
  104. data/lib/facter/resolvers/solaris/dmi_sparc.rb +0 -1
  105. data/lib/facter/resolvers/solaris/filesystems.rb +0 -1
  106. data/lib/facter/resolvers/solaris/ipaddress.rb +0 -1
  107. data/lib/facter/resolvers/solaris/ldom.rb +0 -1
  108. data/lib/facter/resolvers/solaris/memory.rb +0 -1
  109. data/lib/facter/resolvers/solaris/networking.rb +0 -1
  110. data/lib/facter/resolvers/solaris/os_release.rb +0 -1
  111. data/lib/facter/resolvers/solaris/processors.rb +0 -1
  112. data/lib/facter/resolvers/solaris/zone.rb +0 -1
  113. data/lib/facter/resolvers/solaris/zone_name.rb +0 -1
  114. data/lib/facter/resolvers/ssh_resolver.rb +0 -1
  115. data/lib/facter/resolvers/suse_release_resolver.rb +0 -1
  116. data/lib/facter/resolvers/sw_vers_resolver.rb +0 -1
  117. data/lib/facter/resolvers/timezone_resolver.rb +0 -1
  118. data/lib/facter/resolvers/uname_resolver.rb +0 -1
  119. data/lib/facter/resolvers/uptime_resolver.rb +0 -1
  120. data/lib/facter/resolvers/utils/filesystem_helper.rb +3 -1
  121. data/lib/facter/resolvers/virt_what.rb +0 -1
  122. data/lib/facter/resolvers/vmware.rb +0 -1
  123. data/lib/facter/resolvers/windows/aio_agent_version.rb +0 -1
  124. data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +0 -1
  125. data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +0 -1
  126. data/lib/facter/resolvers/windows/fips_resolver.rb +0 -1
  127. data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +0 -1
  128. data/lib/facter/resolvers/windows/identity_resolver.rb +0 -1
  129. data/lib/facter/resolvers/windows/kernel_resolver.rb +0 -1
  130. data/lib/facter/resolvers/windows/memory_resolver.rb +0 -1
  131. data/lib/facter/resolvers/windows/netkvm_resolver.rb +0 -1
  132. data/lib/facter/resolvers/windows/networking_resolver.rb +0 -1
  133. data/lib/facter/resolvers/windows/processors_resolver.rb +0 -1
  134. data/lib/facter/resolvers/windows/product_release_resolver.rb +0 -1
  135. data/lib/facter/resolvers/windows/ssh.rb +0 -1
  136. data/lib/facter/resolvers/windows/system32_resolver.rb +0 -1
  137. data/lib/facter/resolvers/windows/uptime_resolver.rb +0 -1
  138. data/lib/facter/resolvers/windows/virtualization_resolver.rb +0 -1
  139. data/lib/facter/resolvers/windows/win_os_description_resolver.rb +0 -1
  140. data/lib/facter/resolvers/wpar_resolver.rb +0 -1
  141. data/lib/facter/resolvers/xen.rb +0 -1
  142. data/lib/facter/resolvers/zfs.rb +0 -1
  143. data/lib/facter/resolvers/zpool.rb +0 -1
  144. data/lib/facter/version.rb +1 -1
  145. metadata +9 -4
  146. data/lib/facter/resolvers/aix/os_level_resolver.rb +0 -26
  147. data/lib/facter/resolvers/os_level_resolver.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ceb625b0a349be8f5f574055b24aebd9860672ccdfc27224377a75255681b571
4
- data.tar.gz: 1081225dee1a50781041d65599bc74fccf1552fe1ce75a9195f0aecd8608afb8
3
+ metadata.gz: c21fc41638fbbab14ccb415eec2104ed296236c98d7870a341c37742796c8fc1
4
+ data.tar.gz: 7b09bdc7ecc99e1947d9eb5bcacb7873f3b954224904d0930ee69846c47d5e88
5
5
  SHA512:
6
- metadata.gz: 0c31f37ed2064c1683e9f56a5d252bab225e1af0c0df025d1621ef89551fefa6a0816cc3862d4c98ab2480a6e158f62b18bcf0d5ae9f2d75f22799297660ffc9
7
- data.tar.gz: d6f071e0bf9bcdf01c460ea7ac45d0cb50459c4a40e663761cf7c58de0068b6c9e444cebedd5304a692317a960a8d1327accea35f6815b90076e4acc4ce2ec3b
6
+ metadata.gz: 327664693c0725ab4aafc339e6091557dc00d2dee945a9f6d6f3bca5d3a6d1ab8b56809c5d9b7374029fcd277a8bc5107ff76a03522c9104e214f4c967417a04
7
+ data.tar.gz: 2d60b83c461d1bcdaa611322061f844f186951341562b5a3ec83d35512d58059776a5772b41bdf97b2cb77c2fb53abd2a744f9bddc49042b6d421868411c010a
data/bin/facter CHANGED
@@ -4,8 +4,7 @@
4
4
  require 'pathname'
5
5
  require 'facter/framework/cli/cli_launcher.rb'
6
6
 
7
- cli_launcher = CliLauncher.new(ARGV)
7
+ Facter::OptionsValidator.validate(ARGV)
8
+ processed_arguments = CliLauncher.prepare_arguments(ARGV)
8
9
 
9
- cli_launcher.validate_options
10
- cli_launcher.prepare_arguments
11
- cli_launcher.start
10
+ CliLauncher.start(processed_arguments)
@@ -13,8 +13,31 @@ module Facter
13
13
  Options.init
14
14
  Log.output(STDOUT)
15
15
  @already_searched = {}
16
+ @debug_once = []
17
+ @warn_once = []
16
18
 
17
19
  class << self
20
+ def resolve(args_as_string)
21
+ require 'facter/framework/cli/cli_launcher'
22
+
23
+ args = args_as_string.split(' ')
24
+
25
+ Facter::OptionsValidator.validate(args)
26
+ processed_arguments = CliLauncher.prepare_arguments(args, nil)
27
+
28
+ cli = Facter::Cli.new([], processed_arguments)
29
+
30
+ if cli.args.include?(:version)
31
+ cli.invoke(:version, [])
32
+ elsif cli.args.include?('--list-cache-groups')
33
+ cli.invoke(:list_cache_groups, [])
34
+ elsif cli.args.include?('--list-block-groups')
35
+ cli.invoke(:list_block_groups, [])
36
+ else
37
+ cli.invoke(:arg_parser)
38
+ end
39
+ end
40
+
18
41
  def clear_messages
19
42
  logger.debug('clear_messages is not implemented')
20
43
  end
@@ -54,6 +77,8 @@ module Facter
54
77
  # @api public
55
78
  def clear
56
79
  @already_searched = {}
80
+ @debug_once = []
81
+ @warn_once = []
57
82
  LegacyFacter.clear
58
83
  Options[:custom_dir] = []
59
84
  LegacyFacter.collection.invalidate_custom_facts
@@ -68,24 +93,54 @@ module Facter
68
93
  fact_collection.dig(*splitted_user_query)
69
94
  end
70
95
 
71
- # Prints out a debug message when debug option is set to true
72
- # @param msg [String] Message to be printed out
96
+ # Logs debug message when debug option is set to true
97
+ # @param message [Object] Message object to be logged
98
+ #
99
+ # @return [nil]
100
+ #
101
+ # @api public
102
+ def debug(message)
103
+ return unless debugging?
104
+
105
+ logger.debug(message.to_s)
106
+ nil
107
+ end
108
+
109
+ # Logs the same debug message only once when debug option is set to true
110
+ # @param message [Object] Message object to be logged
73
111
  #
74
112
  # @return [nil]
75
113
  #
76
114
  # @api public
77
- def debug(msg)
115
+ def debugonce(message)
78
116
  return unless debugging?
79
117
 
80
- logger.debug(msg)
118
+ message_string = message.to_s
119
+ return if @debug_once.include? message_string
120
+
121
+ @debug_once << message_string
122
+ logger.debug(message_string)
81
123
  nil
82
124
  end
83
125
 
126
+ # Define a new fact or extend an existing fact.
127
+ #
128
+ # @param name [Symbol] The name of the fact to define
129
+ # @param options [Hash] A hash of options to set on the fact
130
+ #
131
+ # @return [Facter::Util::Fact] The fact that was defined
132
+ #
133
+ # @api public
134
+ def define_fact(name, options = {}, &block)
135
+ options[:fact_type] = :custom
136
+ LegacyFacter.define_fact(name, options, &block)
137
+ end
138
+
84
139
  def on_message(&block)
85
140
  Facter::Log.on_message(&block)
86
141
  end
87
142
 
88
- # Check whether debuging is enabled
143
+ # Check whether debugging is enabled
89
144
  #
90
145
  # @return [bool]
91
146
  #
@@ -104,11 +159,31 @@ module Facter
104
159
  Facter::Options[:debug] = debug_bool
105
160
  end
106
161
 
162
+ # Iterates over fact names and values
163
+ #
164
+ # @yieldparam [String] name the fact name
165
+ # @yieldparam [String] value the current value of the fact
166
+ #
167
+ # @return [Facter]
168
+ #
169
+ # @api public
170
+ def each
171
+ log_blocked_facts
172
+ resolved_facts = Facter::FactManager.instance.resolve_facts
173
+ SessionCache.invalidate_all_caches
174
+
175
+ resolved_facts.each do |fact|
176
+ yield(fact.name, fact.value)
177
+ end
178
+
179
+ self
180
+ end
181
+
107
182
  # Returns a fact object by name. If you use this, you still have to
108
183
  # call {Facter::Util::Fact#value `value`} on it to retrieve the actual
109
184
  # value.
110
185
  #
111
- # @param name [String] the name of the fact
186
+ # @param user_query [String] the name of the fact
112
187
  #
113
188
  # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact
114
189
  # is found.
@@ -134,6 +209,16 @@ module Facter
134
209
  nil
135
210
  end
136
211
 
212
+ # Loads all facts
213
+ #
214
+ # @return [nil]
215
+ #
216
+ # @api public
217
+ def loadfacts
218
+ LegacyFacter.loadfacts
219
+ nil
220
+ end
221
+
137
222
  # Register directories to be searched for custom facts. The registered directories
138
223
  # must be absolute paths or they will be ignored.
139
224
  #
@@ -199,7 +284,7 @@ module Facter
199
284
  end
200
285
 
201
286
  # Enable or disable trace
202
- # @param debug_bool [bool] Set trace on debug state
287
+ # @param bool [bool] Set trace on debug state
203
288
  #
204
289
  # @return [type] [description]
205
290
  #
@@ -210,7 +295,7 @@ module Facter
210
295
 
211
296
  # Gets the value for a fact. Returns `nil` if no such fact exists.
212
297
  #
213
- # @param name [String] the fact name
298
+ # @param user_query [String] the fact name
214
299
  # @return [String] the value of the fact, or nil if no fact is found
215
300
  #
216
301
  # @api public
@@ -220,6 +305,18 @@ module Facter
220
305
  @already_searched[user_query]&.value
221
306
  end
222
307
 
308
+ def values(options, user_queries)
309
+ init_cli_options(options, user_queries)
310
+ resolved_facts = Facter::FactManager.instance.resolve_facts(user_queries)
311
+ Facter::SessionCache.invalidate_all_caches
312
+
313
+ if user_queries.count.zero?
314
+ Facter::FactCollection.new.build_fact_collection!(resolved_facts)
315
+ else
316
+ FormatterHelper.retrieve_facts_to_display_for_user_query(user_queries, resolved_facts)
317
+ end
318
+ end
319
+
223
320
  # Returns Facter version
224
321
  #
225
322
  # @return [String] Current version
@@ -247,23 +344,67 @@ module Facter
247
344
  [fact_formatter.format(resolved_facts), status || 0]
248
345
  end
249
346
 
250
- def log_exception(exception, message = :default)
251
- arr = []
252
- if message == :default
253
- arr << exception.message
254
- elsif message
255
- arr << message
256
- end
257
- if Options[:trace]
258
- arr << 'backtrace:'
259
- arr.concat(exception.backtrace)
260
- end
347
+ def log_exception(exception, message = nil)
348
+ error_message = []
349
+
350
+ error_message << message.to_s unless message.nil? || (message.is_a?(String) && message.empty?)
261
351
 
262
- logger.error(arr.flatten.join("\n"))
352
+ parse_exception(exception, error_message)
353
+ logger.error(error_message.flatten.join("\n"))
354
+ end
355
+
356
+ # Returns a list with the names of all solved facts
357
+ #
358
+ # @return [Array] the list with all the fact names
359
+ #
360
+ # @api public
361
+ def list
362
+ to_hash.keys.sort
363
+ end
364
+
365
+ # Logs the message parameter as a warning.
366
+ #
367
+ # @param message [Object] the warning object to be displayed
368
+ #
369
+ # @return [nil]
370
+ #
371
+ # @api public
372
+ def warn(message)
373
+ logger.warn(message.to_s)
374
+ nil
375
+ end
376
+
377
+ # Logs only once the same warning message.
378
+ #
379
+ # @param message [Object] the warning message object
380
+ #
381
+ # @return [nil]
382
+ #
383
+ # @api public
384
+ def warnonce(message)
385
+ message_string = message.to_s
386
+ return if @warn_once.include? message_string
387
+
388
+ @warn_once << message_string
389
+ logger.warn(message_string)
390
+ nil
263
391
  end
264
392
 
265
393
  private
266
394
 
395
+ def parse_exception(exception, error_message)
396
+ if exception.is_a?(Exception)
397
+ error_message << exception.message if error_message.empty?
398
+
399
+ if Options[:trace] && !exception.backtrace.nil?
400
+ error_message << 'backtrace:'
401
+ error_message.concat(exception.backtrace)
402
+ end
403
+ elsif error_message.empty?
404
+ error_message << exception.to_s
405
+ end
406
+ end
407
+
267
408
  def logger
268
409
  @logger ||= Log.new(self)
269
410
  end
@@ -303,10 +444,9 @@ module Facter
303
444
  # Returns exit status when user query contains facts that do
304
445
  # not exist
305
446
  #
306
- # @param dirs [Array] Arguments sent to CLI
307
- # @param dirs [Array] List of resolved facts
447
+ # @param resolved_facts [Array] List of resolved facts
308
448
  #
309
- # @return [Integer, nil] Will return status 1 if user query contains
449
+ # @return [1/nil] Will return status 1 if user query contains
310
450
  # facts that are not found or resolved, otherwise it will return nil
311
451
  #
312
452
  # @api private
@@ -6,6 +6,10 @@ module Facter
6
6
  class Base
7
7
  STDERR_MESSAGE = 'Command %s resulted with the following stderr message: %s'
8
8
 
9
+ def initialize
10
+ @log = Log.new(self)
11
+ end
12
+
9
13
  # This is part of the public API. No race condition can happen
10
14
  # here because custom facts are executed sequentially
11
15
  def with_env(values)
@@ -36,9 +40,7 @@ module Facter
36
40
  end
37
41
 
38
42
  def execute(command, options = {})
39
- on_fail = options.fetch(:on_fail, :raise)
40
- expand = options.fetch(:expand, true)
41
- logger = options[:logger]
43
+ on_fail, expand, logger, time_limit = extract_options(options)
42
44
 
43
45
  expanded_command = if !expand && builtin_command?(command) || logger
44
46
  command
@@ -55,11 +57,21 @@ module Facter
55
57
  return on_fail
56
58
  end
57
59
 
58
- execute_command(expanded_command, on_fail, logger)
60
+ execute_command(expanded_command, on_fail, logger, time_limit)
59
61
  end
60
62
 
61
63
  private
62
64
 
65
+ def extract_options(options)
66
+ on_fail = options.fetch(:on_fail, :raise)
67
+ expand = options.fetch(:expand, true)
68
+ logger = options[:logger]
69
+ time_limit = options[:limit].to_i
70
+ time_limit = time_limit.positive? ? time_limit : nil
71
+
72
+ [on_fail, expand, logger, time_limit]
73
+ end
74
+
63
75
  def log_stderr(msg, command, logger)
64
76
  return if !msg || msg.empty?
65
77
 
@@ -77,12 +89,30 @@ module Facter
77
89
  output.chomp =~ /builtin/ ? true : false
78
90
  end
79
91
 
80
- def execute_command(command, on_fail, logger = nil)
92
+ def execute_command(command, on_fail, logger = nil, time_limit = nil)
93
+ time_limit ||= 1.5
81
94
  begin
82
95
  # Set LC_ALL and LANG to force i18n to C for the duration of this exec;
83
96
  # this ensures that any code that parses the
84
97
  # output of the command can expect it to be in a consistent / predictable format / locale
85
- out, stderr, _status_ = Open3.capture3({ 'LC_ALL' => 'C', 'LANG' => 'C' }, command.to_s)
98
+ opts = { 'LC_ALL' => 'C', 'LANG' => 'C' }
99
+ require 'timeout'
100
+ @log.debug("Executing command: #{command}")
101
+ out, stderr = Open3.popen3(opts, command.to_s) do |_, stdout, stderr, wait_thr|
102
+ pid = wait_thr.pid
103
+ output = +''
104
+ err = +''
105
+ begin
106
+ Timeout.timeout(time_limit) do
107
+ output << stdout.read
108
+ err << stderr.read
109
+ end
110
+ rescue Timeout::Error
111
+ @log.debug("Timeout encounter after #{time_limit}s, killing process with pid: #{pid}")
112
+ Process.kill('KILL', pid)
113
+ end
114
+ [output, err]
115
+ end
86
116
  log_stderr(stderr, command, logger)
87
117
  rescue StandardError => e
88
118
  return '' if logger
@@ -59,7 +59,7 @@ module LegacyFacter
59
59
  basename = File.basename(file)
60
60
  next if file_blocked?(basename)
61
61
 
62
- if facts.find { |f| f.name == basename } && cm.group_cached?(basename)
62
+ if facts.find { |f| f.name == basename } && cm.fact_cache_enabled?(basename)
63
63
  Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\
64
64
  'there are at least two external facts files with the same filename'))
65
65
  else
@@ -84,7 +84,7 @@ module LegacyFacter
84
84
  parser = LegacyFacter::Util::Parser.parser_for(fact.file)
85
85
  next if parser.nil?
86
86
 
87
- data = parser.results
87
+ data = resolve_fact(fact, parser)
88
88
 
89
89
  if data == false
90
90
  LegacyFacter.warn "Could not interpret fact file #{fact.file}"
@@ -99,6 +99,14 @@ module LegacyFacter
99
99
  end
100
100
  end
101
101
 
102
+ def resolve_fact(fact, parser)
103
+ data = nil
104
+ fact_name = File.basename(fact.file)
105
+ Facter::Framework::Benchmarking::Timer.measure(fact_name) { data = parser.results }
106
+
107
+ data
108
+ end
109
+
102
110
  def entries
103
111
  dirs = @directories.select { |directory| File.directory?(directory) }.map do |directory|
104
112
  Dir.entries(directory).map { |directory_entry| File.join(directory, directory_entry) }
@@ -118,7 +118,10 @@ module Facter
118
118
 
119
119
  searching do
120
120
  suitable_resolutions = sort_by_weight(find_suitable_resolutions(@resolves))
121
- @value = find_first_real_value(suitable_resolutions)
121
+
122
+ Facter::Framework::Benchmarking::Timer.measure(@name) do
123
+ @value = find_first_real_value(suitable_resolutions)
124
+ end
122
125
 
123
126
  announce_when_no_suitable_resolution(suitable_resolutions)
124
127
  announce_when_no_value_found(@value)
@@ -24,7 +24,7 @@ module Facts
24
24
 
25
25
  def add_legacy_facts(disks, facts)
26
26
  disks.each do |disk_name, disk_info|
27
- facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_size", disk_info[:size_bytes].to_s, :legacy))
27
+ facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_size", disk_info[:size_bytes], :legacy))
28
28
  end
29
29
  end
30
30
  end
@@ -6,7 +6,7 @@ module Facts
6
6
  FACT_NAME = 'kernel'
7
7
 
8
8
  def call_the_resolver
9
- fact_value = Facter::Resolvers::OsLevel.resolve(:kernel)
9
+ fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:kernel)
10
10
 
11
11
  Facter::ResolvedFact.new(FACT_NAME, fact_value)
12
12
  end
@@ -6,7 +6,7 @@ module Facts
6
6
  FACT_NAME = 'kernelmajversion'
7
7
 
8
8
  def call_the_resolver
9
- fact_value = Facter::Resolvers::OsLevel.resolve(:build)
9
+ fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:build)
10
10
  kernelmajversion = fact_value.split('-')[0]
11
11
 
12
12
  Facter::ResolvedFact.new(FACT_NAME, kernelmajversion)