class RepoMate::Package

Class for reading debian packages

Attributes

architecture[R]
basename[R]
component[R]
controlfile[R]
fullname[R]
name[R]
newbasename[R]
suitename[R]
version[R]

Public Class Methods

new(fullname, suitename, component) click to toggle source

Init

# File lib/repomate/package.rb, line 17
def initialize(fullname, suitename, component)
  @fullname   = fullname
  @suitename  = suitename
  @component  = component
  @basename   = File.basename(fullname)
  @mtime      = File.mtime(fullname)
  @pkgdbfile  = File.join(Cfg.rootdir, "packages.db")
  @pkgdb      = Database.new(@pkgdbfile)

  check_package
  create_table

  @controlfile  = read_controlfile
  @name         = @controlfile['Package']
  @version      = @controlfile['Version']
  @architecture = @controlfile['Architecture']
  @newbasename  = "#{@name}-#{@version}_#{@architecture}.deb"
end

Public Instance Methods

create_checksums() click to toggle source

Creates the checksums for a package

# File lib/repomate/package.rb, line 61
def create_checksums
  # puts "Ins: #{@basename}"
  md5      = Digest::MD5.file(@fullname).to_s
  sha1     = Digest::SHA1.file(@fullname).to_s
  sha256   = Digest::SHA2.new(256).file(@fullname).to_s
  @pkgdb.query("insert into checksums values ( datetime('now'), '#{@basename}', '#{@suitename}', '#{@mtime.iso8601}', '#{md5}', '#{sha1}', '#{sha256}' )")
end
create_table() click to toggle source

Create the package table

# File lib/repomate/package.rb, line 37
def create_table
  sql = "create table if not exists checksums (
          date varchar(25),
          basename varchar(70),
          suitename varchar(20),
          mtime varchar(25),
          md5 varchar(32),
          sha1 varchar(40),
          sha256 varchar(64)
  )"
  @pkgdb.query(sql)
end
delete_checksums() click to toggle source

Gets checksums for the given package

# File lib/repomate/package.rb, line 70
def delete_checksums
  # puts "Del: #{@basename}"
  @pkgdb.query("delete from checksums where basename = '#{@basename}'")
end
load_checksums() click to toggle source

Gets checksums for the given package

# File lib/repomate/package.rb, line 51
def load_checksums
  result = []

  @pkgdb.query("select md5, sha1, sha256 from checksums where basename = '#{@basename}' and mtime = '#{@mtime.iso8601}' and suitename = '#{@suitename}'").each do |row|
    result = row
  end
  result
end

Protected Instance Methods

check_package() click to toggle source

Checks if the given package is a debian package

# File lib/repomate/package.rb, line 78
def check_package
  unless `file --dereference #{@fullname}` =~ /Debian binary package/i
    puts "File does not exist or is not a Debian package!"
    false
  end
end
read_controlfile() click to toggle source

Extracts the controlfile and returns is

# File lib/repomate/package.rb, line 86
def read_controlfile
  gzbasename  = "control.tar.gz"
  basename    = "control"
  tmpdir      = File.expand_path "#{Dir.tmpdir}/#{Time.now.to_i}#{rand(1000)}/"
  gzfullname  = File.join(tmpdir, gzbasename)
  fullname    = File.join(tmpdir, basename)

  controlfile = {}

  FileUtils.mkdir_p(tmpdir)

  begin
    raise "Could not untar" unless system "ar -p #{@fullname} #{gzbasename} > #{gzfullname}"
    raise Errno::ENOENT, "Package file does not exist" unless File.exists?(gzfullname)
    raise "Could not untar" unless system "tar xfz #{gzfullname} -C #{tmpdir}"

    File.open(fullname) do |file|
      while(line = file.gets)
        line =~ %r{([a-zA-Z\-]+):\s(.*)}
        controlfile[$1] = $2
      end
    end
  ensure
    FileUtils.rm_rf(tmpdir)
  end
  controlfile
end