facter 4.0.38 → 4.0.43
Sign up to get free protection for your applications and to get access to all the features.
- 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
|