Blame dnf/rpm/transaction.py

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