# class Puppet::Indirector::Yaml

The base class for YAML indirection termini.

### Constants

YamlLoadExceptions

### Public Instance Methods

destroy(request) click to toggle source

    # File lib/puppet/indirector/yaml.rb, line 61
    def destroy(request)
      file_path = path(request.key)
      File.unlink(file_path) if File.exists?(file_path)
    end

find(request) click to toggle source

Read a given name’s file in and convert it from YAML.

    # File lib/puppet/indirector/yaml.rb, line 12
    def find(request)
      file = path(request.key)
      return nil unless FileTest.exist?(file)

      yaml = nil
      begin
        yaml = ::File.read(file)
      rescue => detail
        raise Puppet::Error, "Could not read YAML data for #{indirection.name} #{request.key}: #{detail}"
      end

      begin
        return from_yaml(yaml)
      rescue *YamlLoadExceptions => detail
        raise Puppet::Error, "Could not parse YAML data for #{indirection.name} #{request.key}: #{detail}"
      end
    end

path(name,ext='.yaml') click to toggle source

Return the path to a given node’s file.

    # File lib/puppet/indirector/yaml.rb, line 51
    def path(name,ext='.yaml')
      if name =~ Puppet::Indirector::BadNameRegexp then
        Puppet.crit("directory traversal detected in #{self.class}: #{name.inspect}")
        raise ArgumentError, "invalid key"
      end

      base = Puppet.run_mode.master? ? Puppet[:yamldir] : Puppet[:clientyamldir]
      File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
    end

save(request) click to toggle source

Convert our object to YAML and store it to the disk.

    # File lib/puppet/indirector/yaml.rb, line 31
    def save(request)
      raise ArgumentError.new("You can only save objects that respond to :name") unless request.instance.respond_to?(:name)

      file = path(request.key)

      basedir = File.dirname(file)

      # This is quite likely a bad idea, since we're not managing ownership or modes.
      Dir.mkdir(basedir) unless FileTest.exist?(basedir)

      begin
        Puppet::Util.replace_file(file, 0660) do |f|
          f.print to_yaml(request.instance)
        end
      rescue TypeError => detail
        Puppet.err "Could not save #{self.name} #{request.key}: #{detail}"
      end
    end

search(request) click to toggle source

    # File lib/puppet/indirector/yaml.rb, line 66
    def search(request)
      Dir.glob(path(request.key,'')).collect do |file|
        YAML.load_file(file)
      end
    end