Viewing file: rollback.py (9.69 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/python
# Copyright (c) 1999-2002 Red Hat, Inc. Distributed under GPL. # # Author: Adrian Likins <alikins@redhat.com>
# imports are a bit weird here to avoid name collions on "harware" import sys sys.path.append("/usr/share/rhn/") from up2date_client import rollbacks from up2date_client import configUtils from up2date_client import config from up2date_client import up2dateErrors from up2date_client import up2dateUtils argVerbose = 0
cfg = config.initUp2dateConfig()
__rhnexport__ = [ 'rollback', 'listTransactions', 'config', 'undo' ]
_rollback = rollbacks.Rollback()
def listTransactions(): data = {} data['version'] = "0" data['name'] = "rollback.listTransactions.data"
dict = _rollback.getTransactionsData() data['transactions'] = dict return (0, "transaction info collected", data)
def noneToEmpty(value): if value == None: return "" return value
# stringing nay None's in dep tuples def __cleanDeps(deps): clean_deps = [] for dep in deps: ( (name, version, release), (needsName, needsVersion), flags, suggested, sense) = dep
values = [name, version, release, needsName, needsVersion, flags, suggested, sense] name, version,release, needsName, needsVersion, \ flags, suggested, sense = map(noneToEmpty, values) clean_deps.append(((name,version,release), (needsName, needsVersion), flags, suggested, sense)) return tuple(clean_deps)
# resync hardware information with the server profile def undo(): data = _rollback.getUndoInfo() data['version'] = "0" data['name'] = "rollback.undo.rollback_info" _rollback.undo()
return (0, "undo completed", data)
# pass in a string... def config(value): cfg.set("enableRollbacks", value) cfg.save() # need to figure out what macro and macro values this is if value == "1": configUtils.writeUp2dateMacro("%_repackage_all_erasures", "1") if value == "0": configUtils.writeUp2dateMacro("%_repackage_all_erasures", "0")
return (0, "config values updated", {})
def _catchErrors(method, name, args): print "args: %s" % args ret = None try: ret = apply(method, args) except up2dateErrors.RpmError, e: return (18, "Failed: packages requested raised "\ "dependency problems", {}) except up2dateErrors.RpmInstallError, e: data = {} data['version'] = "0" data['name'] = "%s.package_install_failure" % name if e.pkg: data = {'package_that_failed':e.pkg} return (32, "Failed: Packages failed to install "\ "properly: %s" % e.errmsg, data) except up2dateErrors.FileNotFoundError, e: data = {'missing_package_error': e} data["version"] = "0" data["name"] = "%s.file_not_found" % name return (31, "Failed: There was a File Not Found error. "\ "The error was: %s" % e, data) except up2dateErrors.SkipListError, e: data = {} if e.pkglist: data = {'packages_on_skip_list': e.pkglist} # The version field is the version of the data struct data['version'] = "0" data['name'] = "%s.packages_on_skip_list" % name return (30, "Failed: Some of the packages specified were "\ "on a skip list", data) except up2dateErrors.DependencyError, e: data = {} if e.deps: # deps might have None's, cleanse them data = {'failed_deps':__cleanDeps(e.deps)} data["version"] = "0" data["name"] = "%s.failed_deps" % name return (18, "Failed: packages requested raised "\ "dependency problems", data) except up2dateErrors.UnsolvedDependencyError, e: data = {} if e.dep: data = {'failed_deps':e.dep} if e.pkgs: data["packages"] = e.pkgs packages = up2dateUtils.pkglistToString(e.pkgs) else: packages = "" data["version"] = "0" data["name"] = "%s.deps_on_skip_list" % name return(29, "The dependency %s is provided by the folowing "\ "packages: %s, but they are not available due to client "\ "configuration (skip lists, etc)" % (e.dep, packages), data) except up2dateErrors.ConflictError, e: if e.rc: # we cant marshall long ints, so make sure we cast them to ints try: tmprc = e.rc # old rpm always makes this an int, new rpm makes it a # long int, we nee if type(e.rc[0][1][2]) == type(1L): tmprc = [ (e.rc[0][0], (e.rc[0][1][0], e.rc[0][1][1], int(e.rc[0][1][2])) )]
except TypeError: tmprc = "There was a parsing error with the rpm "\ "conflict message" except OverflowError: # must of be a real long int, this shouldnt ever # happen in this case, but dont traceback just in case tmprc = "There was an overflow error converting "\ "the return code to ints" data = {'package_conflicts': tmprc} else: data = {} data["version"] = "0" data["name"] = "%s.package_conflicts" % name return (26, "Failed: There was a package conflict error "\ "with the package set: %s" % e, data) except up2dateErrors.FileConflictError, e: if e.rc: data = {'package_file_conflicts': e.rc} else: data = {} data["version"] = "0" data["name"] = "%s.package_file_conflicts" % name return (27, "Failed: There was file conflict error with the "\ "package set: %s" % e, data) except up2dateErrors.DependencySenseError, e: data = {} if e.sense: data = {'dependency_sense':e.sense} data["version"] = "0" data["name"] = "%s.dependency_sense" % name return (28, "There was a dependency sense error with "\ "the sense: %s" % e.sense, data) except up2dateErrors.CommunicationError, e: return (21, "Failed: There was a communication error "\ "talking to the server", {}) except up2dateErrors.GPGVerificationUnsignedPackageError, e: data = {'unsigned_package':e.pkg} data["version"] = "0" data["name"] = "%s.unsigned_package" % name return (22, "Failed: There was a package gpg verification error. "\ "The error was: %s" % e, data) except up2dateErrors.GPGVerificationError, e: data = {'gpg_failed_package':e.pkg} data["version"] = 0 data["name"] = "%s.gpg_failed_package" % name return (23, "Failed: There was a package gpg verification error. "\ "The error was: %s" % e, {}) except up2dateErrors.GPGInstallationError: return (24, "Failed: gpg is not properly installed "\ "on this machine", {}) except up2dateErrors.GPGKeyringError: return (25, "Failed: The package signing key for Red Hat, Inc. "\ "is not on the gpg keyring", {}) except up2dateErrors.OutOfSpaceError, e: data = {'space_required':e.totalSize} data['space_available'] = e.freeDiskSpace data['version'] = 0 data['name'] = "%s.out_of_space" % name return (33, "Failed: The was an error installing the package: "\ "the error was: %s" % e, data)
def rollback(targettid, fromtid): try: data = _rollback.getTidInfo(targettid) except KeyError: data = {} data['version'] = "0" data['name'] = "rollback.rollback.invalid_tid" data['tid'] = targettid return (35, "Invalid transaction id", data) data['version'] = "0" data['name'] = "rollback.rollback.rollback_info"
latesttid = _rollback.getLatestTid()
# we are assuming these tid values are comparable # ints if int(latesttid) > int(fromtid): data['latesttid'] = latesttid data['currenttransactions'] = _rollback.getTransactionsData() return (36, "from tid is older than latest tid", data) ret = _catchErrors(_rollback.doRollback, "rollback.doRollback", (targettid,)) # little odd, if it returns a tuple, it's an error if type(ret) == type(()): return ret
# update the time stamp indicating we've updated the package list up2dateUtils.touchTimeStamp() return (0, "rollback completed", data)
def _printHelp(): print """ --undo undo the last transaction --list show all available transactions --verbose enable rpm debugging info (rpm -vv equilivent) --tid=TID rollback tid $TID """ def main(): import getopt import string if not len(sys.argv[1:]): _printHelp() sys.exit() try: optlist, arglist = getopt.getopt(sys.argv[1:], 'u', ['undo', 'list', 'verbose', 'tid=',]) except: _printHelp() doundo = None undotid = None list = None for opt,arg in optlist: if opt == "-u" or opt == "--undo": doundo = 1 if opt == "--tid": undotid = 1 tid = string.atoi(arg) if opt == "--list": list = 1 if opt == "--verbose": import rpm rpm.setVerbosity(rpm.RPMLOG_DEBUG)
if list: print _rollback.printTransactions() if doundo or undotid: latest = _rollback.getLatestTid() if doundo: print _rollback.getTidInfo(latest) print undo()
if undotid: print _rollback.getTidInfo(tid) print rollback(tid, latest)
#print _rollback.getTidInfo(1029893837) # print rollback(1037043275, latest)
# print undo()
# print rollback(1029305278)
if __name__ == "__main__": main()
|