facter 4.0.36 → 4.0.41
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 +163 -23
- data/lib/facter/custom_facts/core/execution/base.rb +36 -6
- data/lib/facter/custom_facts/util/directory_loader.rb +10 -2
- data/lib/facter/custom_facts/util/fact.rb +4 -1
- 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/partitions.rb +1 -1
- data/lib/facter/facts/linux/virtual.rb +3 -58
- data/lib/facter/facts/rhel/os/release.rb +2 -2
- data/lib/facter/facts/solaris/disks.rb +1 -1
- data/lib/facter/facts/ubuntu/lsbdistrelease.rb +23 -0
- data/lib/facter/facts_utils/virtual_detector.rb +78 -0
- data/lib/facter/framework/benchmarking/timer.rb +23 -0
- data/lib/facter/framework/cli/cli.rb +86 -34
- 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 +30 -18
- data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +2 -1
- data/lib/facter/framework/core/fact_loaders/fact_loader.rb +14 -11
- data/lib/facter/framework/core/fact_loaders/internal_fact_loader.rb +7 -7
- data/lib/facter/framework/core/file_loader.rb +2 -0
- data/lib/facter/framework/core/options/config_file_options.rb +5 -3
- data/lib/facter/framework/core/options/option_store.rb +30 -11
- data/lib/facter/framework/core/session_cache.rb +1 -4
- data/lib/facter/framework/logging/logger.rb +3 -11
- data/lib/facter/patches/sysfilesystem/sys/statvfs.rb +92 -0
- data/lib/facter/resolvers/aio_agent_version.rb +0 -1
- data/lib/facter/resolvers/aix/architecture_resolver.rb +0 -1
- data/lib/facter/resolvers/aix/disks.rb +2 -3
- data/lib/facter/resolvers/aix/filesystem_resolver.rb +0 -1
- data/lib/facter/resolvers/aix/hardware_resolver.rb +0 -1
- data/lib/facter/resolvers/aix/load_averages_resolver.rb +0 -1
- data/lib/facter/resolvers/aix/memory.rb +2 -3
- data/lib/facter/resolvers/aix/mountpoints.rb +0 -1
- data/lib/facter/resolvers/aix/networking_resolver.rb +0 -1
- data/lib/facter/resolvers/aix/nim.rb +0 -1
- data/lib/facter/resolvers/aix/os_level.rb +27 -0
- data/lib/facter/resolvers/aix/partitions.rb +2 -3
- data/lib/facter/resolvers/aix/processors.rb +0 -1
- data/lib/facter/resolvers/aix/serialnumber.rb +0 -1
- data/lib/facter/resolvers/augeas_resolver.rb +0 -1
- data/lib/facter/resolvers/base_resolver.rb +9 -4
- data/lib/facter/resolvers/bsd/processors.rb +0 -1
- data/lib/facter/resolvers/cloud.rb +39 -0
- data/lib/facter/resolvers/containers.rb +0 -1
- data/lib/facter/resolvers/debian_version.rb +0 -1
- data/lib/facter/resolvers/disk_resolver.rb +0 -1
- data/lib/facter/resolvers/dmi_decode.rb +1 -1
- data/lib/facter/resolvers/dmi_resolver.rb +0 -1
- data/lib/facter/resolvers/ec2.rb +0 -1
- data/lib/facter/resolvers/eos_release_resolver.rb +0 -1
- data/lib/facter/resolvers/facterversion_resolver.rb +0 -1
- data/lib/facter/resolvers/filesystems_resolver.rb +0 -1
- data/lib/facter/resolvers/fips_enabled_resolver.rb +0 -1
- data/lib/facter/resolvers/freebsd/dmi_resolver.rb +0 -1
- data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +0 -1
- data/lib/facter/resolvers/freebsd/geom_resolver.rb +0 -1
- data/lib/facter/resolvers/freebsd/processors.rb +0 -1
- data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +0 -1
- data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +0 -1
- data/lib/facter/resolvers/gce.rb +0 -1
- data/lib/facter/resolvers/hostname_resolver.rb +0 -1
- data/lib/facter/resolvers/identity_resolver.rb +0 -1
- data/lib/facter/resolvers/linux/docker_uptime.rb +0 -1
- data/lib/facter/resolvers/linux/load_averages.rb +0 -1
- data/lib/facter/resolvers/load_averages.rb +0 -1
- data/lib/facter/resolvers/lpar_resolver.rb +0 -1
- data/lib/facter/resolvers/lsb_release_resolver.rb +0 -1
- data/lib/facter/resolvers/lspci.rb +0 -1
- data/lib/facter/resolvers/macosx/dmi_resolver.rb +0 -1
- data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -6
- data/lib/facter/resolvers/macosx/load_averages_resolver.rb +0 -1
- data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +3 -3
- data/lib/facter/resolvers/macosx/processor_resolver.rb +0 -1
- data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +0 -1
- data/lib/facter/resolvers/macosx/system_memory_resolver.rb +0 -1
- data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +0 -1
- data/lib/facter/resolvers/memory_resolver.rb +6 -2
- data/lib/facter/resolvers/mountpoints_resolver.rb +0 -1
- data/lib/facter/resolvers/networking_linux_resolver.rb +0 -2
- data/lib/facter/resolvers/networking_resolver.rb +0 -1
- data/lib/facter/resolvers/open_vz.rb +0 -1
- data/lib/facter/resolvers/os_release_resolver.rb +0 -1
- data/lib/facter/resolvers/partitions.rb +37 -2
- data/lib/facter/resolvers/path_resolver.rb +0 -1
- data/lib/facter/resolvers/processors_resolver.rb +0 -1
- data/lib/facter/resolvers/puppet_version_resolver.rb +0 -1
- data/lib/facter/resolvers/redhat_release_resolver.rb +0 -1
- data/lib/facter/resolvers/ruby_resolver.rb +0 -1
- data/lib/facter/resolvers/selinux_resolver.rb +0 -1
- data/lib/facter/resolvers/solaris/disks.rb +0 -1
- data/lib/facter/resolvers/solaris/dmi.rb +0 -1
- data/lib/facter/resolvers/solaris/dmi_sparc.rb +0 -1
- data/lib/facter/resolvers/solaris/filesystems.rb +0 -1
- data/lib/facter/resolvers/solaris/ipaddress.rb +0 -1
- data/lib/facter/resolvers/solaris/ldom.rb +0 -1
- data/lib/facter/resolvers/solaris/memory.rb +0 -1
- data/lib/facter/resolvers/solaris/networking.rb +0 -1
- data/lib/facter/resolvers/solaris/os_release.rb +0 -1
- data/lib/facter/resolvers/solaris/processors.rb +0 -1
- data/lib/facter/resolvers/solaris/zone.rb +0 -1
- data/lib/facter/resolvers/solaris/zone_name.rb +0 -1
- data/lib/facter/resolvers/ssh_resolver.rb +0 -1
- data/lib/facter/resolvers/suse_release_resolver.rb +0 -1
- data/lib/facter/resolvers/sw_vers_resolver.rb +0 -1
- data/lib/facter/resolvers/timezone_resolver.rb +0 -1
- data/lib/facter/resolvers/uname_resolver.rb +0 -1
- data/lib/facter/resolvers/uptime_resolver.rb +0 -1
- data/lib/facter/resolvers/utils/filesystem_helper.rb +3 -1
- data/lib/facter/resolvers/virt_what.rb +0 -1
- data/lib/facter/resolvers/vmware.rb +0 -1
- data/lib/facter/resolvers/windows/aio_agent_version.rb +0 -1
- data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/fips_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/identity_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/kernel_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/memory_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/netkvm_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/networking_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/processors_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/product_release_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/ssh.rb +0 -1
- data/lib/facter/resolvers/windows/system32_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/uptime_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/virtualization_resolver.rb +0 -1
- data/lib/facter/resolvers/windows/win_os_description_resolver.rb +0 -1
- data/lib/facter/resolvers/wpar_resolver.rb +0 -1
- data/lib/facter/resolvers/xen.rb +0 -1
- data/lib/facter/resolvers/zfs.rb +0 -1
- data/lib/facter/resolvers/zpool.rb +0 -1
- data/lib/facter/version.rb +1 -1
- metadata +9 -4
- data/lib/facter/resolvers/aix/os_level_resolver.rb +0 -26
- data/lib/facter/resolvers/os_level_resolver.rb +0 -29
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
|
+
require 'thor'
|
|
5
|
+
|
|
4
6
|
module Facter
|
|
5
7
|
class Cli < Thor
|
|
6
|
-
check_unknown_options!
|
|
7
|
-
|
|
8
8
|
class_option :color,
|
|
9
9
|
type: :boolean,
|
|
10
10
|
desc: 'Enable color output.'
|
|
11
11
|
|
|
12
|
+
class_option :no_color,
|
|
13
|
+
type: :boolean,
|
|
14
|
+
desc: 'Disable color output.'
|
|
15
|
+
|
|
12
16
|
class_option :config,
|
|
13
17
|
aliases: '-c',
|
|
14
18
|
type: :string,
|
|
@@ -29,17 +33,6 @@ module Facter
|
|
|
29
33
|
repeatable: true,
|
|
30
34
|
desc: 'A directory to use for external facts.'
|
|
31
35
|
|
|
32
|
-
class_option :help,
|
|
33
|
-
hide: true,
|
|
34
|
-
aliases: '-h',
|
|
35
|
-
type: :boolean,
|
|
36
|
-
desc: 'Print this help message.'
|
|
37
|
-
|
|
38
|
-
class_option :man,
|
|
39
|
-
hide: true,
|
|
40
|
-
type: :boolean,
|
|
41
|
-
desc: 'Display manual.'
|
|
42
|
-
|
|
43
36
|
class_option :hocon,
|
|
44
37
|
type: :boolean,
|
|
45
38
|
desc: 'Output in Hocon format.'
|
|
@@ -49,36 +42,28 @@ module Facter
|
|
|
49
42
|
type: :boolean,
|
|
50
43
|
desc: 'Output in JSON format.'
|
|
51
44
|
|
|
52
|
-
class_option :list_block_groups,
|
|
53
|
-
type: :boolean,
|
|
54
|
-
desc: 'List the names of all blockable fact groups.'
|
|
55
|
-
|
|
56
|
-
class_option :list_cache_groups,
|
|
57
|
-
type: :boolean,
|
|
58
|
-
desc: 'List the names of all cacheable fact groups.'
|
|
59
|
-
|
|
60
45
|
class_option :log_level,
|
|
61
46
|
aliases: '-l',
|
|
62
47
|
type: :string,
|
|
63
48
|
desc: 'Set logging level. Supported levels are: none, trace, debug, info, warn, error, and fatal.'
|
|
64
49
|
|
|
65
|
-
class_option :
|
|
50
|
+
class_option :no_block,
|
|
66
51
|
type: :boolean,
|
|
67
52
|
desc: 'Disable fact blocking.'
|
|
68
53
|
|
|
69
|
-
class_option :
|
|
54
|
+
class_option :no_cache,
|
|
70
55
|
type: :boolean,
|
|
71
56
|
desc: 'Disable loading and refreshing facts from the cache'
|
|
72
57
|
|
|
73
|
-
class_option :
|
|
58
|
+
class_option :no_custom_facts,
|
|
74
59
|
type: :boolean,
|
|
75
60
|
desc: 'Disable custom facts.'
|
|
76
61
|
|
|
77
|
-
class_option :
|
|
62
|
+
class_option :no_external_facts,
|
|
78
63
|
type: :boolean,
|
|
79
64
|
desc: 'Disable external facts.'
|
|
80
65
|
|
|
81
|
-
class_option :
|
|
66
|
+
class_option :no_ruby,
|
|
82
67
|
type: :boolean,
|
|
83
68
|
desc: 'Disable loading Ruby, facts requiring Ruby, and custom facts.'
|
|
84
69
|
|
|
@@ -90,6 +75,11 @@ module Facter
|
|
|
90
75
|
type: :boolean,
|
|
91
76
|
desc: 'Enable verbose (info) output.'
|
|
92
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
|
+
|
|
93
83
|
class_option :show_legacy,
|
|
94
84
|
type: :boolean,
|
|
95
85
|
desc: 'Show legacy facts when querying all facts.'
|
|
@@ -103,12 +93,12 @@ module Facter
|
|
|
103
93
|
type: :boolean,
|
|
104
94
|
desc: 'Enable more aggressive error reporting.'
|
|
105
95
|
|
|
106
|
-
class_option :
|
|
96
|
+
class_option :timing,
|
|
107
97
|
type: :boolean,
|
|
108
|
-
aliases: '-
|
|
109
|
-
desc: '
|
|
98
|
+
aliases: '-t',
|
|
99
|
+
desc: 'Show how much time it took to resolve each fact'
|
|
110
100
|
|
|
111
|
-
desc '--man', '
|
|
101
|
+
desc '--man', 'Display manual.', hide: true
|
|
112
102
|
map ['--man'] => :man
|
|
113
103
|
def man(*args)
|
|
114
104
|
require 'erb'
|
|
@@ -121,7 +111,6 @@ module Facter
|
|
|
121
111
|
end
|
|
122
112
|
|
|
123
113
|
desc 'query', 'Default method', hide: true
|
|
124
|
-
desc '[options] [query] [query] [...]', ''
|
|
125
114
|
def query(*args)
|
|
126
115
|
output, status = Facter.to_user_output(@options, *args)
|
|
127
116
|
puts output
|
|
@@ -130,13 +119,21 @@ module Facter
|
|
|
130
119
|
exit status
|
|
131
120
|
end
|
|
132
121
|
|
|
122
|
+
desc 'arg_parser', 'Parse arguments', hide: true
|
|
123
|
+
def arg_parser(*args)
|
|
124
|
+
# ignore unknown options
|
|
125
|
+
args.reject! { |arg| arg.start_with?('-') }
|
|
126
|
+
|
|
127
|
+
Facter.values(@options, args)
|
|
128
|
+
end
|
|
129
|
+
|
|
133
130
|
desc '--version, -v', 'Print the version', hide: true
|
|
134
131
|
map ['--version', '-v'] => :version
|
|
135
|
-
def version
|
|
132
|
+
def version(*_args)
|
|
136
133
|
puts Facter::VERSION
|
|
137
134
|
end
|
|
138
135
|
|
|
139
|
-
desc '--list-block-groups', 'List block groups'
|
|
136
|
+
desc '--list-block-groups', 'List block groups'
|
|
140
137
|
map ['--list-block-groups'] => :list_block_groups
|
|
141
138
|
def list_block_groups(*args)
|
|
142
139
|
options = @options.map { |(k, v)| [k.to_sym, v] }.to_h
|
|
@@ -148,7 +145,7 @@ module Facter
|
|
|
148
145
|
puts block_groups
|
|
149
146
|
end
|
|
150
147
|
|
|
151
|
-
desc '--list-cache-groups', 'List cache groups'
|
|
148
|
+
desc '--list-cache-groups', 'List cache groups'
|
|
152
149
|
map ['--list-cache-groups'] => :list_cache_groups
|
|
153
150
|
def list_cache_groups(*args)
|
|
154
151
|
options = @options.map { |(k, v)| [k.to_sym, v] }.to_h
|
|
@@ -160,6 +157,61 @@ module Facter
|
|
|
160
157
|
puts cache_groups
|
|
161
158
|
end
|
|
162
159
|
|
|
160
|
+
desc 'help', 'Help for all arguments'
|
|
161
|
+
def help(*args)
|
|
162
|
+
help_string = +''
|
|
163
|
+
help_string << help_header(args)
|
|
164
|
+
help_string << add_class_options_to_help
|
|
165
|
+
help_string << add_commands_to_help
|
|
166
|
+
|
|
167
|
+
puts help_string
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
no_commands do
|
|
171
|
+
def help_header(_args)
|
|
172
|
+
path = File.join(File.dirname(__FILE__), '../../')
|
|
173
|
+
|
|
174
|
+
Util::FileHelper.safe_read("#{path}fixtures/facter_help_header")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
IGNORE_OPTIONS = %w[log_level color no_color].freeze
|
|
178
|
+
|
|
179
|
+
def add_class_options_to_help
|
|
180
|
+
help_class_options = +''
|
|
181
|
+
class_options = Cli.class_options
|
|
182
|
+
class_options.each do |class_option|
|
|
183
|
+
option = class_option[1]
|
|
184
|
+
next if option.hide
|
|
185
|
+
|
|
186
|
+
help_class_options << build_option(option.name, option.aliases, option.description)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
help_class_options
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def add_commands_to_help
|
|
193
|
+
help_command_options = +''
|
|
194
|
+
Cli.commands
|
|
195
|
+
.select { |_k, command_class| command_class.instance_of?(Thor::Command) }
|
|
196
|
+
.each do |_k, command|
|
|
197
|
+
help_command_options << build_option(command['name'], [], command['description'])
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
help_command_options
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def build_option(name, aliases, description)
|
|
204
|
+
help_option = +''
|
|
205
|
+
help_option << aliases.join(',').rjust(10)
|
|
206
|
+
help_option << ' '
|
|
207
|
+
help_option << "[--#{name}]".ljust(30)
|
|
208
|
+
help_option << " #{description}"
|
|
209
|
+
help_option << "\n"
|
|
210
|
+
|
|
211
|
+
help_option
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
163
215
|
def self.exit_on_failure?
|
|
164
216
|
true
|
|
165
217
|
end
|
|
@@ -1,59 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
|
-
require 'thor'
|
|
5
4
|
require 'facter/framework/logging/logger.rb'
|
|
6
5
|
Facter::Log.output(STDERR)
|
|
7
6
|
require 'facter'
|
|
8
7
|
require 'facter/framework/cli/cli'
|
|
9
8
|
|
|
10
9
|
class CliLauncher
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
class << self
|
|
11
|
+
def prepare_arguments(args, task = Facter::Cli.default_task)
|
|
12
|
+
args.unshift(task) unless
|
|
13
|
+
check_if_arguments_is_known(Facter::Cli.all_tasks, args) ||
|
|
14
|
+
check_if_arguments_is_known(Facter::Cli.instance_variable_get(:@map), args) ||
|
|
15
|
+
!task
|
|
16
|
+
|
|
17
|
+
reorder_program_arguments(args)
|
|
18
|
+
end
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
def start(args)
|
|
21
|
+
# stop parsing arguments if we don't recognize them
|
|
22
|
+
Thor.check_unknown_options!
|
|
23
|
+
Facter::Cli.start(args, debug: true)
|
|
24
|
+
rescue Thor::UnknownArgumentError => e
|
|
25
|
+
Facter::OptionsValidator.write_error_and_exit("unrecognised option '#{e.unknown.first}'")
|
|
26
|
+
end
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
end
|
|
28
|
+
private
|
|
26
29
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
private
|
|
30
|
+
def check_if_arguments_is_known(known_arguments, program_arguments)
|
|
31
|
+
program_arguments.each do |argument|
|
|
32
|
+
return true if known_arguments.key?(argument)
|
|
33
|
+
end
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
program_arguments.each do |argument|
|
|
37
|
-
return true if known_arguments.key?(argument)
|
|
35
|
+
false
|
|
38
36
|
end
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def reorder_program_arguments(program_arguments)
|
|
44
|
-
priority_arguments = Facter::Cli.instance_variable_get(:@map)
|
|
38
|
+
def reorder_program_arguments(program_arguments)
|
|
39
|
+
priority_arguments = Facter::Cli.instance_variable_get(:@map)
|
|
45
40
|
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
priority_args = []
|
|
42
|
+
normal_args = []
|
|
48
43
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
program_arguments.each do |argument|
|
|
45
|
+
if priority_arguments.include?(argument)
|
|
46
|
+
priority_args << argument
|
|
47
|
+
else
|
|
48
|
+
normal_args << argument
|
|
49
|
+
end
|
|
54
50
|
end
|
|
55
|
-
end
|
|
56
51
|
|
|
57
|
-
|
|
52
|
+
priority_args.concat(normal_args)
|
|
53
|
+
end
|
|
58
54
|
end
|
|
59
55
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Facter
|
|
4
4
|
class FactGroups
|
|
5
|
-
attr_reader :groups, :block_list
|
|
5
|
+
attr_reader :groups, :block_list, :facts_ttls
|
|
6
6
|
|
|
7
7
|
@groups_ttls = []
|
|
8
8
|
|
|
@@ -14,6 +14,10 @@ module Facter
|
|
|
14
14
|
@groups ||= File.readable?(@groups_file_path) ? Hocon.load(@groups_file_path) : {}
|
|
15
15
|
load_groups
|
|
16
16
|
load_groups_from_options
|
|
17
|
+
load_facts_ttls
|
|
18
|
+
|
|
19
|
+
# Reverse sort facts so that children have precedence when caching. eg: os.macosx vs os
|
|
20
|
+
@facts_ttls = @facts_ttls.sort.reverse.to_h
|
|
17
21
|
end
|
|
18
22
|
|
|
19
23
|
# Breakes down blocked groups in blocked facts
|
|
@@ -31,6 +35,9 @@ module Facter
|
|
|
31
35
|
|
|
32
36
|
# Get the group name a fact is part of
|
|
33
37
|
def get_fact_group(fact_name)
|
|
38
|
+
fact = get_fact(fact_name)
|
|
39
|
+
return fact[:group] if fact
|
|
40
|
+
|
|
34
41
|
@groups.detect { |k, v| break k if Array(v).find { |f| fact_name =~ /^#{f}.*/ } }
|
|
35
42
|
end
|
|
36
43
|
|
|
@@ -41,6 +48,15 @@ module Facter
|
|
|
41
48
|
ttls_to_seconds(ttls[group_name])
|
|
42
49
|
end
|
|
43
50
|
|
|
51
|
+
def get_fact(fact_name)
|
|
52
|
+
return @facts_ttls[fact_name] if @facts_ttls[fact_name]
|
|
53
|
+
|
|
54
|
+
result = @facts_ttls.select { |name, fact| break fact if fact_name =~ /^#{name}\..*/ }
|
|
55
|
+
return nil if result == {}
|
|
56
|
+
|
|
57
|
+
result
|
|
58
|
+
end
|
|
59
|
+
|
|
44
60
|
private
|
|
45
61
|
|
|
46
62
|
def load_groups_from_options
|
|
@@ -55,10 +71,28 @@ module Facter
|
|
|
55
71
|
end
|
|
56
72
|
end
|
|
57
73
|
|
|
74
|
+
def load_facts_ttls
|
|
75
|
+
@facts_ttls ||= {}
|
|
76
|
+
return if @groups_ttls == []
|
|
77
|
+
|
|
78
|
+
@groups_ttls.reduce(:merge).each do |group, ttls|
|
|
79
|
+
ttls = ttls_to_seconds(ttls)
|
|
80
|
+
if @groups[group]
|
|
81
|
+
@groups[group].each do |fact|
|
|
82
|
+
if (@facts_ttls[fact] && @facts_ttls[fact][:ttls] < ttls) || @facts_ttls[fact].nil?
|
|
83
|
+
@facts_ttls[fact] = { ttls: ttls, group: group }
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
else
|
|
87
|
+
@facts_ttls[group] = { ttls: ttls, group: group }
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
58
92
|
def load_groups
|
|
59
93
|
config = ConfigReader.init(Options[:config])
|
|
60
94
|
@block_list = config.block_list || {}
|
|
61
|
-
@groups_ttls = config.ttls ||
|
|
95
|
+
@groups_ttls = config.ttls || []
|
|
62
96
|
@groups.merge!(config.fact_groups) if config.fact_groups
|
|
63
97
|
end
|
|
64
98
|
|
|
@@ -40,31 +40,42 @@ module Facter
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
def
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
def fact_cache_enabled?(fact_name)
|
|
44
|
+
fact = @fact_groups.get_fact(fact_name)
|
|
45
|
+
cached = if fact
|
|
46
|
+
!fact[:ttls].nil?
|
|
47
|
+
else
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
fact_group = @fact_groups.get_fact_group(fact_name)
|
|
52
|
+
delete_cache(fact_group) if fact_group && !cached
|
|
46
53
|
cached
|
|
47
54
|
end
|
|
48
55
|
|
|
49
56
|
private
|
|
50
57
|
|
|
51
58
|
def resolve_fact(searched_fact)
|
|
52
|
-
|
|
53
|
-
searched_fact.name
|
|
54
|
-
else
|
|
55
|
-
@fact_groups.get_fact_group(searched_fact.name)
|
|
56
|
-
end
|
|
59
|
+
return unless fact_cache_enabled?(searched_fact.name)
|
|
57
60
|
|
|
58
|
-
|
|
61
|
+
fact = if searched_fact.file
|
|
62
|
+
@fact_groups.get_fact(File.basename(searched_fact.file))
|
|
63
|
+
else
|
|
64
|
+
@fact_groups.get_fact(searched_fact.name)
|
|
65
|
+
end
|
|
59
66
|
|
|
60
|
-
return unless
|
|
67
|
+
return unless fact
|
|
61
68
|
|
|
62
|
-
return unless check_ttls?(
|
|
69
|
+
return unless check_ttls?(fact[:group], fact[:ttls])
|
|
63
70
|
|
|
64
|
-
|
|
71
|
+
read_fact(searched_fact, fact[:group])
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def read_fact(searched_fact, fact_group)
|
|
75
|
+
data = read_group_json(fact_group)
|
|
65
76
|
return unless data
|
|
66
77
|
|
|
67
|
-
@log.debug("loading cached values for #{
|
|
78
|
+
@log.debug("loading cached values for #{searched_fact.name} facts")
|
|
68
79
|
|
|
69
80
|
create_facts(searched_fact, data)
|
|
70
81
|
end
|
|
@@ -93,7 +104,7 @@ module Facter
|
|
|
93
104
|
end
|
|
94
105
|
return if !group_name || fact.value.nil?
|
|
95
106
|
|
|
96
|
-
return unless
|
|
107
|
+
return unless fact_cache_enabled?(fact.name)
|
|
97
108
|
|
|
98
109
|
@groups[group_name] ||= {}
|
|
99
110
|
@groups[group_name][fact.name] = fact.value
|
|
@@ -106,10 +117,12 @@ module Facter
|
|
|
106
117
|
end
|
|
107
118
|
|
|
108
119
|
@groups.each do |group_name, data|
|
|
109
|
-
next unless check_ttls?(group_name)
|
|
120
|
+
next unless check_ttls?(group_name, @fact_groups.get_group_ttls(group_name))
|
|
110
121
|
|
|
111
|
-
@log.debug("caching values for #{group_name} facts")
|
|
112
122
|
cache_file_name = File.join(@cache_dir, group_name)
|
|
123
|
+
next if File.readable?(cache_file_name)
|
|
124
|
+
|
|
125
|
+
@log.debug("caching values for #{group_name} facts")
|
|
113
126
|
File.write(cache_file_name, JSON.pretty_generate(data))
|
|
114
127
|
end
|
|
115
128
|
end
|
|
@@ -128,8 +141,7 @@ module Facter
|
|
|
128
141
|
@groups[group_name] = data
|
|
129
142
|
end
|
|
130
143
|
|
|
131
|
-
def check_ttls?(group_name)
|
|
132
|
-
ttls = @fact_groups.get_group_ttls(group_name)
|
|
144
|
+
def check_ttls?(group_name, ttls)
|
|
133
145
|
return false unless ttls
|
|
134
146
|
|
|
135
147
|
cache_file_name = File.join(@cache_dir, group_name)
|