Module: Puppet::Util::Yaml

Defined in:
lib/puppet/util/yaml.rb

Defined Under Namespace

Classes: YamlLoadError

Constant Summary collapse

YamlLoadExceptions =
[::StandardError, ::Psych::Exception]

Class Method Summary collapse

Class Method Details

.dump(structure, filename) ⇒ Object



86
87
88
89
90
# File 'lib/puppet/util/yaml.rb', line 86

def self.dump(structure, filename)
  Puppet::FileSystem.replace_file(filename, 0660) do |fh|
    YAML.dump(structure, fh)
  end
end

.load_file(filename, default_value = false, strip_classes = false) ⇒ Object

Deprecated.

Use #safe_load_file instead.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/puppet/util/yaml.rb', line 61

def self.load_file(filename, default_value = false, strip_classes = false)
  Puppet.deprecation_warning(_("Puppet::Util::Yaml.load_file is deprecated. Use safe_load_file instead."))

  if(strip_classes) then
    data = YAML::parse_file(filename)
    data.root.each do |o|
      if o.respond_to?(:tag=) and
         o.tag != nil and
         o.tag.start_with?("!ruby")
        o.tag = nil
      end
    end
    data.to_ruby || default_value
  else
    if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.3.2')
      yaml = YAML.unsafe_load_file(filename)
    else
      yaml = YAML.load_file(filename)
    end
    yaml || default_value
  end
rescue *YamlLoadExceptions => detail
  raise YamlLoadError.new(detail.message, detail)
end

.safe_load(yaml, allowed_classes = [], filename = nil) ⇒ Object

Safely load the content as YAML. By default only the following classes can be deserialized:

  • TrueClass
  • FalseClass
  • NilClass
  • Numeric
  • String
  • Array
  • Hash

Attempting to deserialize other classes will raise an YamlLoadError exception unless they are specified in the array of allowed_classes.

Parameters:

  • yaml (String)

    The yaml content to parse.

  • allowed_classes (Array) (defaults to: [])

    Additional list of classes that can be deserialized.

  • filename (String) (defaults to: nil)

    The filename to load from, used if an exception is raised.

Returns:

  • The parsed YAML, which can be Hash, Array or scalar types.

Raises:

  • (YamlLoadException)

    If deserialization fails.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/puppet/util/yaml.rb', line 26

def self.safe_load(yaml, allowed_classes = [], filename = nil)
  if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
    data = YAML.safe_load(yaml, permitted_classes: allowed_classes, aliases: true, filename: filename)
  else
    data = YAML.safe_load(yaml, allowed_classes, [], true, filename)
  end
  data = false if data.nil?
  data
rescue ::Psych::DisallowedClass => detail
  path = filename ? "(#{filename})" : "(<unknown>)"
  raise YamlLoadError.new("#{path}: #{detail.message}", detail)
rescue *YamlLoadExceptions => detail
  raise YamlLoadError.new(detail.message, detail)
end

.safe_load_file(filename, allowed_classes = []) ⇒ Object

Safely load the content from a file as YAML.

See Also:



44
45
46
47
# File 'lib/puppet/util/yaml.rb', line 44

def self.safe_load_file(filename, allowed_classes = [])
  yaml = Puppet::FileSystem.read(filename, :encoding => 'bom|utf-8')
  safe_load(yaml, allowed_classes, filename)
end

.safe_load_file_if_valid(filename, allowed_classes = []) ⇒ Object

Safely load the content from a file as YAML if contents are in valid format. This method does not raise error but returns nil when invalid file is given.



53
54
55
56
57
58
# File 'lib/puppet/util/yaml.rb', line 53

def self.safe_load_file_if_valid(filename, allowed_classes = [])
  safe_load_file(filename, allowed_classes)
rescue YamlLoadError, ArgumentError, Errno::ENOENT => detail
  Puppet.debug("Could not retrieve YAML content from '#{filename}': #{detail.message}")
  nil
end