Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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
Exemplo n.º 3
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 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'])
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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 ""
Exemplo n.º 11
0
    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" )
Exemplo n.º 12
0
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