Blame dnf/rpm/transaction.py

Packit 6f3914
#
Packit 6f3914
# Client code for Update Agent
Packit 6f3914
# Copyright (c) 1999-2002 Red Hat, Inc.  Distributed under GPL.
Packit 6f3914
#
Packit 6f3914
#         Adrian Likins <alikins@redhat.com>
Packit 6f3914
# Some Edits by Seth Vidal <skvidal@phy.duke.edu>
Packit 6f3914
#
Packit 6f3914
# a couple of classes wrapping up transactions so that we
Packit 6f3914
#    can share transactions instead of creating new ones all over
Packit 6f3914
#
Packit 6f3914
Packit 6f3914
from __future__ import absolute_import
Packit 6f3914
from __future__ import unicode_literals
Packit 6f3914
from dnf.i18n import _
Packit 6f3914
import rpm
Packit 6f3914
Packit 6f3914
read_ts = None
Packit 6f3914
ts = None
Packit 6f3914
Packit 6f3914
# wrapper/proxy class for rpm.Transaction so we can
Packit 6f3914
# instrument it, etc easily
Packit 6f3914
class TransactionWrapper(object):
Packit 6f3914
    def __init__(self, root='/'):
Packit 6f3914
        self.ts = rpm.TransactionSet(root)
Packit 6f3914
        self._methods = ['check',
Packit 6f3914
                         'order',
Packit 6f3914
                         'addErase',
Packit 6f3914
                         'addInstall',
Packit 6f3914
                         'addReinstall',
Packit 6f3914
                         'run',
Packit 6f3914
                         'pgpImportPubkey',
Packit 6f3914
                         'pgpPrtPkts',
Packit 6f3914
                         'problems',
Packit 6f3914
                         'setFlags',
Packit 6f3914
                         'setVSFlags',
Packit 6f3914
                         'setProbFilter',
Packit 6f3914
                         'hdrFromFdno',
Packit 6f3914
                         'next',
Packit 6f3914
                         'clean']
Packit 6f3914
        self.tsflags = []
Packit 6f3914
        self.open = True
Packit 6f3914
Packit 6f3914
    def __del__(self):
Packit 6f3914
        # Automatically close the rpm transaction when the reference is lost
Packit 6f3914
        self.close()
Packit 6f3914
Packit 6f3914
    def close(self):
Packit 6f3914
        if self.open:
Packit 6f3914
            self.ts.closeDB()
Packit 6f3914
            self.ts = None
Packit 6f3914
            self.open = False
Packit 6f3914
Packit 6f3914
    def dbMatch(self, *args, **kwds):
Packit 6f3914
        if 'patterns' in kwds:
Packit 6f3914
            patterns = kwds.pop('patterns')
Packit 6f3914
        else:
Packit 6f3914
            patterns = []
Packit 6f3914
Packit 6f3914
        mi = self.ts.dbMatch(*args, **kwds)
Packit 6f3914
        for (tag, tp, pat) in patterns:
Packit 6f3914
            mi.pattern(tag, tp, pat)
Packit 6f3914
        return mi
Packit 6f3914
Packit 6f3914
    def __getattr__(self, attr):
Packit 6f3914
        if attr in self._methods:
Packit 6f3914
            return self.getMethod(attr)
Packit 6f3914
        else:
Packit 6f3914
            raise AttributeError(attr)
Packit 6f3914
Packit 6f3914
    def __iter__(self):
Packit 6f3914
        return self.ts
Packit 6f3914
Packit 6f3914
    def getMethod(self, method):
Packit 6f3914
        # in theory, we can override this with
Packit 6f3914
        # profile/etc info
Packit 6f3914
        return getattr(self.ts, method)
Packit 6f3914
Packit 6f3914
    # push/pop methods so we dont lose the previous
Packit 6f3914
    # set value, and we can potentiall debug a bit
Packit 6f3914
    # easier
Packit 6f3914
    def pushVSFlags(self, flags):
Packit 6f3914
        self.tsflags.append(flags)
Packit 6f3914
        self.ts.setVSFlags(self.tsflags[-1])
Packit 6f3914
Packit 6f3914
    def addTsFlag(self, flag):
Packit 6f3914
        curflags = self.ts.setFlags(0)
Packit 6f3914
        self.ts.setFlags(curflags | flag)
Packit 6f3914
Packit 6f3914
    def getTsFlags(self):
Packit 6f3914
        curflags = self.ts.setFlags(0)
Packit 6f3914
        self.ts.setFlags(curflags)
Packit 6f3914
        return curflags
Packit 6f3914
Packit 6f3914
    def isTsFlagSet(self, flag):
Packit 6f3914
        val = self.getTsFlags()
Packit 6f3914
        return bool(flag & val)
Packit 6f3914
Packit 6f3914
    def setScriptFd(self, fd):
Packit 6f3914
        self.ts.scriptFd = fd.fileno()
Packit 6f3914
Packit 6f3914
    def test(self, cb, conf={}):
Packit 6f3914
        """tests the ts we've setup, takes a callback function and a conf dict
Packit 6f3914
           for flags and what not"""
Packit 6f3914
Packit 6f3914
        origflags = self.getTsFlags()
Packit 6f3914
        self.addTsFlag(rpm.RPMTRANS_FLAG_TEST)
Packit 6f3914
        # FIXME GARBAGE - remove once this is reimplemented elsewhere
Packit 6f3914
        # KEEPING FOR API COMPLIANCE ONLY
Packit 6f3914
        if conf.get('diskspacecheck') == 0:
Packit 6f3914
            self.ts.setProbFilter(rpm.RPMPROB_FILTER_DISKSPACE)
Packit 6f3914
        tserrors = self.ts.run(cb.callback, '')
Packit 6f3914
        self.ts.setFlags(origflags)
Packit 6f3914
Packit 6f3914
        reserrors = []
Packit 6f3914
        if tserrors is not None:
Packit 6f3914
            for (descr, (etype, mount, need)) in tserrors:
Packit 6f3914
                reserrors.append(descr)
Packit 6f3914
            if not reserrors:
Packit 6f3914
                reserrors.append(_('Errors occurred during test transaction.'))
Packit 6f3914
Packit 6f3914
        return reserrors
Packit 6f3914
Packit 6f3914
def initReadOnlyTransaction(root='/'):
Packit 6f3914
    read_ts =  TransactionWrapper(root=root)
Packit 6f3914
    read_ts.pushVSFlags((rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS))
Packit 6f3914
    return read_ts