def __init__(self, ainstConf, installRoot): AinstOperator.__init__(self, ainstConf) self._installRoot = installRoot self._contextBuilder = AinstContextBuilder()
class RootAinstOperator(AinstOperator): def __init__(self, ainstConf, installRoot): AinstOperator.__init__(self, ainstConf) self._installRoot = installRoot self._contextBuilder = AinstContextBuilder() def install(self, pkgs, param, command): streamer = RootInfoDbStreamer() rootInfo = streamer.load(self._ainstConf.rootinfo) if rootInfo is None: Log.cout(Log.ERROR, 'Load root info failed') return OperatorRet.OPERATE_FAILED context = self._contextBuilder.buildAinstContext(self._installRoot, self._ainstConf, True, param.repos, param.localRepos, localRoots=rootInfo.installRootSet) if context is None: Log.cout(Log.ERROR, 'Build context failed') return OperatorRet.OPERATE_FAILED installPkgs = self._selectInstallPkgs(context, pkgs) if not installPkgs: Log.cout(Log.INFO, 'No package to install') return OperatorRet.OPERATE_FAILED resolverOption = self._getResolverOption(param) depResolver = RecursiveDepResolver(context, resolverOption) ret, operations, topOrder = depResolver.install(installPkgs) if ret != error.ERROR_NONE: Log.cout(Log.ERROR, 'Dependency resovle failed') return OperatorRet.OPERATE_FAILED if not operations: Log.cout(Log.INFO, 'No effective operations') return OperatorRet.OPERATE_SUCCESS self._displayOperations(operations) if param.dryRun: return OperatorRet.OPERATE_SUCCESS if not param.confirmYes and not Log.coutConfirm(): return True if not self._doRpmTransaction(operations): Log.cout(Log.ERROR, 'Do rpm transaction failed') return OperatorRet.OPERATE_FAILED return OperatorRet.OPERATE_SUCCESS def _getResolverOption(self, param): resolverOption = ResolverOption() if param.check: resolverOption.checkType = ResolverOption.CHECK_INSTALLED if param.downgrade: resolverOption.downgrade = True if param.noUpgrade: resolverOption.upgrade = False if param.noExclusive: resolverOption.exclusiveDeps = False return resolverOption def _displayOperations(self, operations): for pkg, action in operations.iteritems(): if action == resolver.INSTALL: Log.coutValue(Log.INFO, '%s' % pkg, 'install') elif action == resolver.REMOVE: Log.coutValue(Log.INFO, '%s' % pkg, 'remove') def _doRpmTransaction(self, operations, noDependents=False): ts = rpm.TransactionSet() for pkg, action in operations.iteritems(): if action == resolver.INSTALL: pkgPath = self._getRpmFilePath(pkg) if not pkgPath: Log.cout(Log.ERROR, 'Get pkg %s failed' % pkg) return False header = rpmutils.readRpmHeader(pkgPath) if header is None: Log.cout(Log.ERROR, 'Get pkg %s header failed' % pkg) return False ts.addInstall(header, pkgPath, 'u') elif action == resolver.REMOVE: ts.addErase(str(pkg)) unresolved = None if not noDependents: unresolved = ts.check() if not unresolved: ts.order() pkgDict = {} try: flags = rpm.RPMPROB_FILTER_OLDPACKAGE |\ rpm.RPMPROB_FILTER_REPLACEPKG ts.setProbFilter(flags) tsError = ts.run(self._runCallback, pkgDict) if tsError is None: return True Log.cout(Log.ERROR, 'Transaction run failed:%s' % tsError) return False except Exception, e: Log.cout(Log.ERROR, 'Rpm Transaction run failed:%s' % e) return False return True else: