facter 4.0.44 → 4.0.46
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/lib/facter.rb +15 -1
- data/lib/facter/config.rb +1 -0
- data/lib/facter/custom_facts/core/execution.rb +28 -4
- data/lib/facter/custom_facts/core/execution/base.rb +33 -33
- data/lib/facter/custom_facts/util/parser.rb +17 -3
- data/lib/facter/facts/solaris/hypervisors/ldom.rb +3 -0
- data/lib/facter/facts/solaris/ldom.rb +4 -1
- data/lib/facter/framework/cli/cli.rb +19 -5
- data/lib/facter/framework/config/fact_groups.rb +5 -3
- data/lib/facter/framework/core/cache_manager.rb +57 -15
- data/lib/facter/framework/core/fact/internal/core_fact.rb +6 -1
- data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +38 -4
- data/lib/facter/framework/core/fact_augmenter.rb +1 -1
- data/lib/facter/framework/core/fact_loaders/fact_loader.rb +1 -1
- data/lib/facter/framework/core/fact_manager.rb +1 -1
- data/lib/facter/framework/core/options/config_file_options.rb +16 -5
- data/lib/facter/framework/core/options/option_store.rb +7 -3
- data/lib/facter/resolvers/aio_agent_version.rb +1 -1
- data/lib/facter/resolvers/aix/architecture_resolver.rb +2 -1
- data/lib/facter/resolvers/aix/disks.rb +2 -1
- data/lib/facter/resolvers/aix/filesystem_resolver.rb +1 -1
- data/lib/facter/resolvers/aix/hardware_resolver.rb +2 -1
- data/lib/facter/resolvers/aix/load_averages_resolver.rb +2 -1
- data/lib/facter/resolvers/aix/memory.rb +2 -1
- data/lib/facter/resolvers/aix/mountpoints.rb +2 -1
- data/lib/facter/resolvers/aix/networking_resolver.rb +1 -1
- data/lib/facter/resolvers/aix/nim.rb +1 -1
- data/lib/facter/resolvers/aix/os_level.rb +1 -1
- data/lib/facter/resolvers/aix/partitions.rb +2 -1
- data/lib/facter/resolvers/aix/processors.rb +2 -1
- data/lib/facter/resolvers/aix/serialnumber.rb +1 -1
- data/lib/facter/resolvers/augeas_resolver.rb +1 -1
- data/lib/facter/resolvers/base_resolver.rb +11 -4
- data/lib/facter/resolvers/bsd/processors.rb +2 -1
- data/lib/facter/resolvers/cloud.rb +1 -1
- data/lib/facter/resolvers/containers.rb +2 -1
- data/lib/facter/resolvers/debian_version.rb +1 -1
- data/lib/facter/resolvers/disk_resolver.rb +4 -1
- data/lib/facter/resolvers/dmi_decode.rb +1 -1
- data/lib/facter/resolvers/dmi_resolver.rb +2 -1
- data/lib/facter/resolvers/ec2.rb +2 -1
- data/lib/facter/resolvers/eos_release_resolver.rb +1 -1
- data/lib/facter/resolvers/facterversion_resolver.rb +1 -1
- data/lib/facter/resolvers/filesystems_resolver.rb +4 -1
- data/lib/facter/resolvers/fips_enabled_resolver.rb +4 -1
- data/lib/facter/resolvers/freebsd/dmi_resolver.rb +1 -1
- data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +9 -7
- data/lib/facter/resolvers/freebsd/geom_resolver.rb +2 -1
- data/lib/facter/resolvers/freebsd/processors.rb +2 -1
- data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +2 -1
- data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +2 -1
- data/lib/facter/resolvers/gce.rb +2 -1
- data/lib/facter/resolvers/hostname_resolver.rb +2 -1
- data/lib/facter/resolvers/identity_resolver.rb +2 -1
- data/lib/facter/resolvers/linux/docker_uptime.rb +2 -1
- data/lib/facter/resolvers/linux/load_averages.rb +2 -1
- data/lib/facter/resolvers/load_averages.rb +2 -1
- data/lib/facter/resolvers/lpar_resolver.rb +1 -1
- data/lib/facter/resolvers/lsb_release_resolver.rb +1 -1
- data/lib/facter/resolvers/lspci.rb +1 -1
- data/lib/facter/resolvers/macosx/dmi_resolver.rb +1 -1
- data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -1
- data/lib/facter/resolvers/macosx/load_averages_resolver.rb +2 -1
- data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +2 -1
- data/lib/facter/resolvers/macosx/processor_resolver.rb +2 -1
- data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +2 -1
- data/lib/facter/resolvers/macosx/system_memory_resolver.rb +2 -1
- data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +1 -3
- data/lib/facter/resolvers/memory_resolver.rb +3 -1
- data/lib/facter/resolvers/mountpoints_resolver.rb +4 -1
- data/lib/facter/resolvers/networking_linux_resolver.rb +5 -4
- data/lib/facter/resolvers/networking_resolver.rb +1 -1
- data/lib/facter/resolvers/open_vz.rb +1 -1
- data/lib/facter/resolvers/os_release_resolver.rb +1 -1
- data/lib/facter/resolvers/partitions.rb +2 -1
- data/lib/facter/resolvers/path_resolver.rb +1 -1
- data/lib/facter/resolvers/processors_resolver.rb +4 -1
- data/lib/facter/resolvers/puppet_version_resolver.rb +1 -1
- data/lib/facter/resolvers/redhat_release_resolver.rb +1 -1
- data/lib/facter/resolvers/ruby_resolver.rb +1 -1
- data/lib/facter/resolvers/selinux_resolver.rb +1 -1
- data/lib/facter/resolvers/solaris/disks.rb +1 -1
- data/lib/facter/resolvers/solaris/dmi.rb +1 -1
- data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
- data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
- data/lib/facter/resolvers/solaris/ipaddress.rb +2 -1
- data/lib/facter/resolvers/solaris/ldom.rb +1 -3
- data/lib/facter/resolvers/solaris/memory.rb +2 -1
- data/lib/facter/resolvers/solaris/mountpoints.rb +2 -2
- data/lib/facter/resolvers/solaris/networking.rb +1 -1
- data/lib/facter/resolvers/solaris/os_release.rb +2 -1
- data/lib/facter/resolvers/solaris/processors.rb +2 -1
- data/lib/facter/resolvers/solaris/zone.rb +1 -1
- data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
- data/lib/facter/resolvers/ssh_resolver.rb +4 -1
- data/lib/facter/resolvers/suse_release_resolver.rb +1 -1
- data/lib/facter/resolvers/sw_vers_resolver.rb +2 -2
- data/lib/facter/resolvers/timezone_resolver.rb +1 -1
- data/lib/facter/resolvers/uname_resolver.rb +1 -1
- data/lib/facter/resolvers/uptime_resolver.rb +1 -1
- data/lib/facter/resolvers/utils/networking.rb +2 -0
- data/lib/facter/resolvers/virt_what.rb +1 -1
- data/lib/facter/resolvers/vmware.rb +1 -1
- data/lib/facter/resolvers/windows/aio_agent_version.rb +1 -1
- data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +1 -1
- data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +1 -1
- data/lib/facter/resolvers/windows/fips_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/identity_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/kernel_resolver.rb +3 -1
- data/lib/facter/resolvers/windows/memory_resolver.rb +3 -1
- data/lib/facter/resolvers/windows/netkvm_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/networking_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/processors_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/product_release_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/ssh.rb +3 -1
- data/lib/facter/resolvers/windows/system32_resolver.rb +3 -1
- data/lib/facter/resolvers/windows/uptime_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/virtualization_resolver.rb +2 -1
- data/lib/facter/resolvers/windows/win_os_description_resolver.rb +3 -1
- data/lib/facter/resolvers/wpar_resolver.rb +1 -1
- data/lib/facter/resolvers/xen.rb +1 -1
- data/lib/facter/resolvers/zfs.rb +2 -1
- data/lib/facter/resolvers/zpool.rb +2 -1
- data/lib/facter/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 71eb4894f5e565033d547ffb64d562aee98c6b6a082bca7387259f9a779830d8
|
|
4
|
+
data.tar.gz: 95331a72cf0dc86fabbcad33447724a3a55b536c366bb8ba356428fddefd1587
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 24caa700190be726fa0a7dc0f7dbbac290e073fab078c32b2b67d8a79c336daeab4c3254389a58e7bb4538706c8b8114d609173b78c31e7d676ca50d21a3bcb7
|
|
7
|
+
data.tar.gz: 9edcd692bfe2b0de59a6a6bf6f1700387e25da56127148ffd656edb901fc7fa47db7fe61eae3e4bf17ac8ddaa17e655c65ed366ef3fcc79db2a28e20ab1e6a37
|
data/lib/facter.rb
CHANGED
|
@@ -177,6 +177,18 @@ module Facter
|
|
|
177
177
|
Facter::Options[:debug] = debug_bool
|
|
178
178
|
end
|
|
179
179
|
|
|
180
|
+
def enable_sequential
|
|
181
|
+
Facter::Options[:sequential] = true
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def disable_sequential
|
|
185
|
+
Facter::Options[:sequential] = false
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def sequential?
|
|
189
|
+
Facter::Options[:sequential]
|
|
190
|
+
end
|
|
191
|
+
|
|
180
192
|
# Iterates over fact names and values
|
|
181
193
|
#
|
|
182
194
|
# @yieldparam [String] name the fact name
|
|
@@ -339,13 +351,15 @@ module Facter
|
|
|
339
351
|
# @param options [Hash] parameters for the fact - attributes
|
|
340
352
|
# of {Facter::Util::Fact} and {Facter::Util::Resolution} can be
|
|
341
353
|
# supplied here
|
|
342
|
-
# @param user_queries [
|
|
354
|
+
# @param user_queries [Array] the fact names
|
|
343
355
|
#
|
|
344
356
|
# @return [FactCollection] hash with fact names and values
|
|
345
357
|
#
|
|
346
358
|
# @api public
|
|
347
359
|
def values(options, user_queries)
|
|
348
360
|
init_cli_options(options, user_queries)
|
|
361
|
+
Options[:show_legacy] = true
|
|
362
|
+
log_blocked_facts
|
|
349
363
|
resolved_facts = Facter::FactManager.instance.resolve_facts(user_queries)
|
|
350
364
|
|
|
351
365
|
if user_queries.count.zero?
|
data/lib/facter/config.rb
CHANGED
|
@@ -98,16 +98,19 @@ module Facter
|
|
|
98
98
|
# Execute a command and return the output of that program.
|
|
99
99
|
# @param command [String] Command to run
|
|
100
100
|
#
|
|
101
|
-
# @param options [Hash] Hash with options for the
|
|
101
|
+
# @param options [Hash] Hash with options for the command
|
|
102
102
|
#
|
|
103
|
-
#
|
|
103
|
+
# Options accepted values :on_fail How to behave when the command could
|
|
104
104
|
# not be run. Specifying :raise will raise an error, anything else will
|
|
105
105
|
# return that object on failure. Default is :raise.
|
|
106
|
+
# :logger Optional logger used to log the command's stderr.
|
|
107
|
+
# :time_limit Optional time out for the specified command. If no time_limit is passed,
|
|
108
|
+
# a default of 300 seconds is used.
|
|
106
109
|
#
|
|
107
110
|
# @raise [Facter::Core::Execution::ExecutionFailure] If the command does
|
|
108
|
-
# not exist or could not be executed
|
|
111
|
+
# not exist or could not be executed and :on_fail is set to :raise
|
|
109
112
|
#
|
|
110
|
-
# @return [String] the output of the program, or the value of :on_fail if
|
|
113
|
+
# @return [String] the output of the program, or the value of :on_fail (if it's different than :raise) if
|
|
111
114
|
# command execution failed and :on_fail was specified.
|
|
112
115
|
#
|
|
113
116
|
# @api public
|
|
@@ -115,6 +118,27 @@ module Facter
|
|
|
115
118
|
@@impl.execute(command, options)
|
|
116
119
|
end
|
|
117
120
|
|
|
121
|
+
# Execute a command and return the stdout and stderr of that program.
|
|
122
|
+
# @param command [String] Command to run
|
|
123
|
+
#
|
|
124
|
+
# @param on_fail[Object] How to behave when the command could
|
|
125
|
+
# not be run. Specifying :raise will raise an error, anything else will
|
|
126
|
+
# return that object on failure. Default is :raise.
|
|
127
|
+
# @param logger Optional logger used to log the command's stderr.
|
|
128
|
+
# @param time_limit Optional time out for the specified command. If no time_limit is passed,
|
|
129
|
+
# a default of 300 seconds is used.
|
|
130
|
+
#
|
|
131
|
+
# @raise [Facter::Core::Execution::ExecutionFailure] If the command does
|
|
132
|
+
# not exist or could not be executed and :on_fail is set to :raise
|
|
133
|
+
#
|
|
134
|
+
# @return [String, String] the stdout and stderr of the program, or the value of
|
|
135
|
+
# :on_fail if command execution failed and :on_fail was specified.
|
|
136
|
+
#
|
|
137
|
+
# @api private
|
|
138
|
+
def execute_command(command, on_fail = nil, logger = nil, time_limit = nil)
|
|
139
|
+
@@impl.execute_command(command, on_fail, logger, time_limit)
|
|
140
|
+
end
|
|
141
|
+
|
|
118
142
|
class ExecutionFailure < StandardError; end
|
|
119
143
|
end
|
|
120
144
|
end
|
|
@@ -4,7 +4,7 @@ module Facter
|
|
|
4
4
|
module Core
|
|
5
5
|
module Execution
|
|
6
6
|
class Base
|
|
7
|
-
STDERR_MESSAGE = 'Command %s
|
|
7
|
+
STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s'
|
|
8
8
|
|
|
9
9
|
def initialize
|
|
10
10
|
@log = Log.new(self)
|
|
@@ -57,39 +57,11 @@ module Facter
|
|
|
57
57
|
return on_fail
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
execute_command(expanded_command, on_fail, logger, time_limit)
|
|
60
|
+
out, = execute_command(expanded_command, on_fail, logger, time_limit)
|
|
61
|
+
out
|
|
61
62
|
end
|
|
62
63
|
|
|
63
|
-
|
|
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
|
-
|
|
75
|
-
def log_stderr(msg, command, logger)
|
|
76
|
-
return if !msg || msg.empty?
|
|
77
|
-
|
|
78
|
-
if logger
|
|
79
|
-
logger.debug(format(STDERR_MESSAGE, command, msg.strip))
|
|
80
|
-
else
|
|
81
|
-
file_name = command.split('/').last
|
|
82
|
-
logger = Facter::Log.new(file_name)
|
|
83
|
-
logger.warn(format(STDERR_MESSAGE, command, msg.strip))
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def builtin_command?(command)
|
|
88
|
-
output, _status = Open3.capture2("type #{command}")
|
|
89
|
-
output.chomp =~ /builtin/ ? true : false
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def execute_command(command, on_fail, logger = nil, time_limit = nil)
|
|
64
|
+
def execute_command(command, on_fail = nil, logger = nil, time_limit = nil)
|
|
93
65
|
time_limit ||= 300
|
|
94
66
|
begin
|
|
95
67
|
# Set LC_ALL and LANG to force i18n to C for the duration of this exec;
|
|
@@ -128,7 +100,35 @@ module Facter
|
|
|
128
100
|
"Failed while executing '#{command}': #{e.message}"
|
|
129
101
|
end
|
|
130
102
|
|
|
131
|
-
out.strip
|
|
103
|
+
[out.strip, stderr]
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
|
|
108
|
+
def extract_options(options)
|
|
109
|
+
on_fail = options.fetch(:on_fail, :raise)
|
|
110
|
+
expand = options.fetch(:expand, true)
|
|
111
|
+
logger = options[:logger]
|
|
112
|
+
time_limit = options[:limit].to_i
|
|
113
|
+
time_limit = time_limit.positive? ? time_limit : nil
|
|
114
|
+
|
|
115
|
+
[on_fail, expand, logger, time_limit]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def log_stderr(msg, command, logger)
|
|
119
|
+
return if !msg || msg.empty?
|
|
120
|
+
|
|
121
|
+
unless logger
|
|
122
|
+
file_name = command.split('/').last
|
|
123
|
+
logger = Facter::Log.new(file_name)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
logger.debug(format(STDERR_MESSAGE, command, msg.strip))
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def builtin_command?(command)
|
|
130
|
+
output, _status = Open3.capture2("type #{command}")
|
|
131
|
+
output.chomp =~ /builtin/ ? true : false
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
end
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
module LegacyFacter
|
|
9
9
|
module Util
|
|
10
10
|
module Parser
|
|
11
|
+
STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s'
|
|
12
|
+
|
|
11
13
|
@parsers = []
|
|
12
14
|
|
|
13
15
|
# For support mutliple extensions you can pass an array of extensions as
|
|
@@ -75,6 +77,15 @@ module LegacyFacter
|
|
|
75
77
|
res = KeyValuePairOutputFormat.parse output unless res.is_a?(Hash)
|
|
76
78
|
res
|
|
77
79
|
end
|
|
80
|
+
|
|
81
|
+
def log_stderr(msg, command, file)
|
|
82
|
+
return if !msg || msg.empty?
|
|
83
|
+
|
|
84
|
+
file_name = file.split('/').last
|
|
85
|
+
logger = Facter::Log.new(file_name)
|
|
86
|
+
|
|
87
|
+
logger.warn(format(STDERR_MESSAGE, command, msg.strip))
|
|
88
|
+
end
|
|
78
89
|
end
|
|
79
90
|
|
|
80
91
|
module KeyValuePairOutputFormat
|
|
@@ -139,7 +150,9 @@ module LegacyFacter
|
|
|
139
150
|
|
|
140
151
|
class ScriptParser < Base
|
|
141
152
|
def parse_results
|
|
142
|
-
|
|
153
|
+
stdout, stderr = Facter::Core::Execution.execute_command(quote(filename))
|
|
154
|
+
log_stderr(stderr, filename, filename)
|
|
155
|
+
parse_executable_output(stdout)
|
|
143
156
|
end
|
|
144
157
|
|
|
145
158
|
private
|
|
@@ -172,8 +185,9 @@ module LegacyFacter
|
|
|
172
185
|
|
|
173
186
|
shell_command =
|
|
174
187
|
"\"#{powershell}\" -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File \"#{filename}\""
|
|
175
|
-
|
|
176
|
-
|
|
188
|
+
stdout, stderr = Facter::Core::Execution.execute_command(shell_command)
|
|
189
|
+
log_stderr(stderr, shell_command, filename)
|
|
190
|
+
parse_executable_output(stdout)
|
|
177
191
|
end
|
|
178
192
|
end
|
|
179
193
|
|
|
@@ -11,6 +11,9 @@ module Facts
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def call_the_resolver
|
|
14
|
+
chassis_serial = Facter::Resolvers::Solaris::Ldom.resolve(:chassis_serial)
|
|
15
|
+
return Facter::ResolvedFact.new(FACT_NAME, nil) if !chassis_serial || chassis_serial.empty?
|
|
16
|
+
|
|
14
17
|
fact_value = %i[
|
|
15
18
|
chassis_serial control_domain domain_name
|
|
16
19
|
domain_uuid role_control role_io role_root role_service
|
|
@@ -10,8 +10,11 @@ module Facts
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def call_the_resolver
|
|
13
|
+
chassis_serial = resolve(:chassis_serial)
|
|
14
|
+
return Facter::ResolvedFact.new(FACT_NAME, nil) if !chassis_serial || chassis_serial.empty?
|
|
15
|
+
|
|
13
16
|
fact_value = {
|
|
14
|
-
domainchassis:
|
|
17
|
+
domainchassis: chassis_serial,
|
|
15
18
|
domaincontrol: resolve(:control_domain),
|
|
16
19
|
domainname: resolve(:domain_name),
|
|
17
20
|
domainrole: {
|
|
@@ -79,11 +79,6 @@ module Facter
|
|
|
79
79
|
type: :boolean,
|
|
80
80
|
desc: 'Show legacy facts when querying all facts.'
|
|
81
81
|
|
|
82
|
-
class_option :puppet,
|
|
83
|
-
type: :boolean,
|
|
84
|
-
aliases: '-p',
|
|
85
|
-
desc: 'Load the Puppet libraries, thus allowing Facter to load Puppet-specific facts.'
|
|
86
|
-
|
|
87
82
|
class_option :yaml,
|
|
88
83
|
aliases: '-y',
|
|
89
84
|
type: :boolean,
|
|
@@ -98,6 +93,10 @@ module Facter
|
|
|
98
93
|
aliases: '-t',
|
|
99
94
|
desc: 'Show how much time it took to resolve each fact'
|
|
100
95
|
|
|
96
|
+
class_option :sequential,
|
|
97
|
+
type: :boolean,
|
|
98
|
+
desc: 'Resolve facts sequentially'
|
|
99
|
+
|
|
101
100
|
desc '--man', 'Display manual.', hide: true
|
|
102
101
|
map ['--man'] => :man
|
|
103
102
|
def man(*args)
|
|
@@ -157,6 +156,20 @@ module Facter
|
|
|
157
156
|
puts cache_groups
|
|
158
157
|
end
|
|
159
158
|
|
|
159
|
+
desc '--puppet, -p', '(NOT SUPPORTED)Load the Puppet libraries, thus allowing Facter to load Puppet-specific facts.'
|
|
160
|
+
map ['--puppet', '-p'] => :puppet
|
|
161
|
+
def puppet(*args)
|
|
162
|
+
log = Log.new(self)
|
|
163
|
+
log.warn('`facter --puppet` and `facter -p` are no longer supported, use `puppet facts show` instead')
|
|
164
|
+
log.warn('the output does not contain puppet facts!')
|
|
165
|
+
|
|
166
|
+
output, status = Facter.to_user_output(@options, *args)
|
|
167
|
+
puts output
|
|
168
|
+
|
|
169
|
+
status = 1 if Facter::Log.errors?
|
|
170
|
+
exit status
|
|
171
|
+
end
|
|
172
|
+
|
|
160
173
|
desc 'help', 'Help for all arguments'
|
|
161
174
|
def help(*args)
|
|
162
175
|
help_string = +''
|
|
@@ -201,6 +214,7 @@ module Facter
|
|
|
201
214
|
end
|
|
202
215
|
|
|
203
216
|
def build_option(name, aliases, description)
|
|
217
|
+
name = name.tr('_', '-')
|
|
204
218
|
help_option = +''
|
|
205
219
|
help_option << aliases.join(',').rjust(10)
|
|
206
220
|
help_option << ' '
|
|
@@ -4,10 +4,9 @@ require 'facter/config'
|
|
|
4
4
|
|
|
5
5
|
module Facter
|
|
6
6
|
class FactGroups
|
|
7
|
+
attr_accessor :groups_ttls
|
|
7
8
|
attr_reader :groups, :block_list, :facts_ttls
|
|
8
9
|
|
|
9
|
-
@groups_ttls = []
|
|
10
|
-
|
|
11
10
|
STRING_TO_SECONDS = { 'seconds' => 1, 'minutes' => 60, 'hours' => 3600, 'days' => 3600 * 24 }.freeze
|
|
12
11
|
|
|
13
12
|
def initialize
|
|
@@ -38,7 +37,10 @@ module Facter
|
|
|
38
37
|
fact = get_fact(fact_name)
|
|
39
38
|
return fact[:group] if fact
|
|
40
39
|
|
|
41
|
-
@groups.detect { |k, v| break k if Array(v).find { |f| fact_name =~ /^#{f}.*/ } }
|
|
40
|
+
# @groups.detect { |k, v| break k if Array(v).find { |f| fact_name =~ /^#{f}.*/ } }
|
|
41
|
+
@groups.detect do |k, v|
|
|
42
|
+
break k if Array(v).find { |f| fact_name.include?('.*') ? fact_name == f : fact_name =~ /^#{f}.*/ }
|
|
43
|
+
end
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
# Get config ttls for a given group
|
|
@@ -10,7 +10,7 @@ module Facter
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def resolve_facts(searched_facts)
|
|
13
|
-
return searched_facts, [] if !File.directory?(@cache_dir) || !Options[:cache]
|
|
13
|
+
return searched_facts, [] if (!File.directory?(@cache_dir) || !Options[:cache]) && Options[:ttls].any?
|
|
14
14
|
|
|
15
15
|
facts = []
|
|
16
16
|
searched_facts.delete_if do |fact|
|
|
@@ -27,8 +27,9 @@ module Facter
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def cache_facts(resolved_facts)
|
|
30
|
-
return unless Options[:cache]
|
|
30
|
+
return unless Options[:cache] && Options[:ttls].any?
|
|
31
31
|
|
|
32
|
+
@groups = {}
|
|
32
33
|
resolved_facts.each do |fact|
|
|
33
34
|
cache_fact(fact)
|
|
34
35
|
end
|
|
@@ -48,8 +49,8 @@ module Facter
|
|
|
48
49
|
false
|
|
49
50
|
end
|
|
50
51
|
|
|
51
|
-
fact_group = @fact_groups.get_fact_group(fact_name)
|
|
52
|
-
delete_cache(fact_group) if fact_group && !cached
|
|
52
|
+
# fact_group = @fact_groups.get_fact_group(fact_name)
|
|
53
|
+
# delete_cache(fact_group) if fact_group && !cached
|
|
53
54
|
cached
|
|
54
55
|
end
|
|
55
56
|
|
|
@@ -66,6 +67,8 @@ module Facter
|
|
|
66
67
|
|
|
67
68
|
fact = @fact_groups.get_fact(fact_name)
|
|
68
69
|
|
|
70
|
+
return if external_fact_in_custom_group?(searched_fact, fact_name, fact)
|
|
71
|
+
|
|
69
72
|
return unless fact
|
|
70
73
|
|
|
71
74
|
return unless check_ttls?(fact[:group], fact[:ttls])
|
|
@@ -73,6 +76,16 @@ module Facter
|
|
|
73
76
|
read_fact(searched_fact, fact[:group])
|
|
74
77
|
end
|
|
75
78
|
|
|
79
|
+
def external_fact_in_custom_group?(searched_fact, fact_name, fact)
|
|
80
|
+
if searched_fact.type == :file && fact[:group] != fact_name
|
|
81
|
+
@log.error("Cannot cache '#{fact_name}' fact from '#{fact[:group]}' group. "\
|
|
82
|
+
'Caching custom group is not supported for external facts.')
|
|
83
|
+
return true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
false
|
|
87
|
+
end
|
|
88
|
+
|
|
76
89
|
def read_fact(searched_fact, fact_group)
|
|
77
90
|
data = nil
|
|
78
91
|
Facter::Framework::Benchmarking::Timer.measure(searched_fact.name, 'cached') do
|
|
@@ -80,27 +93,53 @@ module Facter
|
|
|
80
93
|
end
|
|
81
94
|
return unless data
|
|
82
95
|
|
|
96
|
+
unless searched_fact.file
|
|
97
|
+
return unless valid_format_version?(searched_fact, data, fact_group)
|
|
98
|
+
|
|
99
|
+
delete_cache(fact_group) unless data.keys.grep(/#{searched_fact.name}/).any?
|
|
100
|
+
# data.fetch(searched_fact.name) { delete_cache(fact_group) }
|
|
101
|
+
end
|
|
102
|
+
|
|
83
103
|
@log.debug("loading cached values for #{searched_fact.name} facts")
|
|
84
104
|
|
|
85
105
|
create_facts(searched_fact, data)
|
|
86
106
|
end
|
|
87
107
|
|
|
108
|
+
def valid_format_version?(searched_fact, data, fact_group)
|
|
109
|
+
unless data['cache_format_version'] == 1
|
|
110
|
+
@log.debug("The fact #{searched_fact.name} could not be read from the cache, \
|
|
111
|
+
cache_format_version is incorrect!")
|
|
112
|
+
delete_cache(fact_group)
|
|
113
|
+
return false
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
true
|
|
117
|
+
end
|
|
118
|
+
|
|
88
119
|
def create_facts(searched_fact, data)
|
|
89
120
|
if searched_fact.type == :file
|
|
90
|
-
|
|
91
|
-
data.each do |fact_name, fact_value|
|
|
92
|
-
fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type,
|
|
93
|
-
searched_fact.user_query, searched_fact.filter_tokens)
|
|
94
|
-
fact.file = searched_fact.file
|
|
95
|
-
facts << fact
|
|
96
|
-
end
|
|
97
|
-
facts
|
|
121
|
+
resolve_external_fact(searched_fact, data)
|
|
98
122
|
else
|
|
123
|
+
return unless data[searched_fact.name]
|
|
124
|
+
|
|
99
125
|
[Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type,
|
|
100
126
|
searched_fact.user_query, searched_fact.filter_tokens)]
|
|
101
127
|
end
|
|
102
128
|
end
|
|
103
129
|
|
|
130
|
+
def resolve_external_fact(searched_fact, data)
|
|
131
|
+
facts = []
|
|
132
|
+
data.each do |fact_name, fact_value|
|
|
133
|
+
next if fact_name == 'cache_format_version'
|
|
134
|
+
|
|
135
|
+
fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type,
|
|
136
|
+
searched_fact.user_query, searched_fact.filter_tokens)
|
|
137
|
+
fact.file = searched_fact.file
|
|
138
|
+
facts << fact
|
|
139
|
+
end
|
|
140
|
+
facts
|
|
141
|
+
end
|
|
142
|
+
|
|
104
143
|
def cache_fact(fact)
|
|
105
144
|
fact_name = if fact.file
|
|
106
145
|
File.basename(fact.file)
|
|
@@ -110,7 +149,7 @@ module Facter
|
|
|
110
149
|
|
|
111
150
|
group_name = @fact_groups.get_fact_group(fact_name)
|
|
112
151
|
|
|
113
|
-
return
|
|
152
|
+
return unless group_name
|
|
114
153
|
|
|
115
154
|
return unless fact_cache_enabled?(fact_name)
|
|
116
155
|
|
|
@@ -131,6 +170,8 @@ module Facter
|
|
|
131
170
|
next if File.readable?(cache_file_name)
|
|
132
171
|
|
|
133
172
|
@log.debug("caching values for #{group_name} facts")
|
|
173
|
+
|
|
174
|
+
data['cache_format_version'] = 1
|
|
134
175
|
File.write(cache_file_name, JSON.pretty_generate(data))
|
|
135
176
|
end
|
|
136
177
|
end
|
|
@@ -142,7 +183,7 @@ module Facter
|
|
|
142
183
|
data = nil
|
|
143
184
|
file = Util::FileHelper.safe_read(cache_file_name)
|
|
144
185
|
begin
|
|
145
|
-
data = JSON.parse(file)
|
|
186
|
+
data = JSON.parse(file) unless file.nil?
|
|
146
187
|
rescue JSON::ParserError
|
|
147
188
|
delete_cache(group_name)
|
|
148
189
|
end
|
|
@@ -161,12 +202,13 @@ module Facter
|
|
|
161
202
|
File.delete(cache_file_name)
|
|
162
203
|
end
|
|
163
204
|
|
|
164
|
-
@log.debug("#{group_name} facts cache file expired
|
|
205
|
+
@log.debug("#{group_name} facts cache file expired, missing or is corrupt")
|
|
165
206
|
true
|
|
166
207
|
end
|
|
167
208
|
|
|
168
209
|
def delete_cache(group_name)
|
|
169
210
|
cache_file_name = File.join(@cache_dir, group_name)
|
|
211
|
+
|
|
170
212
|
File.delete(cache_file_name) if File.readable?(cache_file_name)
|
|
171
213
|
end
|
|
172
214
|
end
|