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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/bin/facter +3 -4
  3. data/lib/facter.rb +163 -23
  4. data/lib/facter/custom_facts/core/execution/base.rb +36 -6
  5. data/lib/facter/custom_facts/util/directory_loader.rb +10 -2
  6. data/lib/facter/custom_facts/util/fact.rb +4 -1
  7. data/lib/facter/facts/aix/disks.rb +1 -1
  8. data/lib/facter/facts/aix/kernel.rb +1 -1
  9. data/lib/facter/facts/aix/kernelmajversion.rb +1 -1
  10. data/lib/facter/facts/aix/kernelrelease.rb +1 -1
  11. data/lib/facter/facts/aix/kernelversion.rb +1 -1
  12. data/lib/facter/facts/aix/os/release.rb +1 -1
  13. data/lib/facter/facts/linux/cloud.rb +15 -0
  14. data/lib/facter/facts/linux/disks.rb +1 -1
  15. data/lib/facter/facts/linux/ec2_metadata.rb +5 -27
  16. data/lib/facter/facts/linux/ec2_userdata.rb +5 -27
  17. data/lib/facter/facts/linux/is_virtual.rb +7 -46
  18. data/lib/facter/facts/linux/partitions.rb +1 -1
  19. data/lib/facter/facts/linux/virtual.rb +3 -58
  20. data/lib/facter/facts/rhel/os/release.rb +2 -2
  21. data/lib/facter/facts/solaris/disks.rb +1 -1
  22. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +23 -0
  23. data/lib/facter/facts_utils/virtual_detector.rb +78 -0
  24. data/lib/facter/framework/benchmarking/timer.rb +23 -0
  25. data/lib/facter/framework/cli/cli.rb +86 -34
  26. data/lib/facter/framework/cli/cli_launcher.rb +34 -38
  27. data/lib/facter/framework/config/fact_groups.rb +36 -2
  28. data/lib/facter/framework/core/cache_manager.rb +30 -18
  29. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +2 -1
  30. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +14 -11
  31. data/lib/facter/framework/core/fact_loaders/internal_fact_loader.rb +7 -7
  32. data/lib/facter/framework/core/file_loader.rb +2 -0
  33. data/lib/facter/framework/core/options/config_file_options.rb +5 -3
  34. data/lib/facter/framework/core/options/option_store.rb +30 -11
  35. data/lib/facter/framework/core/session_cache.rb +1 -4
  36. data/lib/facter/framework/logging/logger.rb +3 -11
  37. data/lib/facter/patches/sysfilesystem/sys/statvfs.rb +92 -0
  38. data/lib/facter/resolvers/aio_agent_version.rb +0 -1
  39. data/lib/facter/resolvers/aix/architecture_resolver.rb +0 -1
  40. data/lib/facter/resolvers/aix/disks.rb +2 -3
  41. data/lib/facter/resolvers/aix/filesystem_resolver.rb +0 -1
  42. data/lib/facter/resolvers/aix/hardware_resolver.rb +0 -1
  43. data/lib/facter/resolvers/aix/load_averages_resolver.rb +0 -1
  44. data/lib/facter/resolvers/aix/memory.rb +2 -3
  45. data/lib/facter/resolvers/aix/mountpoints.rb +0 -1
  46. data/lib/facter/resolvers/aix/networking_resolver.rb +0 -1
  47. data/lib/facter/resolvers/aix/nim.rb +0 -1
  48. data/lib/facter/resolvers/aix/os_level.rb +27 -0
  49. data/lib/facter/resolvers/aix/partitions.rb +2 -3
  50. data/lib/facter/resolvers/aix/processors.rb +0 -1
  51. data/lib/facter/resolvers/aix/serialnumber.rb +0 -1
  52. data/lib/facter/resolvers/augeas_resolver.rb +0 -1
  53. data/lib/facter/resolvers/base_resolver.rb +9 -4
  54. data/lib/facter/resolvers/bsd/processors.rb +0 -1
  55. data/lib/facter/resolvers/cloud.rb +39 -0
  56. data/lib/facter/resolvers/containers.rb +0 -1
  57. data/lib/facter/resolvers/debian_version.rb +0 -1
  58. data/lib/facter/resolvers/disk_resolver.rb +0 -1
  59. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  60. data/lib/facter/resolvers/dmi_resolver.rb +0 -1
  61. data/lib/facter/resolvers/ec2.rb +0 -1
  62. data/lib/facter/resolvers/eos_release_resolver.rb +0 -1
  63. data/lib/facter/resolvers/facterversion_resolver.rb +0 -1
  64. data/lib/facter/resolvers/filesystems_resolver.rb +0 -1
  65. data/lib/facter/resolvers/fips_enabled_resolver.rb +0 -1
  66. data/lib/facter/resolvers/freebsd/dmi_resolver.rb +0 -1
  67. data/lib/facter/resolvers/freebsd/freebsd_version_resolver.rb +0 -1
  68. data/lib/facter/resolvers/freebsd/geom_resolver.rb +0 -1
  69. data/lib/facter/resolvers/freebsd/processors.rb +0 -1
  70. data/lib/facter/resolvers/freebsd/swap_memory_resolver.rb +0 -1
  71. data/lib/facter/resolvers/freebsd/system_memory_resolver.rb +0 -1
  72. data/lib/facter/resolvers/gce.rb +0 -1
  73. data/lib/facter/resolvers/hostname_resolver.rb +0 -1
  74. data/lib/facter/resolvers/identity_resolver.rb +0 -1
  75. data/lib/facter/resolvers/linux/docker_uptime.rb +0 -1
  76. data/lib/facter/resolvers/linux/load_averages.rb +0 -1
  77. data/lib/facter/resolvers/load_averages.rb +0 -1
  78. data/lib/facter/resolvers/lpar_resolver.rb +0 -1
  79. data/lib/facter/resolvers/lsb_release_resolver.rb +0 -1
  80. data/lib/facter/resolvers/lspci.rb +0 -1
  81. data/lib/facter/resolvers/macosx/dmi_resolver.rb +0 -1
  82. data/lib/facter/resolvers/macosx/filesystems_resolver.rb +1 -6
  83. data/lib/facter/resolvers/macosx/load_averages_resolver.rb +0 -1
  84. data/lib/facter/resolvers/macosx/mountpoints_resolver.rb +3 -3
  85. data/lib/facter/resolvers/macosx/processor_resolver.rb +0 -1
  86. data/lib/facter/resolvers/macosx/swap_memory_resolver.rb +0 -1
  87. data/lib/facter/resolvers/macosx/system_memory_resolver.rb +0 -1
  88. data/lib/facter/resolvers/macosx/system_profiler_resolver.rb +0 -1
  89. data/lib/facter/resolvers/memory_resolver.rb +6 -2
  90. data/lib/facter/resolvers/mountpoints_resolver.rb +0 -1
  91. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -2
  92. data/lib/facter/resolvers/networking_resolver.rb +0 -1
  93. data/lib/facter/resolvers/open_vz.rb +0 -1
  94. data/lib/facter/resolvers/os_release_resolver.rb +0 -1
  95. data/lib/facter/resolvers/partitions.rb +37 -2
  96. data/lib/facter/resolvers/path_resolver.rb +0 -1
  97. data/lib/facter/resolvers/processors_resolver.rb +0 -1
  98. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -1
  99. data/lib/facter/resolvers/redhat_release_resolver.rb +0 -1
  100. data/lib/facter/resolvers/ruby_resolver.rb +0 -1
  101. data/lib/facter/resolvers/selinux_resolver.rb +0 -1
  102. data/lib/facter/resolvers/solaris/disks.rb +0 -1
  103. data/lib/facter/resolvers/solaris/dmi.rb +0 -1
  104. data/lib/facter/resolvers/solaris/dmi_sparc.rb +0 -1
  105. data/lib/facter/resolvers/solaris/filesystems.rb +0 -1
  106. data/lib/facter/resolvers/solaris/ipaddress.rb +0 -1
  107. data/lib/facter/resolvers/solaris/ldom.rb +0 -1
  108. data/lib/facter/resolvers/solaris/memory.rb +0 -1
  109. data/lib/facter/resolvers/solaris/networking.rb +0 -1
  110. data/lib/facter/resolvers/solaris/os_release.rb +0 -1
  111. data/lib/facter/resolvers/solaris/processors.rb +0 -1
  112. data/lib/facter/resolvers/solaris/zone.rb +0 -1
  113. data/lib/facter/resolvers/solaris/zone_name.rb +0 -1
  114. data/lib/facter/resolvers/ssh_resolver.rb +0 -1
  115. data/lib/facter/resolvers/suse_release_resolver.rb +0 -1
  116. data/lib/facter/resolvers/sw_vers_resolver.rb +0 -1
  117. data/lib/facter/resolvers/timezone_resolver.rb +0 -1
  118. data/lib/facter/resolvers/uname_resolver.rb +0 -1
  119. data/lib/facter/resolvers/uptime_resolver.rb +0 -1
  120. data/lib/facter/resolvers/utils/filesystem_helper.rb +3 -1
  121. data/lib/facter/resolvers/virt_what.rb +0 -1
  122. data/lib/facter/resolvers/vmware.rb +0 -1
  123. data/lib/facter/resolvers/windows/aio_agent_version.rb +0 -1
  124. data/lib/facter/resolvers/windows/dmi_bios_resolver.rb +0 -1
  125. data/lib/facter/resolvers/windows/dmi_computersystem_resolver.rb +0 -1
  126. data/lib/facter/resolvers/windows/fips_resolver.rb +0 -1
  127. data/lib/facter/resolvers/windows/hardware_architecture_resolver.rb +0 -1
  128. data/lib/facter/resolvers/windows/identity_resolver.rb +0 -1
  129. data/lib/facter/resolvers/windows/kernel_resolver.rb +0 -1
  130. data/lib/facter/resolvers/windows/memory_resolver.rb +0 -1
  131. data/lib/facter/resolvers/windows/netkvm_resolver.rb +0 -1
  132. data/lib/facter/resolvers/windows/networking_resolver.rb +0 -1
  133. data/lib/facter/resolvers/windows/processors_resolver.rb +0 -1
  134. data/lib/facter/resolvers/windows/product_release_resolver.rb +0 -1
  135. data/lib/facter/resolvers/windows/ssh.rb +0 -1
  136. data/lib/facter/resolvers/windows/system32_resolver.rb +0 -1
  137. data/lib/facter/resolvers/windows/uptime_resolver.rb +0 -1
  138. data/lib/facter/resolvers/windows/virtualization_resolver.rb +0 -1
  139. data/lib/facter/resolvers/windows/win_os_description_resolver.rb +0 -1
  140. data/lib/facter/resolvers/wpar_resolver.rb +0 -1
  141. data/lib/facter/resolvers/xen.rb +0 -1
  142. data/lib/facter/resolvers/zfs.rb +0 -1
  143. data/lib/facter/resolvers/zpool.rb +0 -1
  144. data/lib/facter/version.rb +1 -1
  145. metadata +9 -4
  146. data/lib/facter/resolvers/aix/os_level_resolver.rb +0 -26
  147. 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 :block,
50
+ class_option :no_block,
66
51
  type: :boolean,
67
52
  desc: 'Disable fact blocking.'
68
53
 
69
- class_option :cache,
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 :custom_facts,
58
+ class_option :no_custom_facts,
74
59
  type: :boolean,
75
60
  desc: 'Disable custom facts.'
76
61
 
77
- class_option :external_facts,
62
+ class_option :no_external_facts,
78
63
  type: :boolean,
79
64
  desc: 'Disable external facts.'
80
65
 
81
- class_option :ruby,
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 :puppet,
96
+ class_option :timing,
107
97
  type: :boolean,
108
- aliases: '-p',
109
- desc: 'Load the Puppet libraries, thus allowing Facter to load Puppet-specific facts.'
98
+ aliases: '-t',
99
+ desc: 'Show how much time it took to resolve each fact'
110
100
 
111
- desc '--man', 'Manual', hide: true
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', hide: true
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', hide: true
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
- def initialize(args)
12
- @args = args
13
- end
14
-
15
- def validate_options
16
- Facter::OptionsValidator.validate(@args)
17
- end
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
- def prepare_arguments
20
- @args.unshift(Facter::Cli.default_task) unless
21
- check_if_arguments_is_known(Facter::Cli.all_tasks, @args) ||
22
- check_if_arguments_is_known(Facter::Cli.instance_variable_get(:@map), @args)
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
- @args = reorder_program_arguments(@args)
25
- end
28
+ private
26
29
 
27
- def start
28
- Facter::Cli.start(@args, debug: true)
29
- rescue Thor::UnknownArgumentError => e
30
- Facter::OptionsValidator.write_error_and_exit("unrecognised option '#{e.unknown.first}'")
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
- def check_if_arguments_is_known(known_arguments, program_arguments)
36
- program_arguments.each do |argument|
37
- return true if known_arguments.key?(argument)
35
+ false
38
36
  end
39
37
 
40
- false
41
- end
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
- priority_args = []
47
- normal_args = []
41
+ priority_args = []
42
+ normal_args = []
48
43
 
49
- program_arguments.each do |argument|
50
- if priority_arguments.include?(argument)
51
- priority_args << argument
52
- else
53
- normal_args << argument
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
- priority_args.concat(normal_args)
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 group_cached?(group_name)
44
- cached = @fact_groups.get_group_ttls(group_name) ? true : false
45
- delete_cache(group_name) unless cached
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
- group_name = if searched_fact.file
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
- return unless group_name
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 group_cached?(group_name)
67
+ return unless fact
61
68
 
62
- return unless check_ttls?(group_name)
69
+ return unless check_ttls?(fact[:group], fact[:ttls])
63
70
 
64
- data = read_group_json(group_name)
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 #{group_name} facts")
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 group_cached?(group_name)
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)