def main(): if len(sys.argv) == 1: sys.exit("Usage: convert.py <hdlist file|rpms dir> ...") if not hasattr(rpm, "headerFromPackage"): ts = rpm.TransactionSet() else: ts = None for entry in sys.argv[1:]: if os.path.isfile(entry): for header in rpm.readHeaderListFromFile(entry): name = header[rpm.RPMTAG_NAME] for filename in header[rpm.RPMTAG_FILENAMES]: print filename, name if os.path.isdir(entry): for filename in os.listdir(entry): if filename.endswith(".rpm"): filepath = os.path.join(entry, filename) file = open(filepath) if ts: header = ts.hdrFromFdno(file.fileno()) else: header = rpm.headerFromPackage(file.fileno())[0] name = header[rpm.RPMTAG_NAME] for filename in header[rpm.RPMTAG_FILENAMES]: print filename, name file.close()
def rpmOpen(nameRpm, dir, subdir): print("rpmOpen %s" % (nameRpm)) if subdir != None: buffer = "%s/%s/%s" % (dir['rpmdir'], subdir, nameRpm) else: buffer = "%s/%s" % (dir['rpmdir'], nameRpm) if os.access(buffer, os.R_OK) == 0: return if force == 0: res = sql.sql_get_package_id(buffer) if res >= 0: print("package %s is already in the database" % (nameRpm)) return try: fd = os.open(buffer, os.O_RDONLY) (h, isSource) = rpm.headerFromPackage(fd) os.close(fd) except: print("Failed to read header of %s" % (buffer)) return cur = rpmAnalyze(buffer, nameRpm, h, dir, subdir, None, isSource) return cur
def install(self, transaction): 'Install rpm packages given a dictionary of packages.' # Check that all packages are available. if (len(transaction) < 1) or not transaction: raise ex.install_error, "unrecogniced transaction format." missingfiles = [] for package in transaction.values(): if not package.has_key('localfilename'): msg = "%s has no 'localfilename'" %package['name'] missingfiles.append(msg) continue if not os.path.isfile(package['localfilename']): missingfiles.append(package['localfilename']) if len(missingfiles) > 0: raise ex.install_error("Missing files",missingfiles) if self.oldrpm: ts = rpm.TransactionSet(self.root, self.db) else: ts = rpm.TransactionSet(self.root) ts.setVSFlags(~(rpm.RPMVSF_NODSA|rpm.RPMVSF_NORSA)) self.filenames = {} self.modes = {} ts_names = [] for package in transaction.values(): if package['flag'] == "upgrade": transactionmode = "u" elif package['flag'] == "install": transactionmode = "i" else: errmsg = "Mode '%s' for package '%s' not recognized." \ % (package['flag'], package['name']) raise ex.install_error(errmsg) fd = os.open(package['localfilename'], os.O_RDONLY) try: if self.oldrpm: hdr = rpm.headerFromPackage(fd)[0] else: headerts = rpm.TransactionSet(self.root) headerts.setVSFlags(~(rpm.RPMVSF_NODSA|rpm.RPMVSF_NORSA)) hdr = headerts.hdrFromFdno(fd) except rpm.error, e: if str(e) == 'public key not available': self.log.write_stdout('\nThe public key associated with this package was not found.\n\n') self.filenames[hdr[rpm.RPMTAG_NAME]] = package['localfilename'] self.modes[hdr[rpm.RPMTAG_NAME]] = package['flag'] os.close(fd) if self.oldrpm: ts.add(hdr, hdr, transactionmode) else: #RPM>=4.1 needs this ts.addInstall(hdr, hdr, transactionmode) ts_names.append(package['name'])
def getDetails(path, filename): fn = os.path.join(path, filename) f = open(fn) (h, something) = rpm.headerFromPackage(f.fileno()) f.close() p = Package(filename, h) return p
def getDetails(path, filename): fn=os.path.join(path, filename) f=open(fn) (h, something)=rpm.headerFromPackage(f.fileno()) f.close() p=Package(filename, h) return p
def rpm_fileheader(pkgpath): log.debug("Grabbing the rpm header of %s" % pkgpath) is_oldrpm = hasattr(rpm, 'opendb') try: fd = os.open(pkgpath, 0) if is_oldrpm: h = rpm.headerFromPackage(fd)[0] else: ts = rpm.TransactionSet() h = ts.hdrFromFdno(fd) del ts except (OSError, TypeError): raise RPMNotFound os.close(fd) return h
def rpm_fileheader(pkgpath): log.debug("Grabbing the rpm header of %s" % pkgpath) is_oldrpm = hasattr(rpm, 'opendb') try: fd = os.open(pkgpath, 0) if is_oldrpm: h = rpm.headerFromPackage(fd)[0] else: ts = rpm.TransactionSet() h = ts.hdrFromFdno(fd) del ts except (OSError, TypeError): raise RPMNotFound os.close(fd) return h
def readHeaders(self): hl = [] path = self.path + "/RedHat/RPMS" for n in os.listdir(path): fd = os.open(path + "/" + n, 0) try: (h, isSource) = rpm.headerFromPackage(fd) if (h and not isSource): self.fnames[h] = n hl.append(h) except: pass os.close(fd) return HeaderList(hl)
def get_package(self, name, file=False): '''Takes a filename for a rpm-package. Returns a package dictionary.''' dict = {} if file: file_output = os.popen("file %s" % name).read() file_output = string.split(file_output) dict["md5sum"] = utils.md5sum(name) package_type, package_type_version = file_output[1:3] fd = os.open(name, os.O_RDONLY) dict["filename"] = name dict["basename"] = os.path.basename(name) if self.oldrpm: rpmheader = rpm.headerFromPackage(fd)[0] else: #RPM>=4.1 needs this ts = rpm.TransactionSet(self.root) ts.setVSFlags(~(rpm.RPMVSF_NOMD5|rpm.RPMVSF_NEEDPAYLOAD|rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) ts.setVSFlags(~(rpm.RPMVSF_NODSA|rpm.RPMVSF_NORSA)) rpmheader = ts.hdrFromFdno(fd) os.close(fd) dict["package_type"] = (package_type + package_type_version) else: #If self.packages has been generated, we could just return the #dict already generated. if self.packages.has_key(name): return self.packages[name] if self.oldrpm: packagelist = self.db.findbyname(name) if not len(packagelist) > 0: return None index = self.db.findbyname(name)[0] rpmheader = self.db[index] else: #RPM>=4.1 needs this headers = self.db.dbMatch('name',str(name)) rpmheader = None if headers.count() == 0: return None else: for header in headers: rpmheader = header dict.update(self._create_package(rpmheader)) return dict
def __init__(self, filename, dirname="/var/tmp/scrutiny", header=None, is_source=0): self.filename=filename self.extracted=0 self.dirname=dirname self.file_info=None self._config_files=None self._doc_files=None self._ghost_files=None self._files=None self._requires=None self._req_names=-1 if header: self.header=header self.is_source=is_source else: # Create a package object from the file name if v42: ts=rpm.TransactionSet() # Don't check signatures here... ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES) fd=os.open(filename, os.O_RDONLY) self.header=ts.hdrFromFdno(fd) os.close(fd) if self.header[rpm.RPMTAG_SOURCEPACKAGE]: self.is_source=1 else: self.is_source=0 else: fd=os.open(filename, os.O_RDONLY) (self.header, self.is_source)=rpm.headerFromPackage(fd) os.close(fd) self._lang_files=None self.name=self.header[rpm.RPMTAG_NAME] or "" self.version = self.header[rpm.RPMTAG_VERSION] or "" self.packager = self.header[rpm.RPMTAG_PACKAGER] or "" self.arch = self.header[rpm.RPMTAG_ARCH] or ""
def __init__(self, file, log): super(RpmPackage, self).__init__(file, log) # Try to find out RPM package's information from RPM database if not rpm: cmd = "rpm -qp --queryformat='%%{NAME} %%{EPOCH} %%{VERSION} %%{RELEASE} %%{SOURCERPM}' %s " %self.file status, output = commands.getstatusoutput(cmd) if status != 0: raise Error, "error querying rpm file %s" % self.file else: tokens = string.split(output, " ") if len(tokens) != 5: raise Error, "unexpected output querying rpm file %s: %s" % (self.file, output) else: self.name, self.epoch, self.version, self.release, srpm = tokens if self.epoch == "(none)": self.epoch = None if srpm != "(none)": self.type = "rpm" else: self.type = "srpm" else: # Boost up query if rpm module is available f = open(self.file) if hasattr(rpm, "headerFromPackage"): h = rpm.headerFromPackage(f.fileno())[0] else: ts = rpm.TransactionSet() h = ts.hdrFromFdno(f.fileno()) f.close() self.name = h[rpm.RPMTAG_NAME] self.epoch = h[rpm.RPMTAG_EPOCH] self.version = h[rpm.RPMTAG_VERSION] self.release = h[rpm.RPMTAG_RELEASE] if h[rpm.RPMTAG_SOURCERPM]: self.type = "rpm" else: self.type = "srpm" self.log = os.path.join( self.unpackdir, self.name + ".log" )
class driver: install_error = "rpmdriver.install_error" query_error = "rpmdriver.query_error" general_error = (install_error, query_error) def __init__(self, log): self.fd = 0 self.db = None self.conflicts = None self.packages = None self.log = log def __del__(self): if self.db: del self.db if self.fd != 0: os.close(self.fd) def _install_callback(self, what, bytes, total, h, user): if what == rpm.RPMCALLBACK_INST_OPEN_FILE: filename = self.filenames[h[rpm.RPMTAG_NAME]] mode = self.modes[h[rpm.RPMTAG_NAME]] tty_mode = TTY_MODETEXT[mode] self.log.write_tty("\r" + " " * 80) message = "\r%s %s - " % (tty_mode, os.path.basename(filename)) self.log.write_tty(message) self.fd = os.open(filename, os.O_RDONLY) return self.fd elif what == rpm.RPMCALLBACK_INST_CLOSE_FILE: filename = self.filenames[h[rpm.RPMTAG_NAME]] mode = self.modes[h[rpm.RPMTAG_NAME]] tty_mode = TTY_MODETEXT[mode] message = "\r%s %s - done\n" % \ (tty_mode, os.path.basename(filename)) self.log.write_tty(message) log_mode = LOG_MODETEXT[mode] message = "%s %s." % (log_mode, os.path.basename(filename)) self.log.write_log(message) if not self.log.isatty_stdout: self.log.write_stdout(message) os.close(self.fd) self.fd = 0 def install(self, transaction): 'Install rpm packages given a dictionary of packages.' # Check that all packages are available. if (len(transaction) < 1) or not transaction: raise self.install_error, "unrecogniced transaction format." missingfiles = [] for package in transaction.values(): if not os.path.isfile(package.localfilename): missingfiles.append(package.localfilename) if len(missingfiles) > 0: raise self.install_error, "can not find files '%s'" % \ missingfiles # Create a rpm-transaction and check for dependencies. try: self.open_db(writeflag=true) except rpm.error, errmsg: raise self.install_error, errmsg ts = rpm.TransactionSet('/', self.db) self.filenames = {} self.modes = {} ts_names = "" for package in transaction.values(): if package.flag == "upgrade": transactionmode = "u" elif package.flag == "install": transactionmode = "i" else: raise self.install_error, \ "mode '%s' for package '%s' not recognized." \ % (package.flag, package.name) fd = os.open(package.localfilename, os.O_RDONLY) hdr = rpm.headerFromPackage(fd)[0] self.filenames[hdr[rpm.RPMTAG_NAME]] = package.localfilename self.modes[hdr[rpm.RPMTAG_NAME]] = package.flag os.close(fd) ts.add(hdr, hdr, transactionmode) if ts_names == "": ts_names = package.name else: ts_names = ts_names + " " + package.name # Check dependencies (If there are any dependencies, there must be # something wrong with the SPI-files). ts.order() deps = ts.depcheck() if deps: deps_message = "" for ((name, version, release), (reqname, reqversion), flags, suggest, sense) in deps: if sense == rpm.RPMDEP_SENSE_REQUIRES: if reqversion == "": deps_message = deps_message + \ "\tPackage '%s' requires '%s'.\n" % \ (name, reqname) else: deps_message = deps_message + \ "\tPackage '%s' requires '%s' version '%s'.\n"% \ (name, reqname, reqversion) raise self.install_error, \ "Unable to resolve dependencies for the packages"\ "\n\t%s\n%s" % (ts_names, deps_message) # Install the rpms errors = ts.run(0, 0, self._install_callback, '') self.log.write_tty('\n') if errors: error_description = "RPM: " for error in errors: error_description = error_description + str(error[0]) + "\n" error_description = error_description + "Skipping: %s." %\ ts_names raise self.install_error, error_description