facter 4.0.36 → 4.0.41

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