|
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
|