Module: FacterDB

Defined in:
lib/facterdb.rb,
lib/facterdb/bin.rb,
lib/facterdb/version.rb

Defined Under Namespace

Modules: Errors, Version Classes: Bin

Class Method Summary collapse

Class Method Details

.cleanupObject

Note:

Call this method at the end of test suite, for example via after(:suite), to reclaim back the memory required to hold json data and filter cache



15
16
17
18
19
# File 'lib/facterdb.rb', line 15

def self.cleanup
  @database = nil
  Thread.current[:facterdb_last_filter_seen] = nil
  Thread.current[:facterdb_last_facts_seen] = nil
end

.databaseString

Returns a giant incomprehensible string of concatenated json data

Returns:

  • (String)

    returns a giant incomprehensible string of concatenated json data



10
11
12
# File 'lib/facterdb.rb', line 10

def self.database
  @database ||= "[#{facterdb_fact_files.map { |f| read_json_file(f) }.join(',')}]\n"
end

.default_fact_filesArray[String]

Returns list of all files found in the default facterdb facts path.

Returns:

  • (Array[String])

    list of all files found in the default facterdb facts path



50
51
52
53
54
55
56
# File 'lib/facterdb.rb', line 50

def self.default_fact_files
  return [] unless use_defaultdb?

  proj_root = File.join(File.dirname(File.dirname(__FILE__)))
  facts_dir = File.expand_path(File.join(proj_root, 'facts'))
  Dir.glob(File.join(facts_dir, '**', '*.facts'))
end

.external_fact_files(fact_paths = ENV.fetch('FACTERDB_SEARCH_PATHS', nil)) ⇒ Array[String]

Returns list of all files found in the user supplied facterdb facts path.

Parameters:

  • fact_paths (String) (defaults to: ENV.fetch('FACTERDB_SEARCH_PATHS', nil))

    a comma separated list of paths to search for fact files

Returns:

  • (Array[String])

    list of all files found in the user supplied facterdb facts path



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/facterdb.rb', line 60

def self.external_fact_files(fact_paths = ENV.fetch('FACTERDB_SEARCH_PATHS', nil))
  fact_paths ||= ''
  return [] if fact_paths.empty?

  paths = fact_paths.split(File::PATH_SEPARATOR).map do |fact_path|
    unless File.directory?(fact_path)
      warn("[FACTERDB] Ignoring external facts path #{fact_path} as it is not a directory")
      next nil
    end
    fact_path = fact_path.gsub(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
    File.join(fact_path.strip, '**', '*.facts')
  end.compact
  Dir.glob(paths)
end

.facterdb_fact_filesArray[String]

Note:

external fact files supplied by the user will take precedence over default fact files found in this gem

Returns list of all files found in the default facterdb facts path and user supplied path.

Returns:

  • (Array[String])

    list of all files found in the default facterdb facts path and user supplied path



77
78
79
# File 'lib/facterdb.rb', line 77

def self.facterdb_fact_files
  (external_fact_files + default_fact_files).uniq
end

.generate_filter_str(filter = nil) ⇒ String

Returns the string filter.

Parameters:

  • filter (Object) (defaults to: nil)

    The filter to convert to jgrep string

Returns:

  • (String)

    the string filter



83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/facterdb.rb', line 83

def self.generate_filter_str(filter = nil)
  case filter
  when ::Array
    '(' + filter.map { |f| f.map { |k, v| "#{k}=#{v}" }.join(' and ') }.join(') or (') + ')'
  when ::Hash
    filter.map { |k, v| "#{k}=#{v}" }.join(' and ')
  when ::String
    filter
  when ::NilClass
    ''
  else
    raise Errors::InvalidFilter, "filter must be either an Array a Hash, String, or nil, received #{filter.class}"
  end
end

.get_facts(filter = nil, cache = true, symbolize_keys: true) ⇒ Array[Hash[Symbol, Any]]

Returns array of hashes of facts.

Parameters:

  • filter (Object) (defaults to: nil)

    The filter to convert to jgrep string

  • symbolize_keys (Boolean) (defaults to: true)

    Whether to symbolize the keys. Note this is only on the top level and not on nested values.

Returns:

  • (Array[Hash[Symbol, Any]])

    array of hashes of facts



112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/facterdb.rb', line 112

def self.get_facts(filter = nil, cache = true, symbolize_keys: true)
  if cache && filter && filter == Thread.current[:facterdb_last_filter_seen]
    return Thread.current[:facterdb_last_facts_seen]
  end

  filter_str = generate_filter_str(filter)
  result = JGrep.jgrep(database, filter_str)
  result = result.map { |hash| hash.transform_keys(&:to_sym) } if symbolize_keys
  if cache
    Thread.current[:facterdb_last_filter_seen] = filter
    Thread.current[:facterdb_last_facts_seen] = result
  end
  result
end

.inject_source?Boolean

The default is false.

Returns:

  • (Boolean)

    returns true if we should inject the source file name and file path into the json factsets.



30
31
32
# File 'lib/facterdb.rb', line 30

def self.inject_source?
  !ENV['FACTERDB_INJECT_SOURCE'].nil?
end

.use_defaultdb?Boolean

Note:

If the user passes anything to the FACTERDB_SKIP_DEFAULTDB environment variable we assume

they want to skip the default db

Returns:

  • (Boolean)

    returns true if we should use the default facterdb database, false otherwise



24
25
26
# File 'lib/facterdb.rb', line 24

def self.use_defaultdb?
  ENV['FACTERDB_SKIP_DEFAULTDB'].nil?
end

.valid_filters?(filters) ⇒ Boolean

Returns true if the filter is valid against the jgrep filter validator.

Parameters:

  • filters (Object)

    The filter to convert to jgrep string

Returns:

  • (Boolean)

    true if the filter is valid against the jgrep filter validator



100
101
102
103
104
105
# File 'lib/facterdb.rb', line 100

def self.valid_filters?(filters)
  filter_str = generate_filter_str(filters)
  JGrep.validate_filters(filter_str).nil?
rescue RuntimeError
  false
end