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 - 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



48
49
50
51
52
53
# File 'lib/facterdb.rb', line 48

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 = ) ⇒ Array[String]

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

Parameters:

  • fact_paths (String) (defaults to: )
    • 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



57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/facterdb.rb', line 57

def self.external_fact_files(fact_paths = ENV['FACTERDB_SEARCH_PATHS'])
  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



73
74
75
# File 'lib/facterdb.rb', line 73

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



107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/facterdb.rb', line 107

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) ⇒ Array

Returns - array of hashes of facts.

Parameters:

  • filter (Object) (defaults to: nil)
    • The filter to convert to jgrep string

Returns:

  • (Array)
    • array of hashes of facts



133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/facterdb.rb', line 133

def self.get_facts(filter=nil, cache=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).map { |hash| Hash[hash.map{ |k, v| [k.to_sym, v] }] }
  if cache
    Thread.current[:facterdb_last_filter_seen] = filter
    Thread.current[:facterdb_last_facts_seen] = result
  end
  result
end

.get_os_facts(facter_version = '*', filter = []) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/facterdb.rb', line 77

def self.get_os_facts(facter_version='*', filter=[])
  if facter_version == '*'
    if filter.is_a?(Array)
      filter_str = filter.map { |f| f.map { |k,v | "#{k}=#{v}" }.join(' and ') }.join(' or ')
    elsif filter.is_a?(Hash)
      filter_str = filter.map { |k,v | "#{k}=#{v}" }.join(' and ')
    elsif filter.is_a?(String)
      filter_str = filter
    else
      raise 'filter must be either an Array a Hash or a String'
    end
  else
    if filter.is_a?(Array)
      filter_str = "facterversion=/^#{facter_version}/ and (#{filter.map { |f| f.map { |k,v | "#{k}=#{v}" }.join(' and ') }.join(' or ')})"
    elsif filter.is_a?(Hash)
      filter_str = "facterversion=/^#{facter_version}/ and (#{filter.map { |k,v | "#{k}=#{v}" }.join(' and ')})"
    elsif filter.is_a?(String)
      filter_str = "facterversion=/^#{facter_version}/ and (#{filter})"
    else
      raise 'filter must be either an Array a Hash or a String'
    end
  end

  warn "[DEPRECATION] `get_os_facts` is deprecated. Please use `get_facts(#{filter_str})` instead."

  get_facts(filter_str)
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:

  • filter (Object)
    • The filter to convert to jgrep string

Returns:

  • (Boolean)
    • true if the filter is valid against the jgrep filter validator



124
125
126
127
128
129
# File 'lib/facterdb.rb', line 124

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