class Deb::S3::Release

Attributes

architectures[RW]
cache_control[RW]
codename[RW]
components[RW]
files[RW]
origin[RW]
policy[RW]
suite[RW]

Public Class Methods

new() click to toggle source
# File lib/deb/s3/release.rb, line 16
def initialize
  @origin = nil
  @suite = nil
  @codename = nil
  @architectures = []
  @components = []
  @cache_control = ""
  @files = {}
  @policy = :public_read
end
parse_release(str) click to toggle source
# File lib/deb/s3/release.rb, line 41
def parse_release(str)
  rel = self.new
  rel.parse(str)
  rel
end
retrieve(codename, origin=nil, suite=nil, cache_control=nil) click to toggle source
# File lib/deb/s3/release.rb, line 28
def retrieve(codename, origin=nil, suite=nil, cache_control=nil)
  if s = Deb::S3::Utils.s3_read("dists/#{codename}/Release")
    rel = self.parse_release(s)
  else
    rel = self.new
  end
  rel.codename = codename
  rel.origin = origin unless origin.nil?
  rel.suite = suite unless suite.nil?
  rel.cache_control = cache_control
  rel
end

Public Instance Methods

filename() click to toggle source
# File lib/deb/s3/release.rb, line 48
def filename
  "dists/#{@codename}/Release"
end
generate() click to toggle source
# File lib/deb/s3/release.rb, line 83
def generate
  template("release.erb").result(binding)
end
parse(str) click to toggle source
# File lib/deb/s3/release.rb, line 52
def parse(str)
  parse = lambda do |field|
    value = str[/^#{field}: .*/]
    if value.nil?
      return nil
    else
      return value.split(": ",2).last
    end
  end

  # grab basic fields
  self.codename = parse.call("Codename")
  self.origin = parse.call("Origin") || nil
  self.suite = parse.call("Suite") || nil
  self.architectures = (parse.call("Architectures") || "").split(/\s+/)
  self.components = (parse.call("Components") || "").split(/\s+/)

  # find all the hashes
  str.scan(/^\s+([^\s]+)\s+(\d+)\s+(.+)$/).each do |(hash,size,name)|
    self.files[name] ||= { :size => size.to_i }
    case hash.length
    when 32
      self.files[name][:md5] = hash
    when 40
      self.files[name][:sha1] = hash
    when 64
      self.files[name][:sha256] = hash
    end
  end
end
update_manifest(manifest) click to toggle source
# File lib/deb/s3/release.rb, line 133
def update_manifest(manifest)
  self.components << manifest.component unless self.components.include?(manifest.component)
  self.architectures << manifest.architecture unless self.architectures.include?(manifest.architecture)
  self.files.merge!(manifest.files)
end
validate_others() { |f| ... } click to toggle source
# File lib/deb/s3/release.rb, line 139
def validate_others
  to_apply = []
  self.components.each do |comp|
    %w(amd64 i386 armhf).each do |arch|
      next if self.files.has_key?("#{comp}/binary-#{arch}/Packages")

      m = Deb::S3::Manifest.new
      m.codename = self.codename
      m.component = comp
      m.architecture = arch
      if block_given?
        m.write_to_s3 { |f| yield f }
      else
        m.write_to_s3
      end
      to_apply << m
    end
  end

  to_apply.each { |m| self.update_manifest(m) }
end
write_to_s3() { |f| ... } click to toggle source
# File lib/deb/s3/release.rb, line 87
def write_to_s3
  # validate some other files are present
  if block_given?
    self.validate_others { |f| yield f }
  else
    self.validate_others
  end

  # generate the Release file
  release_tmp = Tempfile.new("Release")
  release_tmp.puts self.generate
  release_tmp.close
  yield self.filename if block_given?
  s3_store(release_tmp.path, self.filename, 'text/plain; charset=utf-8', self.cache_control)

  # sign the file, if necessary
  if Deb::S3::Utils.signing_key
    key_param = Deb::S3::Utils.signing_key != "" ? "--default-key=#{Deb::S3::Utils.signing_key}" : ""
    if system("gpg -a #{key_param} --digest-algo SHA256 #{Deb::S3::Utils.gpg_options} -s --clearsign #{release_tmp.path}")
      local_file = release_tmp.path+".asc"
      remote_file = "dists/#{@codename}/InRelease"
      yield remote_file if block_given?
      raise "Unable to locate InRelease file" unless File.exists?(local_file)
      s3_store(local_file, remote_file, 'application/pgp-signature; charset=us-ascii', self.cache_control)
      File.unlink(local_file)
    else
      raise "Signing the InRelease file failed."
    end
    if system("gpg -a #{key_param} --digest-algo SHA256 #{Deb::S3::Utils.gpg_options} -b #{release_tmp.path}")
      local_file = release_tmp.path+".asc"
      remote_file = self.filename+".gpg"
      yield remote_file if block_given?
      raise "Unable to locate Release signature file" unless File.exists?(local_file)
      s3_store(local_file, remote_file, 'application/pgp-signature; charset=us-ascii', self.cache_control)
      File.unlink(local_file)
    else
      raise "Signing the Release file failed."
    end
  else
    # remove an existing Release.gpg, if it was there
    s3_remove(self.filename+".gpg")
  end

  release_tmp.unlink
end