Class: MiqRpmPackages

Inherits:
Object
  • Object
show all
Defined in:
lib/metadata/linux/MiqRpmPackages.rb

Overview

RPM Specification located at: jrpm.sourceforge.net/rpmspec/index.html

Constant Summary collapse

RPM_INT32_TYPE =

The data types we support.

4
RPM_STRING_TYPE =
6
RPM_STRING_ARRAY_TYPE =
8
RPM_I18NSTRING_TYPE =
9
NAME =

The things we care about.

1000
VERSION =
1001
RELEASE =
1002
SUMMARY =
1004
DESCRIPTION =
1005
BUILDTIME =
1006
INSTALLTIME =
1008
VENDOR =
1011
GROUP =
1016
URL =
1020
ARCH =
1022
REQUIRES =
1049
TAGIDS =
{
  1000 => "name",
  1001 => "version",
  1002 => "release",
  1004 => "summary",
  1005 => "description",
  1006 => "buildtime",
  1008 => "installtime",
  1011 => "vendor",
  1016 => "category",  # group
  1020 => "url",
  1022 => "arch",
  1049 => "depends",   # requires
}
RPML_HEADER =

Nubbers on disk are in network byte order.

BinaryStruct.new([
  'N',        'num_index',
  "N",        'num_data'
])
RPML_HEADER_LEN =
RPML_HEADER.size
ENTRY_INFO =
BinaryStruct.new([
  'N',        'tag',
  'N',        'ttype',
  'N',        'offset',
  'N',        'count'
])
ENTRY_INFO_LEN =
ENTRY_INFO.size

Instance Method Summary collapse

Constructor Details

#initialize(fs, dbFile) ⇒ MiqRpmPackages

Returns a new instance of MiqRpmPackages.



68
69
70
71
72
# File 'lib/metadata/linux/MiqRpmPackages.rb', line 68

def initialize(fs, dbFile)
  @pkgDb = MiqBerkeleyDB::MiqBdb.new(dbFile, fs)
  # Pre-read all pages into the bdb cache, as we will be processing all of them anyway.
  @pkgDb.readAllPages
end

Instance Method Details

#closeObject

def each



104
105
106
# File 'lib/metadata/linux/MiqRpmPackages.rb', line 104

def close
  @pkgDb.close
end

#eachObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/metadata/linux/MiqRpmPackages.rb', line 74

def each
  @pkgDb.each_value do |v|
    next if v.length <= RPML_HEADER_LEN

    hdr = RPML_HEADER.decode(v)

    offset = RPML_HEADER_LEN + (ENTRY_INFO_LEN * hdr['num_index'])
    if v.length != offset + hdr['num_data']
      $log.debug "record length = #{v.length}"
      $log.debug "num_index = #{hdr['num_index']}"
      $log.debug "num_data = #{hdr['num_data']}"
      $log.error "Invalid or corrupt RPM database record"
      next
    end

    data = v[offset, hdr['num_data']]
    pkg = {}

    eis = ENTRY_INFO.decode(v[RPML_HEADER_LEN..-1], hdr['num_index'])
    eis.each do |ei|
      tag = TAGIDS[ei['tag']]
      next if tag.nil?
      pkg[tag] = getVal(data, ei)
      pkg[tag] = convert(tag, pkg[tag])
    end
    pkg['installed'] = true unless pkg.empty?
    yield(MiqHashStruct.new(pkg))
  end
end