class LegacyFacter::Util::DirectoryLoader
Constants
- EXTERNAL_FACT_WEIGHT
This value makes it highly likely that external facts will take precedence over all other facts
Attributes
directories[R]
Directory for fact loading
Public Class Methods
new(dir = LegacyFacter::Util::Config.external_facts_dirs, weight = EXTERNAL_FACT_WEIGHT)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 35 def initialize(dir = LegacyFacter::Util::Config.external_facts_dirs, weight = EXTERNAL_FACT_WEIGHT) @directories = [dir].flatten @weight = weight @log ||= Facter::Log.new(self) end
Public Instance Methods
load(collection)
click to toggle source
Load facts from files in fact directory using the relevant parser classes to parse them.
# File lib/facter/custom_facts/util/directory_loader.rb, line 43 def load(collection) weight = @weight searched_facts, cached_facts = load_directory_entries(collection) load_cached_facts(collection, cached_facts, weight) load_searched_facts(collection, searched_facts, weight) end
Private Instance Methods
add_data(data, collection, fact, weight)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 108 def add_data(data, collection, fact, weight) data.each do |key, value| collection.add( key, value: value, fact_type: :external, file: fact.file ) { has_weight(weight) } end end
entries()
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 127 def entries dirs = @directories.select { |directory| File.directory?(directory) }.map do |directory| Dir.entries(directory).map { |directory_entry| File.join(directory, directory_entry) }.sort.reverse! end dirs.flatten.select { |f| should_parse?(f) } rescue Errno::ENOENT [] end
file_blocked?(file)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 140 def file_blocked?(file) if Facter::Options[:blocked_facts].include? file Facter.debug("External fact file #{file} blocked.") return true end false end
load_cached_facts(collection, cached_facts, weight)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 79 def load_cached_facts(collection, cached_facts, weight) cached_facts.each do |cached_fact| collection.add(cached_fact.name, value: cached_fact.value, fact_type: :external, file: cached_fact.file) { has_weight(weight) } end end
load_directory_entries(_collection)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 59 def load_directory_entries(_collection) cm = Facter::CacheManager.new facts = [] entries.each do |file| basename = File.basename(file) next if file_blocked?(basename) if facts.find { |f| f.name == basename } && cm.fact_cache_enabled?(basename) Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\ 'there are at least two external facts files with the same filename')) else searched_fact = Facter::SearchedFact.new(basename, nil, nil, :file) searched_fact.file = file facts << searched_fact end end cm.resolve_facts(facts) end
load_searched_facts(collection, searched_facts, weight)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 86 def load_searched_facts(collection, searched_facts, weight) searched_facts.each do |fact| parser = LegacyFacter::Util::Parser.parser_for(fact.file) next if parser.nil? data = resolve_fact(fact, parser) if data == false log.warn "Could not interpret fact file #{fact.file}" elsif (data == {}) || data.nil? log.debug( "Structured data fact file #{fact.file} was parsed but was either empty or an invalid filetype "\ '(valid filetypes are .yaml, .json, and .txt).' ) elsif !data.is_a?(Hash) log.error("Structured data fact file #{fact.file} was parsed but no key=>value data was returned.") else add_data(data, collection, fact, weight) end end end
log()
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 55 def log @log ||= Facter::Log.new(self) end
resolve_fact(fact, parser)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 119 def resolve_fact(fact, parser) data = nil fact_name = File.basename(fact.file) Facter::Framework::Benchmarking::Timer.measure(fact_name) { data = parser.results } data end
should_parse?(file)
click to toggle source
# File lib/facter/custom_facts/util/directory_loader.rb, line 136 def should_parse?(file) File.basename(file) !~ /^\./ end