File: fact.rb

package info (click to toggle)
puppet-module-puppetlabs-stdlib 9.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,448 kB
  • sloc: ruby: 3,522; sh: 46; makefile: 2
file content (65 lines) | stat: -rw-r--r-- 1,896 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# frozen_string_literal: true

# @summary
#   Digs into the facts hash using dot-notation
#
# Supports the use of dot-notation for referring to structured facts. If a fact requested
# does not exist, returns Undef.
#
# @example Example usage:
#     fact('osfamily')
#     fact('os.architecture')
#
# @example Array indexing:
#     fact('mountpoints."/dev".options.1')
#
# @example Fact containing a "." in the name:
#     fact('vmware."VRA.version"')
#
Puppet::Functions.create_function(:fact) do
  # @param fact_name
  #   The name of the fact to check
  #
  # @return
  #   All information retrieved on the given fact_name
  dispatch :fact do
    param 'String', :fact_name
  end

  def to_dot_syntax(array_path)
    array_path.map { |string|
      string.include?('.') ? %("#{string}") : string
    }.join('.')
  end

  def fact(fact_name)
    facts = closure_scope['facts']

    # Transform the dot-notation string into an array of paths to walk. Make
    # sure to correctly extract double-quoted values containing dots as single
    # elements in the path.
    path = fact_name.scan(%r{([^."]+)|(?:")([^"]+)(?:")}).map { |x| x.compact.first }

    walked_path = []
    path.reduce(facts) do |d, k|
      return nil if d.nil? || k.nil?

      if d.is_a?(Array)
        begin
          result = d[Integer(k)]
        rescue ArgumentError => e # rubocop:disable Lint/UselessAssignment : Causes errors if assigment is removed.
          Puppet.warning("fact request for #{fact_name} returning nil: '#{to_dot_syntax(walked_path)}' is an array; cannot index to '#{k}'")
          result = nil
        end
      elsif d.is_a?(Hash)
        result = d[k]
      else
        Puppet.warning("fact request for #{fact_name} returning nil: '#{to_dot_syntax(walked_path)}' is not a collection; cannot walk to '#{k}'")
        result = nil
      end

      walked_path << k
      result
    end
  end
end