Esempio n. 1
0
 def __init__(self, ainstConf, installRoot):
     AinstOperator.__init__(self, ainstConf)
     self._installRoot = installRoot
     self._contextBuilder = AinstContextBuilder()
Esempio n. 2
0
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: