facter 4.0.38 → 4.0.43
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 +4 -4
- data/bin/facter +3 -4
- data/lib/facter.rb +138 -27
- data/lib/facter/custom_facts/core/aggregate.rb +51 -17
- data/lib/facter/custom_facts/core/execution.rb +27 -35
- data/lib/facter/custom_facts/core/execution/base.rb +42 -6
- data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
- data/lib/facter/custom_facts/util/resolution.rb +40 -11
- data/lib/facter/facts/aix/disks.rb +1 -1
- data/lib/facter/facts/aix/kernel.rb +1 -1
- data/lib/facter/facts/aix/kernelmajversion.rb +1 -1
- data/lib/facter/facts/aix/kernelrelease.rb +1 -1
- data/lib/facter/facts/aix/kernelversion.rb +1 -1
- data/lib/facter/facts/aix/os/release.rb +1 -1
- data/lib/facter/facts/linux/cloud.rb +15 -0
- data/lib/facter/facts/linux/disks.rb +1 -1
- data/lib/facter/facts/linux/ec2_metadata.rb +5 -27
- data/lib/facter/facts/linux/ec2_userdata.rb +5 -27
- data/lib/facter/facts/linux/is_virtual.rb +7 -46
- data/lib/facter/facts/linux/virtual.rb +3 -58
- data/lib/facter/facts/solaris/disks.rb +1 -1
- data/lib/facter/facts/solaris/zones.rb +1 -1
- data/lib/facter/facts_utils/virtual_detector.rb +78 -0
- data/lib/facter/framework/cli/cli.rb +83 -36
- data/lib/facter/framework/cli/cli_launcher.rb +34 -38
- data/lib/facter/framework/config/fact_groups.rb +36 -2
- data/lib/facter/framework/core/cache_manager.rb +40 -23
- data/lib/facter/framework/core/fact_loaders/fact_loader.rb +14 -11
- data/lib/facter/framework/core/options/config_file_options.rb +5 -3
- data/lib/facter/framework/core/options/option_store.rb +27 -10
- data/lib/facter/framework/logging/logger.rb +1 -5
- data/lib/facter/patches/sysfilesystem/sys/statvfs.rb +92 -0
- data/lib/facter/resolvers/aix/os_level.rb +27 -0
- data/lib/facter/resolvers/cloud.rb +39 -0
- data/lib/facter/resolvers/dmi_decode.rb +1 -0
- data/lib/facter/resolvers/dmi_resolver.rb +2 -2
- data/lib/facter/resolvers/memory_resolver.rb +12 -14
- data/lib/facter/resolvers/mountpoints_resolver.rb +5 -2
- data/lib/facter/resolvers/networking_linux_resolver.rb +10 -5
- data/lib/facter/resolvers/processors_resolver.rb +5 -1
- data/lib/facter/resolvers/solaris/mountpoints.rb +60 -0
- data/lib/facter/resolvers/solaris/networking.rb +1 -1
- data/lib/facter/resolvers/utils/filesystem_helper.rb +3 -1
- data/lib/facter/version.rb +1 -1
- metadata +8 -4
- data/lib/facter/resolvers/aix/os_level_resolver.rb +0 -25
- data/lib/facter/resolvers/os_level_resolver.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02e89a2638e45004e55f6b0ec4d902946c844b5253ee4e27139ab01d1ee12a92
|
4
|
+
data.tar.gz: bd4405449c4804a3c872510042a33c2cd6cf7fd588df8f95a99893fcb9248291
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31feabfeb9c2008ae30f16b6469cdf689b78e8711d64e3b614481a3e98b41d8271822b6cb26511a56ba5e19394f2ea811552b29168484d8ee377dbd3697f6655
|
7
|
+
data.tar.gz: f579f81b0dc6fedf937d016e531650c183bc4f89ce66c918f47932af01e97bfc19f0e0f012adcfe36a52e4a9a314685765055fe23bde5aa4cf5b2f92353a450c
|
data/bin/facter
CHANGED
@@ -4,8 +4,7 @@
|
|
4
4
|
require 'pathname'
|
5
5
|
require 'facter/framework/cli/cli_launcher.rb'
|
6
6
|
|
7
|
-
|
7
|
+
Facter::OptionsValidator.validate(ARGV)
|
8
|
+
processed_arguments = CliLauncher.prepare_arguments(ARGV)
|
8
9
|
|
9
|
-
|
10
|
-
cli_launcher.prepare_arguments
|
11
|
-
cli_launcher.start
|
10
|
+
CliLauncher.start(processed_arguments)
|
data/lib/facter.rb
CHANGED
@@ -17,8 +17,32 @@ module Facter
|
|
17
17
|
@warn_once = []
|
18
18
|
|
19
19
|
class << self
|
20
|
-
|
21
|
-
|
20
|
+
# Method used by puppet-agent to retrieve facts
|
21
|
+
# @param args_as_string [string] facter cli arguments
|
22
|
+
#
|
23
|
+
# @return nil
|
24
|
+
#
|
25
|
+
# @api private
|
26
|
+
def resolve(args_as_string)
|
27
|
+
require 'facter/framework/cli/cli_launcher'
|
28
|
+
|
29
|
+
args = args_as_string.split(' ')
|
30
|
+
|
31
|
+
Facter::OptionsValidator.validate(args)
|
32
|
+
processed_arguments = CliLauncher.prepare_arguments(args, nil)
|
33
|
+
|
34
|
+
cli = Facter::Cli.new([], processed_arguments)
|
35
|
+
|
36
|
+
if cli.args.include?(:version)
|
37
|
+
cli.invoke(:version, [])
|
38
|
+
elsif cli.args.include?('--list-cache-groups')
|
39
|
+
cli.invoke(:list_cache_groups, [])
|
40
|
+
elsif cli.args.include?('--list-block-groups')
|
41
|
+
cli.invoke(:list_block_groups, [])
|
42
|
+
else
|
43
|
+
cli.invoke(:arg_parser)
|
44
|
+
end
|
45
|
+
nil
|
22
46
|
end
|
23
47
|
|
24
48
|
# Alias method for Facter.fact()
|
@@ -62,8 +86,16 @@ module Facter
|
|
62
86
|
Options[:custom_dir] = []
|
63
87
|
LegacyFacter.collection.invalidate_custom_facts
|
64
88
|
LegacyFacter.collection.reload_custom_facts
|
89
|
+
SessionCache.invalidate_all_caches
|
90
|
+
nil
|
65
91
|
end
|
66
92
|
|
93
|
+
# Gets the value for a core fact, external or custom facts are
|
94
|
+
# not returned with this call. Returns `nil` if no such fact exists.
|
95
|
+
#
|
96
|
+
# @return [FactCollection] hash with fact names and values
|
97
|
+
#
|
98
|
+
# @api private
|
67
99
|
def core_value(user_query)
|
68
100
|
user_query = user_query.to_s
|
69
101
|
resolved_facts = Facter::FactManager.instance.resolve_core([user_query])
|
@@ -102,8 +134,29 @@ module Facter
|
|
102
134
|
nil
|
103
135
|
end
|
104
136
|
|
137
|
+
# Define a new fact or extend an existing fact.
|
138
|
+
#
|
139
|
+
# @param name [Symbol] The name of the fact to define
|
140
|
+
# @param options [Hash] A hash of options to set on the fact
|
141
|
+
#
|
142
|
+
# @return [Facter::Util::Fact] The fact that was defined
|
143
|
+
#
|
144
|
+
# @api public
|
145
|
+
def define_fact(name, options = {}, &block)
|
146
|
+
options[:fact_type] = :custom
|
147
|
+
LegacyFacter.define_fact(name, options, &block)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Stores a proc that will be used to output custom messages.
|
151
|
+
# The proc must receive one parameter that will be the message to log.
|
152
|
+
# @param block [Proc] a block defining messages handler
|
153
|
+
#
|
154
|
+
# @return [nil]
|
155
|
+
#
|
156
|
+
# @api public
|
105
157
|
def on_message(&block)
|
106
158
|
Facter::Log.on_message(&block)
|
159
|
+
nil
|
107
160
|
end
|
108
161
|
|
109
162
|
# Check whether debugging is enabled
|
@@ -125,6 +178,25 @@ module Facter
|
|
125
178
|
Facter::Options[:debug] = debug_bool
|
126
179
|
end
|
127
180
|
|
181
|
+
# Iterates over fact names and values
|
182
|
+
#
|
183
|
+
# @yieldparam [String] name the fact name
|
184
|
+
# @yieldparam [String] value the current value of the fact
|
185
|
+
#
|
186
|
+
# @return [Facter]
|
187
|
+
#
|
188
|
+
# @api public
|
189
|
+
def each
|
190
|
+
log_blocked_facts
|
191
|
+
resolved_facts = Facter::FactManager.instance.resolve_facts
|
192
|
+
|
193
|
+
resolved_facts.each do |fact|
|
194
|
+
yield(fact.name, fact.value)
|
195
|
+
end
|
196
|
+
|
197
|
+
self
|
198
|
+
end
|
199
|
+
|
128
200
|
# Returns a fact object by name. If you use this, you still have to
|
129
201
|
# call {Facter::Util::Fact#value `value`} on it to retrieve the actual
|
130
202
|
# value.
|
@@ -152,30 +224,41 @@ module Facter
|
|
152
224
|
LegacyFacter.reset
|
153
225
|
Options[:custom_dir] = []
|
154
226
|
Options[:external_dir] = []
|
227
|
+
SessionCache.invalidate_all_caches
|
155
228
|
nil
|
156
229
|
end
|
157
230
|
|
158
|
-
#
|
159
|
-
# must be absolute paths or they will be ignored.
|
231
|
+
# Loads all facts
|
160
232
|
#
|
233
|
+
# @return [nil]
|
234
|
+
#
|
235
|
+
# @api public
|
236
|
+
def loadfacts
|
237
|
+
LegacyFacter.loadfacts
|
238
|
+
nil
|
239
|
+
end
|
240
|
+
|
241
|
+
# Register directories to be searched for custom facts. The registered directories
|
242
|
+
# must be absolute paths or they will be ignored.
|
161
243
|
# @param dirs [Array<String>] An array of searched directories
|
162
244
|
#
|
163
|
-
# @return [
|
245
|
+
# @return [nil]
|
164
246
|
#
|
165
247
|
# @api public
|
166
248
|
def search(*dirs)
|
167
249
|
Options[:custom_dir] += dirs
|
250
|
+
nil
|
168
251
|
end
|
169
252
|
|
170
253
|
# Registers directories to be searched for external facts.
|
171
|
-
#
|
172
254
|
# @param dirs [Array<String>] An array of searched directories
|
173
255
|
#
|
174
|
-
# @return [
|
256
|
+
# @return [nil]
|
175
257
|
#
|
176
258
|
# @api public
|
177
259
|
def search_external(dirs)
|
178
260
|
Options[:external_dir] += dirs
|
261
|
+
nil
|
179
262
|
end
|
180
263
|
|
181
264
|
# Returns the registered search directories.for external facts.
|
@@ -199,14 +282,13 @@ module Facter
|
|
199
282
|
# Gets a hash mapping fact names to their values
|
200
283
|
# The hash contains core facts, legacy facts, custom facts and external facts (all facts that can be resolved).
|
201
284
|
#
|
202
|
-
# @return [FactCollection]
|
285
|
+
# @return [FactCollection] hash with fact names and values
|
203
286
|
#
|
204
287
|
# @api public
|
205
288
|
def to_hash
|
206
289
|
log_blocked_facts
|
207
290
|
|
208
291
|
resolved_facts = Facter::FactManager.instance.resolve_facts
|
209
|
-
Facter::SessionCache.invalidate_all_caches
|
210
292
|
Facter::FactCollection.new.build_fact_collection!(resolved_facts)
|
211
293
|
end
|
212
294
|
|
@@ -222,7 +304,7 @@ module Facter
|
|
222
304
|
# Enable or disable trace
|
223
305
|
# @param bool [bool] Set trace on debug state
|
224
306
|
#
|
225
|
-
# @return [
|
307
|
+
# @return [bool] Value of trace debug state
|
226
308
|
#
|
227
309
|
# @api public
|
228
310
|
def trace(bool)
|
@@ -241,6 +323,27 @@ module Facter
|
|
241
323
|
@already_searched[user_query]&.value
|
242
324
|
end
|
243
325
|
|
326
|
+
# Gets the values for multiple facts.
|
327
|
+
#
|
328
|
+
# @param options [Hash] parameters for the fact - attributes
|
329
|
+
# of {Facter::Util::Fact} and {Facter::Util::Resolution} can be
|
330
|
+
# supplied here
|
331
|
+
# @param user_queries [String] the fact names
|
332
|
+
#
|
333
|
+
# @return [FactCollection] hash with fact names and values
|
334
|
+
#
|
335
|
+
# @api public
|
336
|
+
def values(options, user_queries)
|
337
|
+
init_cli_options(options, user_queries)
|
338
|
+
resolved_facts = Facter::FactManager.instance.resolve_facts(user_queries)
|
339
|
+
|
340
|
+
if user_queries.count.zero?
|
341
|
+
Facter::FactCollection.new.build_fact_collection!(resolved_facts)
|
342
|
+
else
|
343
|
+
FormatterHelper.retrieve_facts_to_display_for_user_query(user_queries, resolved_facts)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
244
347
|
# Returns Facter version
|
245
348
|
#
|
246
349
|
# @return [String] Current version
|
@@ -260,7 +363,6 @@ module Facter
|
|
260
363
|
logger.info("executed with command line: #{ARGV.drop(1).join(' ')}")
|
261
364
|
log_blocked_facts
|
262
365
|
resolved_facts = Facter::FactManager.instance.resolve_facts(args)
|
263
|
-
SessionCache.invalidate_all_caches
|
264
366
|
fact_formatter = Facter::FormatterFactory.build(Facter::Options.get)
|
265
367
|
|
266
368
|
status = error_check(resolved_facts)
|
@@ -268,23 +370,22 @@ module Facter
|
|
268
370
|
[fact_formatter.format(resolved_facts), status || 0]
|
269
371
|
end
|
270
372
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
if Options[:trace]
|
279
|
-
arr << 'backtrace:'
|
280
|
-
arr.concat(exception.backtrace)
|
281
|
-
end
|
373
|
+
# Logs an exception and an optional message
|
374
|
+
#
|
375
|
+
# @return [nil]
|
376
|
+
#
|
377
|
+
# @api public
|
378
|
+
def log_exception(exception, message = nil)
|
379
|
+
error_message = []
|
282
380
|
|
283
|
-
|
381
|
+
error_message << message.to_s unless message.nil? || (message.is_a?(String) && message.empty?)
|
382
|
+
|
383
|
+
parse_exception(exception, error_message)
|
384
|
+
logger.error(error_message.flatten.join("\n"))
|
385
|
+
nil
|
284
386
|
end
|
285
387
|
|
286
388
|
# Returns a list with the names of all solved facts
|
287
|
-
#
|
288
389
|
# @return [Array] the list with all the fact names
|
289
390
|
#
|
290
391
|
# @api public
|
@@ -293,7 +394,6 @@ module Facter
|
|
293
394
|
end
|
294
395
|
|
295
396
|
# Logs the message parameter as a warning.
|
296
|
-
#
|
297
397
|
# @param message [Object] the warning object to be displayed
|
298
398
|
#
|
299
399
|
# @return [nil]
|
@@ -305,7 +405,6 @@ module Facter
|
|
305
405
|
end
|
306
406
|
|
307
407
|
# Logs only once the same warning message.
|
308
|
-
#
|
309
408
|
# @param message [Object] the warning message object
|
310
409
|
#
|
311
410
|
# @return [nil]
|
@@ -322,6 +421,19 @@ module Facter
|
|
322
421
|
|
323
422
|
private
|
324
423
|
|
424
|
+
def parse_exception(exception, error_message)
|
425
|
+
if exception.is_a?(Exception)
|
426
|
+
error_message << exception.message if error_message.empty?
|
427
|
+
|
428
|
+
if Options[:trace] && !exception.backtrace.nil?
|
429
|
+
error_message << 'backtrace:'
|
430
|
+
error_message.concat(exception.backtrace)
|
431
|
+
end
|
432
|
+
elsif error_message.empty?
|
433
|
+
error_message << exception.to_s
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
325
437
|
def logger
|
326
438
|
@logger ||= Log.new(self)
|
327
439
|
end
|
@@ -343,7 +455,6 @@ module Facter
|
|
343
455
|
def resolve_fact(user_query)
|
344
456
|
user_query = user_query.to_s
|
345
457
|
resolved_facts = Facter::FactManager.instance.resolve_facts([user_query])
|
346
|
-
SessionCache.invalidate_all_caches
|
347
458
|
# we must make a distinction between custom facts that return nil and nil facts
|
348
459
|
# Nil facts should not be packaged as ResolvedFacts! (add_fact_to_searched_facts packages facts)
|
349
460
|
resolved_facts = resolved_facts.reject { |fact| fact.type == :nil }
|
@@ -18,22 +18,31 @@ module Facter
|
|
18
18
|
include LegacyFacter::Core::Resolvable
|
19
19
|
|
20
20
|
# @!attribute [r] name
|
21
|
-
#
|
21
|
+
#
|
22
|
+
# @return [Symbol] The name of the aggregate resolution
|
23
|
+
#
|
24
|
+
# @api public
|
22
25
|
attr_reader :name
|
23
26
|
|
24
27
|
# @!attribute [r] deps
|
25
|
-
#
|
26
|
-
#
|
28
|
+
#
|
29
|
+
# @return [LegacyFacter::Core::DirectedGraph]
|
30
|
+
#
|
31
|
+
# @api private
|
27
32
|
attr_reader :deps
|
28
33
|
|
29
34
|
# @!attribute [r] confines
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
35
|
+
#
|
36
|
+
# @return [Array<LegacyFacter::Core::Confine>] An array of confines restricting
|
37
|
+
# this to a specific platform
|
38
|
+
#
|
39
|
+
# @api private
|
33
40
|
attr_reader :confines
|
34
41
|
|
35
42
|
# @!attribute [r] fact
|
43
|
+
#
|
36
44
|
# @return [Facter::Util::Fact]
|
45
|
+
#
|
37
46
|
# @api private
|
38
47
|
attr_reader :fact
|
39
48
|
|
@@ -48,10 +57,20 @@ module Facter
|
|
48
57
|
@deps = LegacyFacter::Core::DirectedGraph.new
|
49
58
|
end
|
50
59
|
|
60
|
+
# Compares the weight of two aggregate facts
|
61
|
+
#
|
62
|
+
# @return [bool] Weight comparison result
|
63
|
+
#
|
64
|
+
# @api private
|
51
65
|
def <=>(other)
|
52
66
|
weight <=> other.weight
|
53
67
|
end
|
54
68
|
|
69
|
+
# Sets options for the aggregate fact
|
70
|
+
#
|
71
|
+
# @return [nil]
|
72
|
+
#
|
73
|
+
# @api private
|
55
74
|
def options(options)
|
56
75
|
accepted_options = %i[name timeout weight fact_type]
|
57
76
|
accepted_options.each do |option_name|
|
@@ -60,14 +79,17 @@ module Facter
|
|
60
79
|
raise ArgumentError, "Invalid aggregate options #{options.keys.inspect}" unless options.keys.empty?
|
61
80
|
end
|
62
81
|
|
82
|
+
# Evaluates the given block
|
83
|
+
#
|
84
|
+
# @return [String] Result of the block's evaluation
|
85
|
+
#
|
86
|
+
# @api private
|
63
87
|
def evaluate(&block)
|
64
88
|
instance_eval(&block)
|
65
89
|
end
|
66
90
|
|
67
91
|
# Define a new chunk for the given aggregate
|
68
92
|
#
|
69
|
-
# @api public
|
70
|
-
#
|
71
93
|
# @example Defining a chunk with no dependencies
|
72
94
|
# aggregate.chunk(:mountpoints) do
|
73
95
|
# # generate mountpoint information
|
@@ -80,14 +102,14 @@ module Facter
|
|
80
102
|
# end
|
81
103
|
#
|
82
104
|
# @param name [Symbol] A name unique to this aggregate describing the chunk
|
83
|
-
# @param opts [Hash]
|
84
|
-
# @options opts [Array<Symbol>, Symbol] :require One or more chunks
|
85
|
-
# to evaluate and pass to this block.
|
86
|
-
# @yield [*Object] Zero or more chunk results
|
87
105
|
#
|
88
|
-
# @
|
106
|
+
# @param opts [Hash] Hash with options for the aggregate fact
|
107
|
+
#
|
108
|
+
# @return [Facter::Core::Aggregate] The aggregate object
|
109
|
+
#
|
110
|
+
# @api public
|
89
111
|
def chunk(name, opts = {}, &block)
|
90
|
-
|
112
|
+
evaluate_params(name, &block)
|
91
113
|
|
92
114
|
deps = Array(opts.delete(:require))
|
93
115
|
|
@@ -97,12 +119,11 @@ module Facter
|
|
97
119
|
|
98
120
|
@deps[name] = deps
|
99
121
|
@chunks[name] = block
|
122
|
+
self
|
100
123
|
end
|
101
124
|
|
102
125
|
# Define how all chunks should be combined
|
103
126
|
#
|
104
|
-
# @api public
|
105
|
-
#
|
106
127
|
# @example Merge all chunks
|
107
128
|
# aggregate.aggregate do |chunks|
|
108
129
|
# final_result = {}
|
@@ -124,19 +145,32 @@ module Facter
|
|
124
145
|
# @yield [Hash<Symbol, Object>] A hash containing chunk names and
|
125
146
|
# chunk values
|
126
147
|
#
|
127
|
-
# @return [
|
148
|
+
# @return [Facter::Core::Aggregate] The aggregate fact
|
149
|
+
#
|
150
|
+
# @api public
|
128
151
|
def aggregate(&block)
|
129
152
|
raise ArgumentError, "#{self.class.name}#aggregate requires a block" unless block_given?
|
130
153
|
|
131
154
|
@aggregate = block
|
155
|
+
self
|
132
156
|
end
|
133
157
|
|
158
|
+
# Returns the fact's resolution type
|
159
|
+
#
|
160
|
+
# @return [Symbol] The fact's type
|
161
|
+
#
|
162
|
+
# @api private
|
134
163
|
def resolution_type
|
135
164
|
:aggregate
|
136
165
|
end
|
137
166
|
|
138
167
|
private
|
139
168
|
|
169
|
+
def evaluate_params(name)
|
170
|
+
raise ArgumentError, "#{self.class.name}#chunk requires a block" unless block_given?
|
171
|
+
raise ArgumentError, "#{self.class.name}#expected chunk name to be a Symbol" unless name.is_a? Symbol
|
172
|
+
end
|
173
|
+
|
140
174
|
# Evaluate the results of this aggregate.
|
141
175
|
#
|
142
176
|
# @see Facter::Core::Resolvable#value
|