# class Catalog::StaticCompiler

### Public Instance Methods

add_children(host, catalog, resource, file) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 90
    def add_children(host, catalog, resource, file)
      file = resource.to_ral

      children = get_child_resources(host, catalog, resource, file)

      remove_existing_resources(children, catalog)

      children.each do |name, res|
        catalog.add_resource res
        catalog.add_edge(resource, res)
      end
    end

compiler() click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 36
    def compiler
      @compiler ||= indirection.terminus(:compiler)
    end

find(request) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 40
    def find(request)
      return nil unless catalog = compiler.find(request)

      raise "Did not get catalog back" unless catalog.is_a?(model)

      catalog.resources.find_all { |res| res.type == "File" }.each do |resource|
        next unless source = resource[:source]
        next unless source =~ /^puppet:/

        file = resource.to_ral
        if file.recurse?
          add_children(request.key, catalog, resource, file)
        else
          find_and_replace_metadata(request.key, resource, file)
        end
      end

      catalog
    end

find_and_replace_metadata(host, resource, file) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 60
    def find_and_replace_metadata(host, resource, file)
      # We remove URL info from it, so it forces a local copy
      # rather than routing through the network.
      # Weird, but true.
      newsource = file[:source][0].sub("puppet:///", "")
      file[:source][0] = newsource

      raise "Could not get metadata for #{resource[:source]}" unless metadata = file.parameter(:source).metadata

      replace_metadata(host, resource, metadata)
    end

get_child_resources(host, catalog, resource, file) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 103
    def get_child_resources(host, catalog, resource, file)
      sourceselect = file[:sourceselect]
      children = {}

      source = resource[:source]

      # This is largely a copy of recurse_remote in File
      total = file[:source].collect do |source|
        next unless result = file.perform_recursion(source)
        return if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
        result.each { |data| data.source = "#{source}/#{data.relative_path}" }
        break result if result and ! result.empty? and sourceselect == :first
        result
      end.flatten

      # This only happens if we have sourceselect == :all
      unless sourceselect == :first
        found = []
        total.reject! do |data|
          result = found.include?(data.relative_path)
          found << data.relative_path unless found.include?(data.relative_path)
          result
        end
      end

      total.each do |meta|
        # This is the top-level parent directory
        if meta.relative_path == "."
          replace_metadata(host, resource, meta)
          next
        end
        children[meta.relative_path] ||= Puppet::Resource.new(:file, File.join(file[:path], meta.relative_path))

        # I think this is safe since it's a URL, not an actual file
        children[meta.relative_path][:source] = source + "/" + meta.relative_path
        replace_metadata(host, children[meta.relative_path], meta)
      end

      children
    end

remove_existing_resources(children, catalog) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 144
    def remove_existing_resources(children, catalog)
      existing_names = catalog.resources.collect { |r| r.to_s }
      both = (existing_names & children.keys).inject({}) { |hash, name| hash[name] = true; hash }
      both.each { |name| children.delete(name) }
    end

replace_metadata(host, resource, metadata) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 72
    def replace_metadata(host, resource, metadata)
      [:mode, :owner, :group].each do |param|
        resource[param] ||= metadata.send(param)
      end

      resource[:ensure] = metadata.ftype
      if metadata.ftype == "file"
        unless resource[:content]
          resource[:content] = metadata.checksum
          resource[:checksum] = metadata.checksum_type
        end
      end

      store_content(resource) if resource[:ensure] == "file"
      old_source = resource.delete(:source)
      Puppet.info "Metadata for #{resource} in catalog for '#{host}' added from '#{old_source}'"
    end

store_content(resource) click to toggle source

    # File lib/puppet/indirector/catalog/static_compiler.rb, line 150
    def store_content(resource)
      @summer ||= Object.new
      @summer.extend(Puppet::Util::Checksums)

      type = @summer.sumtype(resource[:content])
      sum = @summer.sumdata(resource[:content])

      if Puppet::FileBucket::File.indirection.find("#{type}/#{sum}")
        Puppet.info "Content for '#{resource[:source]}' already exists"
      else
        Puppet.info "Storing content for source '#{resource[:source]}'"
        content = Puppet::FileServing::Content.indirection.find(resource[:source])
        file = Puppet::FileBucket::File.new(content.content)
        Puppet::FileBucket::File.indirection.save(file)
      end
    end