facter 4.0.40 → 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 +72 -19
- data/lib/facter/config.rb +355 -0
- data/lib/facter/custom_facts/core/aggregate.rb +51 -17
- data/lib/facter/custom_facts/core/execution.rb +54 -38
- data/lib/facter/custom_facts/core/execution/base.rb +46 -40
- data/lib/facter/custom_facts/util/fact.rb +1 -1
- data/lib/facter/custom_facts/util/parser.rb +17 -3
- data/lib/facter/custom_facts/util/resolution.rb +40 -11
- data/lib/facter/facts/linux/ec2_metadata.rb +5 -30
- data/lib/facter/facts/linux/ec2_userdata.rb +5 -28
- data/lib/facter/facts/linux/is_virtual.rb +7 -46
- data/lib/facter/facts/linux/virtual.rb +3 -58
- data/lib/facter/facts/rhel/os/release.rb +1 -1
- data/lib/facter/facts/solaris/hypervisors/ldom.rb +3 -0
- data/lib/facter/facts/solaris/ldom.rb +4 -1
- data/lib/facter/facts/solaris/zones.rb +1 -1
- data/lib/facter/facts_utils/virtual_detector.rb +78 -0
- data/lib/facter/framework/benchmarking/timer.rb +4 -2
- data/lib/facter/framework/cli/cli.rb +19 -5
- data/lib/facter/framework/config/fact_groups.rb +10 -8
- data/lib/facter/framework/core/cache_manager.rb +78 -28
- 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 +40 -20
- data/lib/facter/framework/detector/os_hierarchy.rb +5 -9
- data/lib/facter/resolvers/aio_agent_version.rb +1 -1
- data/lib/facter/resolvers/aix/architecture_resolver.rb +17 -2
- 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 +2 -2
- 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 +8 -2
- data/lib/facter/resolvers/base_resolver.rb +11 -4
- data/lib/facter/resolvers/bsd/processors.rb +13 -8
- 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 +15 -4
- data/lib/facter/resolvers/dmi_decode.rb +2 -1
- data/lib/facter/resolvers/dmi_resolver.rb +4 -3
- 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 +14 -21
- data/lib/facter/resolvers/freebsd/processors.rb +13 -8
- 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 +15 -15
- data/lib/facter/resolvers/mountpoints_resolver.rb +54 -23
- data/lib/facter/resolvers/networking_linux_resolver.rb +15 -9
- 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 +62 -58
- data/lib/facter/resolvers/path_resolver.rb +1 -1
- data/lib/facter/resolvers/processors_resolver.rb +9 -2
- 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 +3 -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 +60 -0
- data/lib/facter/resolvers/solaris/networking.rb +2 -3
- data/lib/facter/resolvers/solaris/os_release.rb +6 -4
- 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 +8 -5
- 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 +7 -5
- data/lib/facter/fact_groups.conf +0 -308
- data/lib/facter/os_hierarchy.json +0 -36
|
@@ -7,11 +7,13 @@ module Facter
|
|
|
7
7
|
module Benchmarking
|
|
8
8
|
class Timer
|
|
9
9
|
class << self
|
|
10
|
-
def measure(fact_name)
|
|
10
|
+
def measure(fact_name, prefix_message = '')
|
|
11
11
|
if Options[:timing]
|
|
12
12
|
time = Benchmark.measure { yield }
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
log = "fact '#{fact_name}', took: #{time.format('%r')} seconds"
|
|
15
|
+
prefix_message = "#{prefix_message} " unless prefix_message.empty?
|
|
16
|
+
puts "#{prefix_message}#{log}"
|
|
15
17
|
else
|
|
16
18
|
yield
|
|
17
19
|
end
|
|
@@ -75,11 +75,6 @@ module Facter
|
|
|
75
75
|
type: :boolean,
|
|
76
76
|
desc: 'Enable verbose (info) output.'
|
|
77
77
|
|
|
78
|
-
class_option :puppet,
|
|
79
|
-
type: :boolean,
|
|
80
|
-
aliases: '-p',
|
|
81
|
-
desc: 'Load the Puppet libraries, thus allowing Facter to load Puppet-specific facts.'
|
|
82
|
-
|
|
83
78
|
class_option :show_legacy,
|
|
84
79
|
type: :boolean,
|
|
85
80
|
desc: 'Show legacy facts when querying all facts.'
|
|
@@ -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 << ' '
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'facter/config'
|
|
4
|
+
|
|
3
5
|
module Facter
|
|
4
6
|
class FactGroups
|
|
7
|
+
attr_accessor :groups_ttls
|
|
5
8
|
attr_reader :groups, :block_list, :facts_ttls
|
|
6
9
|
|
|
7
|
-
@groups_ttls = []
|
|
8
|
-
|
|
9
10
|
STRING_TO_SECONDS = { 'seconds' => 1, 'minutes' => 60, 'hours' => 3600, 'days' => 3600 * 24 }.freeze
|
|
10
11
|
|
|
11
|
-
def initialize
|
|
12
|
-
|
|
13
|
-
@groups_file_path = group_list_path || default_path
|
|
14
|
-
@groups ||= File.readable?(@groups_file_path) ? Hocon.load(@groups_file_path) : {}
|
|
12
|
+
def initialize
|
|
13
|
+
@groups = Facter::Config::FACT_GROUPS.dup
|
|
15
14
|
load_groups
|
|
16
15
|
load_groups_from_options
|
|
17
16
|
load_facts_ttls
|
|
@@ -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
|
|
@@ -91,7 +93,7 @@ module Facter
|
|
|
91
93
|
|
|
92
94
|
def load_groups
|
|
93
95
|
config = ConfigReader.init(Options[:config])
|
|
94
|
-
@block_list = config.block_list ||
|
|
96
|
+
@block_list = config.block_list || []
|
|
95
97
|
@groups_ttls = config.ttls || []
|
|
96
98
|
@groups.merge!(config.fact_groups) if config.fact_groups
|
|
97
99
|
end
|
|
@@ -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,21 +49,25 @@ 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
|
|
|
56
57
|
private
|
|
57
58
|
|
|
58
59
|
def resolve_fact(searched_fact)
|
|
59
|
-
|
|
60
|
+
fact_name = if searched_fact.file
|
|
61
|
+
File.basename(searched_fact.file)
|
|
62
|
+
else
|
|
63
|
+
searched_fact.name
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
return unless fact_cache_enabled?(fact_name)
|
|
67
|
+
|
|
68
|
+
fact = @fact_groups.get_fact(fact_name)
|
|
60
69
|
|
|
61
|
-
|
|
62
|
-
@fact_groups.get_fact(File.basename(searched_fact.file))
|
|
63
|
-
else
|
|
64
|
-
@fact_groups.get_fact(searched_fact.name)
|
|
65
|
-
end
|
|
70
|
+
return if external_fact_in_custom_group?(searched_fact, fact_name, fact)
|
|
66
71
|
|
|
67
72
|
return unless fact
|
|
68
73
|
|
|
@@ -71,40 +76,82 @@ module Facter
|
|
|
71
76
|
read_fact(searched_fact, fact[:group])
|
|
72
77
|
end
|
|
73
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
|
+
|
|
74
89
|
def read_fact(searched_fact, fact_group)
|
|
75
|
-
data =
|
|
90
|
+
data = nil
|
|
91
|
+
Facter::Framework::Benchmarking::Timer.measure(searched_fact.name, 'cached') do
|
|
92
|
+
data = read_group_json(fact_group)
|
|
93
|
+
end
|
|
76
94
|
return unless data
|
|
77
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
|
+
|
|
78
103
|
@log.debug("loading cached values for #{searched_fact.name} facts")
|
|
79
104
|
|
|
80
105
|
create_facts(searched_fact, data)
|
|
81
106
|
end
|
|
82
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
|
+
|
|
83
119
|
def create_facts(searched_fact, data)
|
|
84
120
|
if searched_fact.type == :file
|
|
85
|
-
|
|
86
|
-
data.each do |fact_name, fact_value|
|
|
87
|
-
fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type,
|
|
88
|
-
searched_fact.user_query, searched_fact.filter_tokens)
|
|
89
|
-
fact.file = searched_fact.file
|
|
90
|
-
facts << fact
|
|
91
|
-
end
|
|
92
|
-
facts
|
|
121
|
+
resolve_external_fact(searched_fact, data)
|
|
93
122
|
else
|
|
123
|
+
return unless data[searched_fact.name]
|
|
124
|
+
|
|
94
125
|
[Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type,
|
|
95
126
|
searched_fact.user_query, searched_fact.filter_tokens)]
|
|
96
127
|
end
|
|
97
128
|
end
|
|
98
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
|
+
|
|
99
143
|
def cache_fact(fact)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
144
|
+
fact_name = if fact.file
|
|
145
|
+
File.basename(fact.file)
|
|
146
|
+
else
|
|
147
|
+
fact.name
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
group_name = @fact_groups.get_fact_group(fact_name)
|
|
106
151
|
|
|
107
|
-
return unless
|
|
152
|
+
return unless group_name
|
|
153
|
+
|
|
154
|
+
return unless fact_cache_enabled?(fact_name)
|
|
108
155
|
|
|
109
156
|
@groups[group_name] ||= {}
|
|
110
157
|
@groups[group_name][fact.name] = fact.value
|
|
@@ -123,6 +170,8 @@ module Facter
|
|
|
123
170
|
next if File.readable?(cache_file_name)
|
|
124
171
|
|
|
125
172
|
@log.debug("caching values for #{group_name} facts")
|
|
173
|
+
|
|
174
|
+
data['cache_format_version'] = 1
|
|
126
175
|
File.write(cache_file_name, JSON.pretty_generate(data))
|
|
127
176
|
end
|
|
128
177
|
end
|
|
@@ -134,7 +183,7 @@ module Facter
|
|
|
134
183
|
data = nil
|
|
135
184
|
file = Util::FileHelper.safe_read(cache_file_name)
|
|
136
185
|
begin
|
|
137
|
-
data = JSON.parse(file)
|
|
186
|
+
data = JSON.parse(file) unless file.nil?
|
|
138
187
|
rescue JSON::ParserError
|
|
139
188
|
delete_cache(group_name)
|
|
140
189
|
end
|
|
@@ -153,12 +202,13 @@ module Facter
|
|
|
153
202
|
File.delete(cache_file_name)
|
|
154
203
|
end
|
|
155
204
|
|
|
156
|
-
@log.debug("#{group_name} facts cache file expired
|
|
205
|
+
@log.debug("#{group_name} facts cache file expired, missing or is corrupt")
|
|
157
206
|
true
|
|
158
207
|
end
|
|
159
208
|
|
|
160
209
|
def delete_cache(group_name)
|
|
161
210
|
cache_file_name = File.join(@cache_dir, group_name)
|
|
211
|
+
|
|
162
212
|
File.delete(cache_file_name) if File.readable?(cache_file_name)
|
|
163
213
|
end
|
|
164
214
|
end
|
|
@@ -11,7 +11,12 @@ module Facter
|
|
|
11
11
|
|
|
12
12
|
return unless fact_class
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
fact_value = nil
|
|
15
|
+
Facter::Framework::Benchmarking::Timer.measure(@searched_fact.name) do
|
|
16
|
+
fact_value = fact_class.new.call_the_resolver
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
fact_value
|
|
15
20
|
end
|
|
16
21
|
end
|
|
17
22
|
end
|
|
@@ -7,7 +7,15 @@ module Facter
|
|
|
7
7
|
def resolve_facts(searched_facts)
|
|
8
8
|
internal_searched_facts = filter_internal_facts(searched_facts)
|
|
9
9
|
|
|
10
|
-
resolved_facts =
|
|
10
|
+
resolved_facts = if Options[:sequential]
|
|
11
|
+
@@log.debug('Resolving facts sequentially')
|
|
12
|
+
resolve_sequentially(internal_searched_facts)
|
|
13
|
+
else
|
|
14
|
+
@@log.debug('Resolving fact in parallel')
|
|
15
|
+
threads = start_threads(internal_searched_facts)
|
|
16
|
+
join_threads(threads, internal_searched_facts)
|
|
17
|
+
end
|
|
18
|
+
|
|
11
19
|
nil_resolved_facts = resolve_nil_facts(searched_facts)
|
|
12
20
|
|
|
13
21
|
resolved_facts.concat(nil_resolved_facts)
|
|
@@ -28,7 +36,7 @@ module Facter
|
|
|
28
36
|
resolved_facts
|
|
29
37
|
end
|
|
30
38
|
|
|
31
|
-
def
|
|
39
|
+
def resolve_sequentially(searched_facts)
|
|
32
40
|
resolved_facts = []
|
|
33
41
|
|
|
34
42
|
searched_facts
|
|
@@ -36,8 +44,7 @@ module Facter
|
|
|
36
44
|
.each do |searched_fact|
|
|
37
45
|
begin
|
|
38
46
|
fact = CoreFact.new(searched_fact)
|
|
39
|
-
fact_value =
|
|
40
|
-
Facter::Framework::Benchmarking::Timer.measure(searched_fact.name) { fact_value = fact.create }
|
|
47
|
+
fact_value = fact.create
|
|
41
48
|
resolved_facts << fact_value unless fact_value.nil?
|
|
42
49
|
rescue StandardError => e
|
|
43
50
|
@@log.log_exception(e)
|
|
@@ -47,5 +54,32 @@ module Facter
|
|
|
47
54
|
resolved_facts.flatten!
|
|
48
55
|
FactAugmenter.augment_resolved_facts(searched_facts, resolved_facts)
|
|
49
56
|
end
|
|
57
|
+
|
|
58
|
+
def start_threads(searched_facts)
|
|
59
|
+
# only resolve a fact once, even if multiple search facts depend on that fact
|
|
60
|
+
searched_facts
|
|
61
|
+
.uniq { |searched_fact| searched_fact.fact_class.name }
|
|
62
|
+
.map do |searched_fact|
|
|
63
|
+
Thread.new do
|
|
64
|
+
resolve_fact(searched_fact)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def join_threads(threads, searched_facts)
|
|
70
|
+
resolved_facts = threads.map(&:value)
|
|
71
|
+
resolved_facts.compact!
|
|
72
|
+
resolved_facts.flatten!
|
|
73
|
+
|
|
74
|
+
FactAugmenter.augment_resolved_facts(searched_facts, resolved_facts)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def resolve_fact(searched_fact)
|
|
78
|
+
fact = CoreFact.new(searched_fact)
|
|
79
|
+
fact.create
|
|
80
|
+
rescue StandardError => e
|
|
81
|
+
@@log.log_exception(e)
|
|
82
|
+
nil
|
|
83
|
+
end
|
|
50
84
|
end
|
|
51
85
|
end
|
|
@@ -16,7 +16,7 @@ module Facter
|
|
|
16
16
|
private_class_method def self.get_resolved_facts_for_searched_fact(searched_fact, resolved_facts)
|
|
17
17
|
if searched_fact.name.include?('.*')
|
|
18
18
|
resolved_facts
|
|
19
|
-
.select { |resolved_fact| resolved_fact.name.match(searched_fact.
|
|
19
|
+
.select { |resolved_fact| resolved_fact.name.match(searched_fact.name) }
|
|
20
20
|
.reject(&:user_query)
|
|
21
21
|
.uniq(&:name)
|
|
22
22
|
else
|
|
@@ -27,8 +27,8 @@ module Facter
|
|
|
27
27
|
|
|
28
28
|
resolved_facts = override_core_facts(internal_facts, external_facts)
|
|
29
29
|
|
|
30
|
-
cache_manager.cache_facts(resolved_facts)
|
|
31
30
|
resolved_facts = resolved_facts.concat(cached_facts)
|
|
31
|
+
cache_manager.cache_facts(resolved_facts)
|
|
32
32
|
|
|
33
33
|
FactFilter.new.filter_facts!(resolved_facts)
|
|
34
34
|
|
|
@@ -19,14 +19,18 @@ module Facter
|
|
|
19
19
|
private
|
|
20
20
|
|
|
21
21
|
def augment_all
|
|
22
|
-
if Options.cli?
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
augment_cli(Facter::ConfigReader.cli) if Options.cli?
|
|
23
|
+
augment_globals
|
|
24
|
+
augment_facts(Facter::ConfigReader.ttls, Facter::ConfigReader.fact_groups)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def augment_globals
|
|
28
|
+
augment_ruby(Facter::ConfigReader.global)
|
|
29
|
+
|
|
26
30
|
augment_custom(Facter::ConfigReader.global)
|
|
27
31
|
augment_external(Facter::ConfigReader.global)
|
|
28
32
|
augment_show_legacy(Facter::ConfigReader.global)
|
|
29
|
-
|
|
33
|
+
augment_sequential(Facter::ConfigReader.global)
|
|
30
34
|
end
|
|
31
35
|
|
|
32
36
|
def augment_config_path(config_path)
|
|
@@ -68,6 +72,7 @@ module Facter
|
|
|
68
72
|
|
|
69
73
|
def augment_ruby(global_conf)
|
|
70
74
|
return unless global_conf
|
|
75
|
+
return unless Options.cli?
|
|
71
76
|
|
|
72
77
|
@options[:no_ruby] = global_conf['no-ruby'].nil? ? false : global_conf['no-ruby']
|
|
73
78
|
end
|
|
@@ -78,6 +83,12 @@ module Facter
|
|
|
78
83
|
@options[:show_legacy] = global_conf['show-legacy'] unless global_conf['show-legacy'].nil?
|
|
79
84
|
end
|
|
80
85
|
|
|
86
|
+
def augment_sequential(global_conf)
|
|
87
|
+
return unless global_conf
|
|
88
|
+
|
|
89
|
+
@options[:sequential] = global_conf['sequential'] unless global_conf['sequential'].nil?
|
|
90
|
+
end
|
|
91
|
+
|
|
81
92
|
def augment_facts(ttls, groups)
|
|
82
93
|
fact_groups = Facter::FactGroups.new
|
|
83
94
|
|