facter 4.0.35 → 4.0.40

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) 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 +13 -3
  6. data/lib/facter/custom_facts/util/fact.rb +4 -1
  7. data/lib/facter/fact_groups.conf +140 -1
  8. data/lib/facter/facts/aix/disks.rb +17 -2
  9. data/lib/facter/facts/aix/kernel.rb +1 -1
  10. data/lib/facter/facts/aix/kernelmajversion.rb +1 -1
  11. data/lib/facter/facts/aix/kernelrelease.rb +1 -1
  12. data/lib/facter/facts/aix/kernelversion.rb +1 -1
  13. data/lib/facter/facts/aix/networking/scope6.rb +3 -1
  14. data/lib/facter/facts/aix/os/release.rb +1 -1
  15. data/lib/facter/facts/aix/scope6_interfaces.rb +0 -2
  16. data/lib/facter/facts/aix/serialnumber.rb +20 -0
  17. data/lib/facter/facts/aix/sshalgorithmkey.rb +17 -0
  18. data/lib/facter/facts/aix/sshfp_algorithm.rb +20 -0
  19. data/lib/facter/facts/debian/os/distro/release.rb +6 -1
  20. data/lib/facter/facts/freebsd/sshalgorithmkey.rb +17 -0
  21. data/lib/facter/facts/freebsd/sshfp_algorithm.rb +20 -0
  22. data/lib/facter/facts/linux/cloud.rb +15 -0
  23. data/lib/facter/facts/linux/disks.rb +20 -1
  24. data/lib/facter/facts/linux/dmi/board/asset_tag.rb +19 -0
  25. data/lib/facter/facts/linux/ec2_metadata.rb +11 -6
  26. data/lib/facter/facts/linux/ec2_userdata.rb +7 -4
  27. data/lib/facter/facts/linux/gce.rb +16 -0
  28. data/lib/facter/facts/linux/is_virtual.rb +1 -3
  29. data/lib/facter/facts/linux/networking/scope6.rb +3 -1
  30. data/lib/facter/facts/linux/partitions.rb +1 -1
  31. data/lib/facter/facts/linux/processors/speed.rb +17 -0
  32. data/lib/facter/facts/linux/scope6_interfaces.rb +1 -2
  33. data/lib/facter/facts/linux/sshfp_algorithm.rb +1 -1
  34. data/lib/facter/facts/linux/xen.rb +28 -0
  35. data/lib/facter/facts/macosx/networking/scope6.rb +3 -1
  36. data/lib/facter/facts/macosx/scope6_interfaces.rb +0 -2
  37. data/lib/facter/facts/macosx/sshfp_algorithm.rb +1 -1
  38. data/lib/facter/facts/rhel/os/release.rb +2 -2
  39. data/lib/facter/facts/solaris/disks.rb +21 -2
  40. data/lib/facter/facts/solaris/hypervisors/ldom.rb +24 -0
  41. data/lib/facter/facts/solaris/hypervisors/zone.rb +39 -0
  42. data/lib/facter/facts/solaris/is_virtual.rb +64 -0
  43. data/lib/facter/facts/solaris/kernelmajversion.rb +1 -1
  44. data/lib/facter/facts/solaris/ldom.rb +35 -0
  45. data/lib/facter/facts/solaris/sshalgorithmkey.rb +17 -0
  46. data/lib/facter/facts/solaris/sshfp_algorithm.rb +20 -0
  47. data/lib/facter/facts/solaris/virtual.rb +60 -0
  48. data/lib/facter/facts/solaris/zones.rb +1 -1
  49. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +23 -0
  50. data/lib/facter/facts/windows/ec2_metadata.rb +5 -3
  51. data/lib/facter/facts/windows/ec2_userdata.rb +5 -3
  52. data/lib/facter/facts/windows/gce.rb +16 -0
  53. data/lib/facter/facts/windows/networking/scope6.rb +3 -1
  54. data/lib/facter/facts/windows/sshalgorithmkey.rb +22 -0
  55. data/lib/facter/facts/windows/sshfp_algorithm.rb +25 -0
  56. data/lib/facter/facts_utils/facts_utils.rb +2 -0
  57. data/lib/facter/framework/benchmarking/timer.rb +23 -0
  58. data/lib/facter/framework/cli/cli.rb +86 -34
  59. data/lib/facter/framework/cli/cli_launcher.rb +34 -38
  60. data/lib/facter/framework/config/fact_groups.rb +36 -2
  61. data/lib/facter/framework/core/cache_manager.rb +30 -18
  62. data/lib/facter/framework/core/fact/internal/core_fact.rb +2 -0
  63. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +11 -25
  64. data/lib/facter/framework/core/fact_filter.rb +13 -0
  65. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +38 -12
  66. data/lib/facter/framework/core/fact_loaders/internal_fact_loader.rb +7 -7
  67. data/lib/facter/framework/core/file_loader.rb +2 -0
  68. data/lib/facter/framework/core/options/config_file_options.rb +5 -3
  69. data/lib/facter/framework/core/options/option_store.rb +30 -11
  70. data/lib/facter/framework/core/session_cache.rb +1 -4
  71. data/lib/facter/framework/formatters/legacy_fact_formatter.rb +8 -1
  72. data/lib/facter/framework/formatters/yaml_fact_formatter.rb +1 -1
  73. data/lib/facter/framework/logging/logger.rb +3 -11
  74. data/lib/facter/patches/sysfilesystem/sys/statvfs.rb +92 -0
  75. data/lib/facter/resolvers/aio_agent_version.rb +0 -1
  76. data/lib/facter/resolvers/aix/architecture_resolver.rb +0 -1
  77. data/lib/facter/resolvers/aix/disks.rb +2 -3
  78. data/lib/facter/resolvers/aix/filesystem_resolver.rb +0 -1
  79. data/lib/facter/resolvers/aix/hardware_resolver.rb +0 -1
  80. data/lib/facter/resolvers/aix/load_averages_resolver.rb +0 -1
  81. data/lib/facter/resolvers/aix/memory.rb +2 -3
  82. data/lib/facter/resolvers/aix/mountpoints.rb +0 -1
  83. data/lib/facter/resolvers/aix/networking_resolver.rb +0 -1
  84. data/lib/facter/resolvers/aix/nim.rb +0 -1
  85. data/lib/facter/resolvers/aix/os_level.rb +27 -0
  86. data/lib/facter/resolvers/aix/partitions.rb +2 -3
  87. data/lib/facter/resolvers/aix/processors.rb +0 -1
  88. data/lib/facter/resolvers/aix/serialnumber.rb +36 -0
  89. data/lib/facter/resolvers/augeas_resolver.rb +0 -1
  90. data/lib/facter/resolvers/base_resolver.rb +9 -4
  91. data/lib/facter/resolvers/bsd/processors.rb +0 -1
  92. data/lib/facter/resolvers/cloud.rb +39 -0
  93. data/lib/facter/resolvers/containers.rb +0 -1
  94. data/lib/facter/resolvers/debian_version.rb +0 -1
  95. data/lib/facter/resolvers/disk_resolver.rb +0 -1
  96. data/lib/facter/resolvers/dmi_decode.rb +0 -1
  97. data/lib/facter/resolvers/dmi_resolver.rb +4 -4
  98. data/lib/facter/resolvers/ec2.rb +4 -19
  99. data/lib/facter/resolvers/eos_release_resolver.rb +0 -1
  100. data/lib/facter/resolvers/facterversion_resolver.rb +0 -1
  101. data/lib/facter/resolvers/filesystems_resolver.rb +0 -1
  102. data/lib/facter/resolvers/fips_enabled_resolver.rb +0 -1
  103. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +0 -1
  104. data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +0 -1
  105. data/lib/facter/resolvers/freebsd/geom_resolver.rb +0 -1
  106. data/lib/facter/resolvers/freebsd/processors.rb +0 -1
  107. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +0 -1
  108. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +0 -1
  109. data/lib/facter/resolvers/gce.rb +53 -0
  110. data/lib/facter/resolvers/hostname_resolver.rb +0 -1
  111. data/lib/facter/resolvers/identity_resolver.rb +0 -1
  112. data/lib/facter/resolvers/linux/docker_uptime.rb +0 -1
  113. data/lib/facter/resolvers/linux/load_averages.rb +0 -1
  114. data/lib/facter/resolvers/load_averages.rb +0 -1
  115. data/lib/facter/resolvers/lpar_resolver.rb +0 -1
  116. data/lib/facter/resolvers/lsb_release_resolver.rb +0 -1
  117. data/lib/facter/resolvers/lspci.rb +0 -1
  118. data/lib/facter/resolvers/macosx/dmi_resolver.rb +0 -1
  119. data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -6
  120. data/lib/facter/resolvers/macosx/load_averages_resolver.rb +0 -1
  121. data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +3 -3
  122. data/lib/facter/resolvers/macosx/processor_resolver.rb +0 -1
  123. data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +0 -1
  124. data/lib/facter/resolvers/macosx/system_memory_resolver.rb +0 -1
  125. data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +0 -1
  126. data/lib/facter/resolvers/memory_resolver.rb +13 -2
  127. data/lib/facter/resolvers/mountpoints_resolver.rb +0 -1
  128. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -1
  129. data/lib/facter/resolvers/networking_resolver.rb +0 -1
  130. data/lib/facter/resolvers/open_vz.rb +0 -1
  131. data/lib/facter/resolvers/os_release_resolver.rb +0 -1
  132. data/lib/facter/resolvers/partitions.rb +37 -2
  133. data/lib/facter/resolvers/path_resolver.rb +0 -1
  134. data/lib/facter/resolvers/processors_resolver.rb +24 -3
  135. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -1
  136. data/lib/facter/resolvers/redhat_release_resolver.rb +0 -1
  137. data/lib/facter/resolvers/ruby_resolver.rb +0 -1
  138. data/lib/facter/resolvers/selinux_resolver.rb +0 -1
  139. data/lib/facter/resolvers/solaris/disks.rb +0 -1
  140. data/lib/facter/resolvers/solaris/dmi.rb +0 -1
  141. data/lib/facter/resolvers/solaris/dmi_sparc.rb +0 -1
  142. data/lib/facter/resolvers/solaris/filesystems.rb +0 -1
  143. data/lib/facter/resolvers/solaris/ipaddress.rb +0 -1
  144. data/lib/facter/resolvers/solaris/ldom.rb +69 -0
  145. data/lib/facter/resolvers/solaris/memory.rb +0 -1
  146. data/lib/facter/resolvers/solaris/networking.rb +0 -1
  147. data/lib/facter/resolvers/solaris/os_release.rb +0 -1
  148. data/lib/facter/resolvers/solaris/processors.rb +0 -1
  149. data/lib/facter/resolvers/solaris/zone.rb +0 -1
  150. data/lib/facter/resolvers/solaris/zone_name.rb +0 -1
  151. data/lib/facter/resolvers/ssh_resolver.rb +0 -1
  152. data/lib/facter/resolvers/suse_release_resolver.rb +0 -1
  153. data/lib/facter/resolvers/sw_vers_resolver.rb +0 -1
  154. data/lib/facter/resolvers/timezone_resolver.rb +0 -1
  155. data/lib/facter/resolvers/uname_resolver.rb +0 -1
  156. data/lib/facter/resolvers/uptime_resolver.rb +0 -1
  157. data/lib/facter/resolvers/utils/filesystem_helper.rb +3 -1
  158. data/lib/facter/resolvers/utils/http.rb +68 -0
  159. data/lib/facter/resolvers/virt_what.rb +0 -1
  160. data/lib/facter/resolvers/vmware.rb +0 -1
  161. data/lib/facter/resolvers/windows/aio_agent_version.rb +0 -1
  162. data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +0 -1
  163. data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +0 -1
  164. data/lib/facter/resolvers/windows/fips_resolver.rb +0 -1
  165. data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +0 -1
  166. data/lib/facter/resolvers/windows/identity_resolver.rb +0 -1
  167. data/lib/facter/resolvers/windows/kernel_resolver.rb +0 -1
  168. data/lib/facter/resolvers/windows/memory_resolver.rb +0 -1
  169. data/lib/facter/resolvers/windows/netkvm_resolver.rb +0 -1
  170. data/lib/facter/resolvers/windows/networking_resolver.rb +0 -1
  171. data/lib/facter/resolvers/windows/processors_resolver.rb +0 -1
  172. data/lib/facter/resolvers/windows/product_release_resolver.rb +0 -1
  173. data/lib/facter/resolvers/windows/ssh.rb +0 -1
  174. data/lib/facter/resolvers/windows/system32_resolver.rb +0 -1
  175. data/lib/facter/resolvers/windows/uptime_resolver.rb +0 -1
  176. data/lib/facter/resolvers/windows/virtualization_resolver.rb +0 -1
  177. data/lib/facter/resolvers/windows/win_os_description_resolver.rb +0 -1
  178. data/lib/facter/resolvers/wpar_resolver.rb +0 -1
  179. data/lib/facter/resolvers/xen.rb +28 -1
  180. data/lib/facter/resolvers/zfs.rb +0 -1
  181. data/lib/facter/resolvers/zpool.rb +0 -1
  182. data/lib/facter/version.rb +1 -1
  183. metadata +31 -4
  184. data/lib/facter/resolvers/aix/os_level_resolver.rb +0 -26
  185. 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: 310bcaf0123dcbfdc035568dd69e5701204fdd47286c4f1a57cc2cec1bb310f2
4
- data.tar.gz: 1165a5771b7da00ba62b0869b3c951a475466cf99d959090e7ff168565076134
3
+ metadata.gz: 64bb37710d33d522370161fab93516fed5961615ff3fc44609ee6700318efda4
4
+ data.tar.gz: 47e222b78a6a4ce13ee4d0fc91cbcca942b4b3c9357e35debbc2ea61d401867c
5
5
  SHA512:
6
- metadata.gz: e3a8f6a079db9d1ab380205953ea1f325ab4274de480ba49ef4e1d162e6ff3058ee78ac89ef845fb19949806d53d857cc0f8f9ff651d346ff71179a5fd6b682d
7
- data.tar.gz: 0270a90dd9010adc24a61cb00c31b4ebade6847a2d8697d56bef09ea8e66ce6417e7298885bf3c8cd36ccc90917c5ba7e25c0efe81e795b8fd5df90d43c5d308
6
+ metadata.gz: 4bb85c358a104d83fde58ad5ce0733736f5e2295324d1041e79d24c5c08cf284f2eb32c30b9024a5f216713b8a12a92a01249aab0346aec016ebeecc1c77d82f
7
+ data.tar.gz: 2f079a4fc5788d5e4c5698d0b5ad31cfc7affa352b19d636c077faa3125e342ba14e4d1c3d53a1684112cd9a76c27365fe9f2f9713502ea52b8d4ceffd56eee7
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
@@ -35,6 +35,7 @@ module LegacyFacter
35
35
  def initialize(dir = LegacyFacter::Util::Config.external_facts_dirs, weight = EXTERNAL_FACT_WEIGHT)
36
36
  @directories = [dir].flatten
37
37
  @weight = weight
38
+ @log ||= Facter::Log.new(self)
38
39
  end
39
40
 
40
41
  # Load facts from files in fact directory using the relevant parser classes to
@@ -58,7 +59,7 @@ module LegacyFacter
58
59
  basename = File.basename(file)
59
60
  next if file_blocked?(basename)
60
61
 
61
- if facts.find { |f| f.name == basename } && cm.group_cached?(basename)
62
+ if facts.find { |f| f.name == basename } && cm.fact_cache_enabled?(basename)
62
63
  Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\
63
64
  'there are at least two external facts files with the same filename'))
64
65
  else
@@ -83,11 +84,12 @@ module LegacyFacter
83
84
  parser = LegacyFacter::Util::Parser.parser_for(fact.file)
84
85
  next if parser.nil?
85
86
 
86
- data = parser.results
87
+ data = resolve_fact(fact, parser)
88
+
87
89
  if data == false
88
90
  LegacyFacter.warn "Could not interpret fact file #{fact.file}"
89
91
  elsif (data == {}) || data.nil?
90
- LegacyFacter.warn "Fact file #{fact.file} was parsed but returned an empty data set"
92
+ @log.debug("Fact file #{fact.file} was parsed but no key=>value data was returned")
91
93
  else
92
94
  data.each do |p, v|
93
95
  collection.add(p, value: v, fact_type: :external,
@@ -97,6 +99,14 @@ module LegacyFacter
97
99
  end
98
100
  end
99
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
+
100
110
  def entries
101
111
  dirs = @directories.select { |directory| File.directory?(directory) }.map do |directory|
102
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)
@@ -165,5 +165,144 @@
165
165
  "virtual",
166
166
  "is_virtual",
167
167
  "cloud"
168
+ ],
169
+ "legacy": [
170
+ "architecture",
171
+ "augeasversion",
172
+ "bios_release_date",
173
+ "bios_vendor",
174
+ "bios_version",
175
+ "blockdevice_*_model",
176
+ "blockdevice_*_size",
177
+ "blockdevice_*_vendor",
178
+ "blockdevices",
179
+ "boardassettag",
180
+ "boardmanufacturer",
181
+ "boardproductname",
182
+ "boardserialnumber",
183
+ "chassisassettag",
184
+ "chassistype",
185
+ "dhcp_servers",
186
+ "domain",
187
+ "fqdn",
188
+ "gid",
189
+ "hardwareisa",
190
+ "hardwaremodel",
191
+ "hostname",
192
+ "id",
193
+ "interfaces",
194
+ "ipaddress",
195
+ "ipaddress_.*",
196
+ "ipaddress_*",
197
+ "ipaddress6",
198
+ "ipaddress6_.*",
199
+ "ipaddress6_*",
200
+ "ldom_*",
201
+ "lsbdistcodename",
202
+ "lsbdistdescription",
203
+ "lsbdistid",
204
+ "lsbdistrelease",
205
+ "lsbmajdistrelease",
206
+ "lsbminordistrelease",
207
+ "lsbrelease",
208
+ "macaddress",
209
+ "macaddress_.*",
210
+ "macaddress_*",
211
+ "macosx_buildversion",
212
+ "macosx_productname",
213
+ "macosx_productversion",
214
+ "macosx_productversion_major",
215
+ "macosx_productversion_minor",
216
+ "manufacturer",
217
+ "memoryfree",
218
+ "memoryfree_mb",
219
+ "memorysize",
220
+ "memorysize_mb",
221
+ "mtu_.*",
222
+ "mtu_*",
223
+ "netmask",
224
+ "netmask_.*",
225
+ "netmask_*",
226
+ "netmask6",
227
+ "netmask6_.*",
228
+ "netmask6_*",
229
+ "network",
230
+ "network_.*",
231
+ "network_*",
232
+ "network6",
233
+ "network6_.*",
234
+ "network6_*",
235
+ "operatingsystem",
236
+ "operatingsystemmajrelease",
237
+ "operatingsystemrelease",
238
+ "osfamily",
239
+ "physicalprocessorcount",
240
+ "processor.*",
241
+ "processor*",
242
+ "processorcount",
243
+ "productname",
244
+ "rubyplatform",
245
+ "rubysitedir",
246
+ "rubyversion",
247
+ "scope6",
248
+ "scope6_.*",
249
+ "selinux",
250
+ "selinux_config_mode",
251
+ "selinux_config_policy",
252
+ "selinux_current_mode",
253
+ "selinux_enforced",
254
+ "selinux_policyversion",
255
+ "serialnumber",
256
+ "sp_*",
257
+ "sp_boot_mode",
258
+ "sp_boot_rom_version",
259
+ "sp_boot_volume",
260
+ "sp_cpu_type",
261
+ "sp_current_processor_speed",
262
+ "sp_kernel_version",
263
+ "sp_l2_cache_core",
264
+ "sp_l3_cache",
265
+ "sp_local_host_name",
266
+ "sp_machine_model",
267
+ "sp_machine_name",
268
+ "sp_number_processors",
269
+ "sp_os_version",
270
+ "sp_packages",
271
+ "sp_physical_memory",
272
+ "sp_platform_uuid",
273
+ "sp_secure_vm",
274
+ "sp_serial_number",
275
+ "sp_smc_version_system",
276
+ "sp_uptime",
277
+ "sp_user_name",
278
+ "ssh.*key",
279
+ "ssh*key",
280
+ "sshfp_.*",
281
+ "sshfp_*",
282
+ "swapencrypted",
283
+ "swapfree",
284
+ "swapfree_mb",
285
+ "swapsize",
286
+ "swapsize_mb",
287
+ "system32",
288
+ "uptime",
289
+ "uptime_days",
290
+ "uptime_hours",
291
+ "uptime_seconds",
292
+ "uuid",
293
+ "windows_edition_id",
294
+ "windows_installation_type",
295
+ "windows_product_name",
296
+ "windows_release_id",
297
+ "xendomains",
298
+ "zone_*_brand",
299
+ "zone_*_id",
300
+ "zone_*_iptype",
301
+ "zone_*_name",
302
+ "zone_*_path",
303
+ "zone_*_status",
304
+ "zone_*_uuid",
305
+ "zonename",
306
+ "zones"
168
307
  ]
169
- }
308
+ }