class Ropes::Repository::Apt

Public Class Methods

new(options) click to toggle source
# File lib/ropes/repository/apt.rb, line 17
def initialize(options)
  missing_options = %w{
    origin 
    type 
    distribution 
    version 
    architectures 
    components 
    description
    package_base}.reject do |required_option|
      options.has_key?(required_option.to_sym)
  end

  raise "Missing options: #{missing_options.join(", ")}" unless missing_options.empty?

  raise Error, "Architectures must be an array" unless options[:architectures].is_a? Array

  @release_file     = nil
  @packages_file     = nil
  @packages_field_gz = nil

  @options = options
  @packages = []
  @field_order = %w{
    package
    priority
    section
    installed_size
    maintainer
    architecture
    source
    version
    depends
    filename
    size
    MD5sum
    SHA1
    SHA256
    description
    description-md5
    bugs
    origin
    supported
  }
  @mandatory_fields = %w{
    package
    version
    architecture
    maintainer
    description
  }
end

Public Instance Methods

add_file_by_info(package) click to toggle source
# File lib/ropes/repository/apt.rb, line 79
def add_file_by_info(package)
  if validate_metadata(package).empty?
    if package.is_a? Hash
      @packages << package
    else
      raise "Package metadata must be in hash format"
    end
  else
    raise "Missing mandatory fields on package: #{validate_metadata(package).join(", ")}"
  end
end
add_file_by_path(path) click to toggle source
# File lib/ropes/repository/apt.rb, line 70
def add_file_by_path(path)
  metadata = Debeasy.read(path).to_hash
  if validate_metadata(metadata).empty?
    @packages << metadata
  else
    raise "Missing mandatory fields on package: #{validate_metadata(metadata).join(", ")}"
  end
end
packages_file(arch) click to toggle source

Get the Packages file as a string

# File lib/ropes/repository/apt.rb, line 93
def packages_file(arch)
  packages_for_arch = @packages.select {|p| p["architecture"] == arch}
  entries = packages_for_arch.map do |package|
    lines = []
    @field_order.each do |field|
      if package[field] != nil
        case field
        when "filename"
          lines << packages_line(field.capitalize, "#{@options[:package_base]}/#{package[field]}") 
        when "installed_size"
          lines << packages_line("Installed-Size", package[field])
        when "SHA1", "SHA256", "MD5sum"
          lines << packages_line(field, package[field])
        else
          lines << packages_line(field.capitalize, package[field])
        end
      end
    end
    lines.join("\n")
  end
  if entries.empty?
    ""
  else
    entries.join("\n\n") + "\n"
  end
end
packages_file_gz(arch) click to toggle source

Get the Packages file as a gzip’ed string

# File lib/ropes/repository/apt.rb, line 122
def packages_file_gz(arch)
  io = StringIO.new("w")
  gz = Zlib::GzipWriter.new(io)
  gz.write(packages_file(arch))
  gz.close
  io.string
end
release_file() click to toggle source

Get the Release file as a string

# File lib/ropes/repository/apt.rb, line 132
def release_file 
  lines = []
  lines << "Origin: #{@options[:origin]}"
  lines << "Label: #{@options[:origin]}"
  lines << "Suite: #{@options[:distribution]}"
  lines << "Version: #{@options[:version]}"
  lines << "Codename: #{@options[:distribution]}"
  lines << "Date: #{Time.new.utc.strftime '%a, %d %b %Y %H:%M:%S UTC'}"
  lines << "Architectures: #{@options[:architectures].join(" ")}"
  lines << "Components: #{@options[:components]}"
  lines << "Description: #{@options[:description]}"
  lines << "MD5Sum:"
  @options[:architectures].each do |arch|
    # Have to create the files in real life to get the real size
    temp_packages_file = Tempfile.new("Packages")
    temp_packages_file.write packages_file(arch)
    temp_packages_file_gz = Tempfile.new("Packages.gz")
    temp_packages_file_gz.write packages_file_gz(arch)
    lines << " #{Digest::MD5.hexdigest(packages_file(arch))}                   #{temp_packages_file.size} #{@options[:components]}/binary-#{arch}/Packages"
    lines << " #{Digest::MD5.hexdigest(packages_file_gz(arch))}                   #{temp_packages_file_gz.size} #{@options[:components]}/binary-#{arch}/Packages.gz"
  end
  lines.join("\n") + "\n"
end
release_file_gpg(path_to_gpgkey) click to toggle source

Get detached GPG signature of Release file

# File lib/ropes/repository/apt.rb, line 158
def release_file_gpg(path_to_gpgkey)
  GPGME::Key.import(File.open(path_to_gpgkey))
  GPGME::Crypto.new.sign(release_file, {
    :mode => GPGME::SIG_MODE_DETACH,
    :armor => true
  })
end

Private Instance Methods

packages_line(field, value) click to toggle source
# File lib/ropes/repository/apt.rb, line 169
def packages_line(field, value)
  "#{field}: #{value}"
end
validate_metadata(metadata_hash) click to toggle source
# File lib/ropes/repository/apt.rb, line 173
def validate_metadata(metadata_hash)
  @mandatory_fields.reject {|field| metadata_hash.has_key?(field)}
end