|
Packit |
6f3914 |
# -*- coding: utf-8 -*-
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# Copyright (C) 2009, 2012-2018 Red Hat, Inc.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
# This program is free software; you can redistribute it and/or modify
|
|
Packit |
6f3914 |
# it under the terms of the GNU General Public License as published by
|
|
Packit |
6f3914 |
# the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
6f3914 |
# (at your option) any later version.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
# This program is distributed in the hope that it will be useful,
|
|
Packit |
6f3914 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
6f3914 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
6f3914 |
# GNU Library General Public License for more details.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
# You should have received a copy of the GNU General Public License
|
|
Packit |
6f3914 |
# along with this program; if not, write to the Free Software
|
|
Packit |
6f3914 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
6f3914 |
#
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
import calendar
|
|
Packit |
6f3914 |
import os
|
|
Packit |
6f3914 |
import time
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
import libdnf.transaction
|
|
Packit |
6f3914 |
import libdnf.utils
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
from dnf.i18n import ucd
|
|
Packit |
6f3914 |
from dnf.yum import misc
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
from .group import GroupPersistor, EnvironmentPersistor, RPMTransaction
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class RPMTransactionItemWrapper(object):
|
|
Packit |
6f3914 |
def __init__(self, swdb, item):
|
|
Packit |
6f3914 |
assert item is not None
|
|
Packit |
6f3914 |
self._swdb = swdb
|
|
Packit |
6f3914 |
self._item = item
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __str__(self):
|
|
Packit |
6f3914 |
return self._item.getItem().toStr()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __lt__(self, other):
|
|
Packit |
6f3914 |
return self._item < other._item
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __eq__(self, other):
|
|
Packit |
6f3914 |
return self._item == other._item
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __hash__(self):
|
|
Packit |
6f3914 |
return self._item.__hash__()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def match(self, pattern):
|
|
Packit |
6f3914 |
return True
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def name(self):
|
|
Packit |
6f3914 |
return self._item.getRPMItem().getName()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def epoch(self):
|
|
Packit |
6f3914 |
return self._item.getRPMItem().getEpoch()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def version(self):
|
|
Packit |
6f3914 |
return self._item.getRPMItem().getVersion()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def release(self):
|
|
Packit |
6f3914 |
return self._item.getRPMItem().getRelease()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def arch(self):
|
|
Packit |
6f3914 |
return self._item.getRPMItem().getArch()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def evr(self):
|
|
Packit |
6f3914 |
if self.epoch:
|
|
Packit |
6f3914 |
return "{}:{}-{}".format(self.epoch, self.version, self.release)
|
|
Packit |
6f3914 |
return "{}-{}".format(self.version, self.release)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def action(self):
|
|
Packit |
6f3914 |
return self._item.getAction()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@action.setter
|
|
Packit |
6f3914 |
def action(self, value):
|
|
Packit |
6f3914 |
self._item.setAction(value)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def reason(self):
|
|
Packit |
6f3914 |
return self._item.getReason()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def action_name(self):
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
return self._item.getActionName()
|
|
Packit |
6f3914 |
except AttributeError:
|
|
Packit |
6f3914 |
return ""
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def action_short(self):
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
return self._item.getActionShort()
|
|
Packit |
6f3914 |
except AttributeError:
|
|
Packit |
6f3914 |
return ""
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def state(self):
|
|
Packit |
6f3914 |
return self._item.getState()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@state.setter
|
|
Packit |
6f3914 |
def state(self, value):
|
|
Packit |
6f3914 |
self._item.setState(value)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def from_repo(self):
|
|
Packit |
6f3914 |
return self._item.getRepoid()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def ui_from_repo(self):
|
|
Packit |
6f3914 |
if not self._item.getRepoid():
|
|
Packit |
6f3914 |
return ""
|
|
Packit |
6f3914 |
return "@" + self._item.getRepoid()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def obsoleting(self):
|
|
Packit |
6f3914 |
return None
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_reason(self):
|
|
Packit |
6f3914 |
# TODO: get_history_reason
|
|
Packit |
6f3914 |
return self._swdb.rpm.get_reason(self)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def pkg(self):
|
|
Packit |
6f3914 |
return self._swdb.rpm._swdb_ti_pkg[self._item]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def files(self):
|
|
Packit |
6f3914 |
return self.pkg.files
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def _active(self):
|
|
Packit |
6f3914 |
return self.pkg
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class TransactionWrapper(object):
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
altered_lt_rpmdb = False
|
|
Packit |
6f3914 |
altered_gt_rpmdb = False
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __init__(self, trans):
|
|
Packit |
6f3914 |
self._trans = trans
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def tid(self):
|
|
Packit |
6f3914 |
return self._trans.getId()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def cmdline(self):
|
|
Packit |
6f3914 |
return self._trans.getCmdline()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def releasever(self):
|
|
Packit |
6f3914 |
return self._trans.getReleasever()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def beg_timestamp(self):
|
|
Packit |
6f3914 |
return self._trans.getDtBegin()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def end_timestamp(self):
|
|
Packit |
6f3914 |
return self._trans.getDtEnd()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def beg_rpmdb_version(self):
|
|
Packit |
6f3914 |
return self._trans.getRpmdbVersionBegin()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def end_rpmdb_version(self):
|
|
Packit |
6f3914 |
return self._trans.getRpmdbVersionEnd()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def return_code(self):
|
|
Packit |
6f3914 |
return int(self._trans.getState() != libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def loginuid(self):
|
|
Packit |
6f3914 |
return self._trans.getUserId()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def data(self):
|
|
Packit |
6f3914 |
return self.packages
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def is_output(self):
|
|
Packit |
6f3914 |
output = self._trans.getConsoleOutput()
|
|
Packit |
6f3914 |
return bool(output)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def tids(self):
|
|
Packit |
6f3914 |
return [self._trans.getId()]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def performed_with(self):
|
|
Packit |
6f3914 |
return []
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def packages(self):
|
|
Packit |
6f3914 |
result = self._trans.getItems()
|
|
Packit |
6f3914 |
return [RPMTransactionItemWrapper(self, i) for i in result]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def output(self):
|
|
Packit |
6f3914 |
return [i[1] for i in self._trans.getConsoleOutput()]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def error(self):
|
|
Packit |
6f3914 |
return []
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def compare_rpmdbv(self, rpmdbv):
|
|
Packit |
6f3914 |
self.altered_gt_rpmdb = self._trans.getRpmdbVersionEnd() != rpmdbv
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class MergedTransactionWrapper(TransactionWrapper):
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __init__(self, trans):
|
|
Packit |
6f3914 |
self._trans = libdnf.transaction.MergedTransaction(trans._trans)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def merge(self, trans):
|
|
Packit |
6f3914 |
self._trans.merge(trans._trans)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def loginuid(self):
|
|
Packit |
6f3914 |
return self._trans.listUserIds()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def tids(self):
|
|
Packit |
6f3914 |
return self._trans.listIds()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def return_code(self):
|
|
Packit |
6f3914 |
return [int(i != libdnf.transaction.TransactionItemState_DONE) for i in self._trans.listStates()]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def cmdline(self):
|
|
Packit |
6f3914 |
return self._trans.listCmdlines()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def releasever(self):
|
|
Packit |
6f3914 |
return self._trans.listReleasevers()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def output(self):
|
|
Packit |
6f3914 |
return [i[1] for i in self._trans.getConsoleOutput()]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
class SwdbInterface(object):
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __init__(self, db_dir, releasever=""):
|
|
Packit |
6f3914 |
# TODO: record all vars
|
|
Packit |
6f3914 |
# TODO: remove relreasever from options
|
|
Packit |
6f3914 |
self.releasever = str(releasever)
|
|
Packit |
6f3914 |
self._rpm = None
|
|
Packit |
6f3914 |
self._group = None
|
|
Packit |
6f3914 |
self._env = None
|
|
Packit |
6f3914 |
self._addon_data = None
|
|
Packit |
6f3914 |
self._swdb = None
|
|
Packit |
6f3914 |
self._db_dir = db_dir
|
|
Packit |
6f3914 |
self._output = []
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def __del__(self):
|
|
Packit |
6f3914 |
self.close()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def rpm(self):
|
|
Packit |
6f3914 |
if self._rpm is None:
|
|
Packit |
6f3914 |
self._rpm = RPMTransaction(self)
|
|
Packit |
6f3914 |
return self._rpm
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def group(self):
|
|
Packit |
6f3914 |
if self._group is None:
|
|
Packit |
6f3914 |
self._group = GroupPersistor(self)
|
|
Packit |
6f3914 |
return self._group
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def env(self):
|
|
Packit |
6f3914 |
if self._env is None:
|
|
Packit |
6f3914 |
self._env = EnvironmentPersistor(self)
|
|
Packit |
6f3914 |
return self._env
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def dbpath(self):
|
|
Packit |
6f3914 |
return os.path.join(self._db_dir, libdnf.transaction.Swdb.defaultDatabaseName)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def swdb(self):
|
|
Packit |
6f3914 |
""" Lazy initialize Swdb object """
|
|
Packit |
6f3914 |
if not self._swdb:
|
|
Packit |
6f3914 |
# _db_dir == persistdir which is prepended with installroot already
|
|
Packit |
6f3914 |
self._swdb = libdnf.transaction.Swdb(self.dbpath)
|
|
Packit |
6f3914 |
self._swdb.initTransaction()
|
|
Packit |
6f3914 |
# TODO: vars -> libdnf
|
|
Packit |
6f3914 |
return self._swdb
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def transform(self, input_dir):
|
|
Packit |
6f3914 |
transformer = libdnf.transaction.Transformer(input_dir, self.dbpath)
|
|
Packit |
6f3914 |
transformer.transform()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def close(self):
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
del self._tid
|
|
Packit |
6f3914 |
except AttributeError:
|
|
Packit |
6f3914 |
pass
|
|
Packit |
6f3914 |
self.swdb.closeTransaction()
|
|
Packit |
6f3914 |
self._rpm = None
|
|
Packit |
6f3914 |
self._group = None
|
|
Packit |
6f3914 |
self._env = None
|
|
Packit |
6f3914 |
if self._swdb:
|
|
Packit |
6f3914 |
self._swdb.closeDatabase()
|
|
Packit |
6f3914 |
self._swdb = None
|
|
Packit |
6f3914 |
self._output = []
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
@property
|
|
Packit |
6f3914 |
def path(self):
|
|
Packit |
6f3914 |
return self.swdb.getPath()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def reset_db(self):
|
|
Packit |
6f3914 |
return self.swdb.resetDatabase()
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: rename to get_last_transaction?
|
|
Packit |
6f3914 |
def last(self, complete_transactions_only=True):
|
|
Packit |
6f3914 |
# TODO: complete_transactions_only
|
|
Packit |
6f3914 |
t = self.swdb.getLastTransaction()
|
|
Packit |
6f3914 |
if not t:
|
|
Packit |
6f3914 |
return None
|
|
Packit |
6f3914 |
return TransactionWrapper(t)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: rename to: list_transactions?
|
|
Packit |
6f3914 |
def old(self, tids=None, limit=0, complete_transactions_only=False):
|
|
Packit |
6f3914 |
tids = tids or []
|
|
Packit |
6f3914 |
tids = [int(i) for i in tids]
|
|
Packit |
6f3914 |
result = self.swdb.listTransactions()
|
|
Packit |
6f3914 |
result = [TransactionWrapper(i) for i in result]
|
|
Packit |
6f3914 |
# TODO: move to libdnf
|
|
Packit |
6f3914 |
if tids:
|
|
Packit |
6f3914 |
result = [i for i in result if i.tid in tids]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# populate altered_lt_rpmdb and altered_gt_rpmdb
|
|
Packit |
6f3914 |
for i, trans in enumerate(result):
|
|
Packit |
6f3914 |
if i == 0:
|
|
Packit |
6f3914 |
continue
|
|
Packit |
6f3914 |
prev_trans = result[i-1]
|
|
Packit |
6f3914 |
if trans._trans.getRpmdbVersionBegin() != prev_trans._trans.getRpmdbVersionEnd():
|
|
Packit |
6f3914 |
trans.altered_lt_rpmdb = True
|
|
Packit |
6f3914 |
prev_trans.altered_gt_rpmdb = True
|
|
Packit |
6f3914 |
return result[::-1]
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def set_reason(self, pkg, reason):
|
|
Packit |
6f3914 |
"""Set reason for package"""
|
|
Packit |
6f3914 |
rpm_item = self.rpm._pkg_to_swdb_rpm_item(pkg)
|
|
Packit |
6f3914 |
repoid = self.repo(pkg)
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_REASON_CHANGE
|
|
Packit |
6f3914 |
reason = reason
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(rpm_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
return ti
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
'''
|
|
Packit |
6f3914 |
def package(self, pkg):
|
|
Packit |
6f3914 |
"""Get SwdbPackage from package"""
|
|
Packit |
6f3914 |
return self.swdb.package(str(pkg))
|
|
Packit |
6f3914 |
'''
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def repo(self, pkg):
|
|
Packit |
6f3914 |
"""Get repository of package"""
|
|
Packit |
6f3914 |
return self.swdb.getRPMRepo(str(pkg))
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def package_data(self, pkg):
|
|
Packit |
6f3914 |
"""Get package data for package"""
|
|
Packit |
6f3914 |
# trans item is returned
|
|
Packit |
6f3914 |
result = self.swdb.getRPMTransactionItem(str(pkg))
|
|
Packit |
6f3914 |
if result is None:
|
|
Packit |
6f3914 |
return result
|
|
Packit |
6f3914 |
result = RPMTransactionItemWrapper(self, result)
|
|
Packit |
6f3914 |
return result
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# def reason(self, pkg):
|
|
Packit |
6f3914 |
# """Get reason for package"""
|
|
Packit |
6f3914 |
# result = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
|
|
Packit |
6f3914 |
# return result
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: rename to begin_transaction?
|
|
Packit |
6f3914 |
def beg(self, rpmdb_version, using_pkgs, tsis, cmdline=None):
|
|
Packit |
6f3914 |
try:
|
|
Packit |
6f3914 |
self.swdb.initTransaction()
|
|
Packit |
6f3914 |
except:
|
|
Packit |
6f3914 |
pass
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
'''
|
|
Packit |
6f3914 |
for pkg in using_pkgs:
|
|
Packit |
6f3914 |
pid = self.pkg2pid(pkg)
|
|
Packit |
6f3914 |
self.swdb.trans_with(tid, pid)
|
|
Packit |
6f3914 |
'''
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# add RPMs to the transaction
|
|
Packit |
6f3914 |
# TODO: _populate_rpm_ts() ?
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
if self.group:
|
|
Packit |
6f3914 |
for group_id, group_item in sorted(self.group._installed.items()):
|
|
Packit |
6f3914 |
repoid = ""
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_INSTALL
|
|
Packit |
6f3914 |
reason = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(group_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
for group_id, group_item in sorted(self.group._upgraded.items()):
|
|
Packit |
6f3914 |
repoid = ""
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_UPGRADE
|
|
Packit |
6f3914 |
reason = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(group_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
for group_id, group_item in sorted(self.group._removed.items()):
|
|
Packit |
6f3914 |
repoid = ""
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_REMOVE
|
|
Packit |
6f3914 |
reason = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(group_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
if self.env:
|
|
Packit |
6f3914 |
for env_id, env_item in sorted(self.env._installed.items()):
|
|
Packit |
6f3914 |
repoid = ""
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_INSTALL
|
|
Packit |
6f3914 |
reason = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(env_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
for env_id, env_item in sorted(self.env._upgraded.items()):
|
|
Packit |
6f3914 |
repoid = ""
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_UPGRADE
|
|
Packit |
6f3914 |
reason = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(env_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
for env_id, env_item in sorted(self.env._removed.items()):
|
|
Packit |
6f3914 |
repoid = ""
|
|
Packit |
6f3914 |
action = libdnf.transaction.TransactionItemAction_REMOVE
|
|
Packit |
6f3914 |
reason = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
replaced_by = None
|
|
Packit |
6f3914 |
ti = self.swdb.addItem(env_item, repoid, action, reason)
|
|
Packit |
6f3914 |
ti.setState(libdnf.transaction.TransactionItemState_DONE)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# save when everything is in memory
|
|
Packit |
6f3914 |
tid = self.swdb.beginTransaction(
|
|
Packit |
6f3914 |
int(calendar.timegm(time.gmtime())),
|
|
Packit |
6f3914 |
str(rpmdb_version),
|
|
Packit |
6f3914 |
cmdline or "",
|
|
Packit |
6f3914 |
int(misc.getloginuid())
|
|
Packit |
6f3914 |
)
|
|
Packit |
6f3914 |
self.swdb.setReleasever(self.releasever)
|
|
Packit |
6f3914 |
self._tid = tid
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
return tid
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def pkg_to_swdb_rpm_item(self, po):
|
|
Packit |
6f3914 |
rpm_item = self.swdb.createRPMItem()
|
|
Packit |
6f3914 |
rpm_item.setName(po.name)
|
|
Packit |
6f3914 |
rpm_item.setEpoch(po.epoch or 0)
|
|
Packit |
6f3914 |
rpm_item.setVersion(po.version)
|
|
Packit |
6f3914 |
rpm_item.setRelease(po.release)
|
|
Packit |
6f3914 |
rpm_item.setArch(po.arch)
|
|
Packit |
6f3914 |
return rpm_item
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def log_scriptlet_output(self, msg):
|
|
Packit |
6f3914 |
if not hasattr(self, '_tid'):
|
|
Packit |
6f3914 |
return
|
|
Packit |
6f3914 |
if not msg:
|
|
Packit |
6f3914 |
return
|
|
Packit |
6f3914 |
for line in msg.splitlines():
|
|
Packit |
6f3914 |
line = ucd(line)
|
|
Packit |
6f3914 |
# logging directly to database fails if transaction runs in a background process
|
|
Packit |
6f3914 |
self._output.append((1, line))
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
'''
|
|
Packit |
6f3914 |
def _log_errors(self, errors):
|
|
Packit |
6f3914 |
for error in errors:
|
|
Packit |
6f3914 |
error = ucd(error)
|
|
Packit |
6f3914 |
self.swdb.log_error(self._tid, error)
|
|
Packit |
6f3914 |
'''
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def end(self, end_rpmdb_version="", return_code=None, errors=None):
|
|
Packit |
6f3914 |
if not hasattr(self, '_tid'):
|
|
Packit |
6f3914 |
return # Failed at beg() time
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
if return_code is None:
|
|
Packit |
6f3914 |
# return_code/state auto-detection
|
|
Packit |
6f3914 |
return_code = libdnf.transaction.TransactionState_DONE
|
|
Packit |
6f3914 |
for tsi in self.rpm:
|
|
Packit |
6f3914 |
if tsi.state == libdnf.transaction.TransactionItemState_ERROR:
|
|
Packit |
6f3914 |
return_code = libdnf.transaction.TransactionState_ERROR
|
|
Packit |
6f3914 |
break
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
for file_descriptor, line in self._output:
|
|
Packit |
6f3914 |
self.swdb.addConsoleOutputLine(file_descriptor, line)
|
|
Packit |
6f3914 |
self._output = []
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
self.swdb.endTransaction(
|
|
Packit |
6f3914 |
int(time.time()),
|
|
Packit |
6f3914 |
str(end_rpmdb_version),
|
|
Packit |
6f3914 |
return_code,
|
|
Packit |
6f3914 |
)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# Closing and cleanup is done in the close() method.
|
|
Packit |
6f3914 |
# It is important to keep data around after the transaction ends
|
|
Packit |
6f3914 |
# because it's needed by plugins to report installed packages etc.
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# TODO: ignore_case, more patterns
|
|
Packit |
6f3914 |
def search(self, patterns, ignore_case=True):
|
|
Packit |
6f3914 |
""" Search for history transactions which contain specified
|
|
Packit |
6f3914 |
packages al. la. "yum list". Returns transaction ids. """
|
|
Packit |
6f3914 |
return self.swdb.searchTransactionsByRPM(patterns)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def user_installed(self, pkg):
|
|
Packit |
6f3914 |
"""Returns True if package is user installed"""
|
|
Packit |
6f3914 |
reason = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
|
|
Packit |
6f3914 |
if reason == libdnf.transaction.TransactionItemReason_USER:
|
|
Packit |
6f3914 |
return True
|
|
Packit |
6f3914 |
# if reason is not known, consider a package user-installed
|
|
Packit |
6f3914 |
# because it was most likely installed via rpm
|
|
Packit |
6f3914 |
if reason == libdnf.transaction.TransactionItemReason_UNKNOWN:
|
|
Packit |
6f3914 |
return True
|
|
Packit |
6f3914 |
return False
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
def get_erased_reason(self, pkg, first_trans, rollback):
|
|
Packit |
6f3914 |
"""Get reason of package before transaction being undone. If package
|
|
Packit |
6f3914 |
is already installed in the system, keep his reason.
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
:param pkg: package being installed
|
|
Packit |
6f3914 |
:param first_trans: id of first transaction being undone
|
|
Packit |
6f3914 |
:param rollback: True if transaction is performing a rollback"""
|
|
Packit |
6f3914 |
if rollback:
|
|
Packit |
6f3914 |
# return the reason at the point of rollback; we're setting that reason
|
|
Packit |
6f3914 |
result = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, first_trans)
|
|
Packit |
6f3914 |
else:
|
|
Packit |
6f3914 |
result = self.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
|
|
Packit |
6f3914 |
|
|
Packit |
6f3914 |
# consider unknown reason as user-installed
|
|
Packit |
6f3914 |
if result == libdnf.transaction.TransactionItemReason_UNKNOWN:
|
|
Packit |
6f3914 |
result = libdnf.transaction.TransactionItemReason_USER
|
|
Packit |
6f3914 |
return result
|