Puppet Function: fact
- Defined in:
- vendor_modules/stdlib/lib/puppet/functions/fact.rb
- Function type:
- Ruby 4.x API
Summary
Digs into the facts hash using dot-notationOverview
Supports the use of dot-notation for referring to structured facts. If a fact requested does not exist, returns Undef.
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 |
# File 'vendor_modules/stdlib/lib/puppet/functions/fact.rb', line 19 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 |