From 0e63090ffad42698b6cb71443bbe21fd80c44d11 Mon Sep 17 00:00:00 2001 From: Jack Neely Date: Fri, 13 Aug 2010 19:03:17 +0000 Subject: Display classes for the YUMng driver These callback classes pipe Yum's and RPM's logging output into our own logger, cut down on verbosity, and allow us to fine tune what logging goes where. git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@6018 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Client/Tools/YUMng.py | 60 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/lib/Client/Tools/YUMng.py b/src/lib/Client/Tools/YUMng.py index ae74d7a90..aba52315a 100644 --- a/src/lib/Client/Tools/YUMng.py +++ b/src/lib/Client/Tools/YUMng.py @@ -7,6 +7,8 @@ import os.path import sys import yum import yum.packages +import yum.rpmtrans +import yum.callbacks import yum.Errors import yum.misc import Bcfg2.Client.XML @@ -61,6 +63,55 @@ def nevraString(p): ret = "%s%s" % (ret, j % p[i]) return ret +class RPMDisplay(yum.rpmtrans.RPMBaseCallback): + """We subclass the default RPM transaction callback so that we + can control Yum's verbosity and pipe it through the right logger.""" + + def __init__(self, logger): + yum.rpmtrans.RPMBaseCallback.__init__(self) + self.logger = logger + self.state = None + self.package = None + + def event(self, package, action, te_current, te_total, + ts_current, ts_total): + """ + @param package: A yum package object or simple string of a package name + @param action: A yum.constant transaction set state or in the obscure + rpm repackage case it could be the string 'repackaging' + @param te_current: Current number of bytes processed in the transaction + element being processed + @param te_total: Total number of bytes in the transaction element being + processed + @param ts_current: number of processes completed in whole transaction + @param ts_total: total number of processes in the transaction. + """ + + if self.package != package or action != self.state: + msg = "%s: %s" % (self.action[action], package) + self.logger.info(msg) + self.state = action + self.package = package + + def scriptout(self, package, msgs): + """Handle output from package scripts.""" + + if msgs: + msg = "%s: %s" % (package, msgs) + self.logger.debug(msg) + + def errorlog(self, msg): + """Deal with error reporting.""" + self.logger.error(msg) + +class YumDisplay(yum.callbacks.ProcessTransBaseCallback): + """Class to handle display of what step we are in the Yum transaction + such as downloading packages, etc.""" + + def __init__(self, logger): + self.logger = logger + + class YUMng(Bcfg2.Client.Tools.RPMng.RPMng): """Support for Yum packages.""" pkgtype = 'yum' @@ -101,7 +152,6 @@ class YUMng(Bcfg2.Client.Tools.RPMng.RPMng): or entry.get('name') == '/etc/yum.conf'] self.yum_avail = dict() self.yum_installed = dict() - self.yb = yum.YumBase() try: self.yb.doConfigSetup() self.yb.doTsSetup() @@ -458,6 +508,8 @@ class YUMng(Bcfg2.Client.Tools.RPMng.RPMng): return True def _runYumTransaction(self): + rDisplay = RPMDisplay(self.logger) + yDisplay = YumDisplay(self.logger) # Run the Yum Transaction rescode, restring = self.yb.buildTransaction() self.logger.debug("Initial Yum buildTransaction() run said:") @@ -466,7 +518,8 @@ class YUMng(Bcfg2.Client.Tools.RPMng.RPMng): if rescode != 1: # Transaction built successfully, run it - self.yb.processTransaction() + self.yb.processTransaction(callback=yDisplay, + rpmDisplay=rDisplay) self.logger.info("Single Pass for Install Succeeded") else: # The yum command failed. No packages installed. @@ -476,7 +529,8 @@ class YUMng(Bcfg2.Client.Tools.RPMng.RPMng): self.yb.conf.skip_broken = True rescode, restring = self.yb.buildTransaction() if rescode != 1: - self.yb.processTransaction() + self.yb.processTransaction(callback=yDisplay, + rpmDisplay=rDisplay) self.logger.debug( "Second pass install did not install all packages") else: -- cgit v1.2.3-1-g7c22