示例#1
0
    def _doExecute(self, action):
        if not self._ainstRoot.checkRoot():
            Log.cout(Log.ERROR, 'Check ainst root failed')
            return False
        scriptContent = self._getScriptContent(action)
        if scriptContent is None:
            Log.cout(Log.ERROR, 'Get %s script of pkg %s failed' % (action, self._pkg))
            return False
        
        if self._dryRun:
            Log.coutValue(Log.INFO, '%s: ' % action, scriptContent)
            return True

        settings = self._getSettings()
        if settings is None:
            Log.cout(Log.ERROR, 'Parse settings of pkg %s  failed' % self._pkg)
            return False

        settingsEnv = self._generateSettingsEnv(settings)
        ainstDirPath = self._ainstPkgDir + '/ainst/'
        ainstPathEnv = {self._ainstDirKey : ainstDirPath}
        self._exportToEnv(ainstPathEnv)
        self._exportToEnv(settingsEnv)
        ret = self._processScript(scriptContent)
        self._removeFromEnv(settingsEnv)
        self._removeFromEnv(ainstPathEnv)

        return ret
示例#2
0
 def makeCache(self):
     repoList = self.getEnabledRepo()
     for repo in repoList:
         if not repo.makeCache():
             Log.coutValue(Log.INFO, repo.id, 'failed')
         else:
             Log.coutValue(Log.INFO, repo.id, 'success')
     return True
示例#3
0
 def makeCache(self):
     repoList = self.getEnabledRepo()
     for repo in repoList:
         if not repo.makeCache():
             Log.coutValue(Log.INFO, repo.id, 'failed')
         else:
             Log.coutValue(Log.INFO, repo.id, 'success')
     return True
示例#4
0
 def clearCache(self):
     repoList = self.getEnabledRepo()
     for repo in repoList:
         if not repo.clearCache():
             Log.coutValue(Log.INFO, repo.id, 'failed')
             self._consoleLogger.error(log)
         else:
             Log.coutValue(Log.INFO, repo.id, 'success')
     return True
示例#5
0
 def clearCache(self):
     repoList = self.getEnabledRepo()
     for repo in repoList:
         if not repo.clearCache():
             Log.coutValue(Log.INFO, repo.id, 'failed')
             self._consoleLogger.error(log)
         else:
             Log.coutValue(Log.INFO, repo.id, 'success')
     return True
示例#6
0
    def remoteOperate(self,
                      param,
                      command,
                      installRoot=None,
                      confirmYes=False):
        if param.remoteTimeout < 0 or param.retryInterval < 0:
            Log.cout(Log.ERROR, 'Remote param is invalid')
            return False

        if param.remoteBin:
            self._ainstBinPath = param.remoteBin

        hostSet = self._getHostSet(param.host, param.hostFile)
        if hostSet:
            hostSet = set([x for x in hostSet if x and x.strip()])
        if not hostSet:
            Log.cout(Log.ERROR, 'No valid ip or host')
            return False

        user = param.remoteUser
        if not user:
            user = getpass.getuser()
        cmd = self._generateRemoteCmd(command, confirmYes, installRoot,
                                      param.remoteConf)
        if param.remoteSudo:
            cmd = 'sudo %s' % cmd

        Log.coutLabel(Log.INFO, 'Process total %d remote host' % len(hostSet))
        parallel = self._getParallelCount(param.parallel)
        successList, failedList =\
            self._doParallelOperate(hostSet, cmd, parallel, param.remoteTimeout,
                                    param.retryTime, param.retryInterval,
                                    user, param.remoteSudo, param.errorContinue)

        Log.coutLabel(Log.INFO, 'Process remote host total(%d), success(%d), failed(%d)'\
                          % (len(hostSet), len(successList), len(failedList)))
        for success in successList:
            Log.coutValue(Log.INFO, success, 'success')
        for failed in failedList:
            Log.coutValue(Log.INFO, failed, 'failed')
        Log.coutLabel(Log.INFO, 'end')
        if len(failedList) > 0:
            return False
        return True
示例#7
0
    def remoteExecute(self,
                      host,
                      executorPath,
                      remoteCmd,
                      remoteUser,
                      remoteTimeout=1200,
                      retryTime=0,
                      retryInterval=0,
                      remoteSudo=False):
        while True:
            begin = time.time()
            Log.cout(Log.INFO, remoteCmd)
            out, err, code = process.runRedirected(remoteCmd, remoteTimeout)
            end = time.time()
            Log.cout(Log.INFO, out)
            if code == 0:
                Log.coutValue(Log.INFO, 'Process Remote host %s' % host,
                              'success')
                return True
            Log.cout(Log.ERROR, err)
            if end - begin >= remoteTimeout:
                Log.coutValue(Log.ERROR, 'Process Remote host %s' % host,
                              'timeout')
                self._killRemoteCmd(host, executorPath, remoteCmd, remoteUser,
                                    remoteSudo)
            else:
                Log.coutValue(Log.ERROR, 'Process Remote host %s' % host,
                              'failed')
            retryTime -= 1
            if retryTime < 0:
                break
            time.sleep(retryInterval)

        return False
示例#8
0
    def remoteOperate(self, param, command, installRoot=None, confirmYes=False):
        if param.remoteTimeout < 0 or param.retryInterval < 0:
            Log.cout(Log.ERROR, 'Remote param is invalid')
            return False

        if param.remoteBin:
            self._ainstBinPath = param.remoteBin

        hostSet = self._getHostSet(param.host, param.hostFile)
        if hostSet:
            hostSet = set([x for x in hostSet if x and x.strip()])
        if not hostSet:
            Log.cout(Log.ERROR, 'No valid ip or host')
            return False

        user = param.remoteUser
        if not user:
            user = getpass.getuser()
        cmd = self._generateRemoteCmd(command, confirmYes, installRoot,
                                      param.remoteConf)
        if param.remoteSudo:
            cmd = 'sudo %s' % cmd

        Log.coutLabel(Log.INFO, 'Process total %d remote host' % len(hostSet))
        parallel = self._getParallelCount(param.parallel)
        successList, failedList =\
            self._doParallelOperate(hostSet, cmd, parallel, param.remoteTimeout,
                                    param.retryTime, param.retryInterval,
                                    user, param.remoteSudo, param.errorContinue)

        Log.coutLabel(Log.INFO, 'Process remote host total(%d), success(%d), failed(%d)'\
                          % (len(hostSet), len(successList), len(failedList)))
        for success in successList:
            Log.coutValue(Log.INFO, success, 'success')
        for failed in failedList:
            Log.coutValue(Log.INFO, failed, 'failed')
        Log.coutLabel(Log.INFO, 'end')
        if len(failedList) > 0:
            return False
        return True
示例#9
0
    def list(self, pkgs, param, command):
        if len(pkgs) > 1:
            return OperatorRet.OPERATE_FAILED
        context = self._contextBuilder.buildMultiRootContext([self._installRoot],
                                                             self._ainstConf,
                                                             param.repo,
                                                             param.repos)

        if context is None:
            Log.cout(Log.ERROR, 'Build context failed')
            return OperatorRet.OPERATE_FAILED

        repo2Pkgs = None
        if len(pkgs) > 0:
            repo2Pkgs = context.searchPkgs(pkgs[0])
        else:
            repo2Pkgs = context.getPkgs()

        if repo2Pkgs is None or len(repo2Pkgs) == 0:
            Log.cout(Log.INFO, 'No available package found')
            return OperatorRet.OPERATE_SUCCESS

        indents = 2
        items = sorted(repo2Pkgs.items(), key=lambda item:item[0])
        for repo, pkgs in items:
            if len(pkgs) == 0:
                continue
            Log.cout(Log.INFO, "InstallRoot: %s" % repo)
            pkgs.sort(cmp=lambda x,y: cmp(str(x), str(y)))
            for pkg in pkgs:
                key = " " * indents + "Package: %s" % pkg
                value = 'Source: %s' % repo 
                Log.coutValue(Log.INFO, key, value)
                self._printPkgInfo(pkg, param, indents * 2)
                self._printPkgFiles(pkg, param, indents * 2)
            Log.cout(Log.INFO, '')
        return OperatorRet.OPERATE_SUCCESS
示例#10
0
    def remoteExecute(self, host, executorPath, remoteCmd, remoteUser,
                      remoteTimeout=1200, retryTime=0, retryInterval=0,
                      remoteSudo=False):
        while True:
            begin = time.time()
            Log.cout(Log.INFO, remoteCmd)
            out, err, code = process.runRedirected(remoteCmd, remoteTimeout)
            end = time.time()
            Log.cout(Log.INFO, out)
            if code == 0:
                Log.coutValue(Log.INFO, 'Process Remote host %s' % host, 'success')
                return True
            Log.cout(Log.ERROR, err)
            if end - begin >= remoteTimeout:
                Log.coutValue(Log.ERROR, 'Process Remote host %s' % host, 'timeout')
                self._killRemoteCmd(host, executorPath, remoteCmd, remoteUser, remoteSudo)
            else:
                Log.coutValue(Log.ERROR, 'Process Remote host %s' % host, 'failed')
            retryTime -= 1
            if retryTime < 0:
                break
            time.sleep(retryInterval)

        return False
示例#11
0
    def execute(self):
        if self._dryRun:
            if self._unsetKeySet:
                Log.cout(Log.INFO, 'Unset pkg %s settings...' % self._pkg.name)
                for key in self._unsetKeySet:
                    Log.coutValue(Log.INFO, 'unset', key)
            return True
        if self._executed:
            return False
        self._executed = True

        if not self._ainstRoot.checkRoot():
            Log.cout(Log.ERROR, 'Check ainst root failed')
            return False

        pkgDirName = PackageUtil.getPkgNameVersion(self._pkg)
        if not pkgDirName:
            Log.cout(Log.ERROR, 'Get pkg %s dir name failed' % self._pkg)
            return False

        #get active dir and package dir
        ainstActivePkg = self._ainstRoot.getRootVarAinstDir('active') + self._pkg.name
        if not self._isActive(ainstActivePkg, pkgDirName):
            Log.cout(Log.ERROR, 'Package %s is not active' % self._pkg)
            return False
        ainstPkgDir = self._ainstRoot.getRootVarAinstDir('packages') + pkgDirName
        getRet, aicfInfo = self._getAicfInfo(ainstPkgDir, self._pkg)
        if not getRet:
            Log.cout(Log.ERROR, 'Get aicfInfo of %s failed' % self._pkg)
            return False            

        if aicfInfo is None:
            Log.cout(Log.INFO, 'No aicf, will not do effective action')
            return True

        #get settings from setting file
        settingPath = self._ainstRoot.getRootVarAinstDir('settings') + self._pkg.name
        srcSettings = SettingStreamer().parse(settingPath)
        if srcSettings is None:
            srcSettings = {}
        newSettings = self._unsetSettings(srcSettings, self._unsetKeySet)

        settingsEnv = self._generateSettingsEnv(newSettings)
        ainstDirPath = ainstPkgDir + '/ainst/'
        ainstPathEnv = {self._ainstDirKey : ainstDirPath}
        self._exportToEnv(ainstPathEnv)
        self._exportToEnv(settingsEnv)
        settingMap = {}
        settingMap.update(newSettings)
        settingMap[self._ainstRoot.getInstallRootEnvKey()] = self._ainstRoot.getRoot()
        settingMap.update(ainstPathEnv)
        ret = self._generateConfigToRoot(ainstPkgDir, aicfInfo,
                                         settingMap, self._confBakDict)
        self._removeFromEnv(settingsEnv)
        self._removeFromEnv(ainstPathEnv)

        if not ret:
            Log.cout(Log.ERROR, 'Generate config of %s to root failed' % self._pkg.name)
            self.undo()
            return False

        if not SettingStreamer().dump(newSettings, settingPath):
            Log.cout(Log.ERROR, 'Dump settings of %s failed' % self._pkg.name)
            self.undo()
            return False
        self._bakSettings = srcSettings
        return True
示例#12
0
 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')
示例#13
0
    def execute(self):
        if self._dryRun:
            if self._unsetKeySet:
                Log.cout(Log.INFO, 'Unset pkg %s settings...' % self._pkg.name)
                for key in self._unsetKeySet:
                    Log.coutValue(Log.INFO, 'unset', key)
            return True
        if self._executed:
            return False
        self._executed = True

        if not self._ainstRoot.checkRoot():
            Log.cout(Log.ERROR, 'Check ainst root failed')
            return False

        pkgDirName = PackageUtil.getPkgNameVersion(self._pkg)
        if not pkgDirName:
            Log.cout(Log.ERROR, 'Get pkg %s dir name failed' % self._pkg)
            return False

        #get active dir and package dir
        ainstActivePkg = self._ainstRoot.getRootVarAinstDir(
            'active') + self._pkg.name
        if not self._isActive(ainstActivePkg, pkgDirName):
            Log.cout(Log.ERROR, 'Package %s is not active' % self._pkg)
            return False
        ainstPkgDir = self._ainstRoot.getRootVarAinstDir(
            'packages') + pkgDirName
        getRet, aicfInfo = self._getAicfInfo(ainstPkgDir, self._pkg)
        if not getRet:
            Log.cout(Log.ERROR, 'Get aicfInfo of %s failed' % self._pkg)
            return False

        if aicfInfo is None:
            Log.cout(Log.INFO, 'No aicf, will not do effective action')
            return True

        #get settings from setting file
        settingPath = self._ainstRoot.getRootVarAinstDir(
            'settings') + self._pkg.name
        srcSettings = SettingStreamer().parse(settingPath)
        if srcSettings is None:
            srcSettings = {}
        newSettings = self._unsetSettings(srcSettings, self._unsetKeySet)

        settingsEnv = self._generateSettingsEnv(newSettings)
        ainstDirPath = ainstPkgDir + '/ainst/'
        ainstPathEnv = {self._ainstDirKey: ainstDirPath}
        self._exportToEnv(ainstPathEnv)
        self._exportToEnv(settingsEnv)
        settingMap = {}
        settingMap.update(newSettings)
        settingMap[self._ainstRoot.getInstallRootEnvKey(
        )] = self._ainstRoot.getRoot()
        settingMap.update(ainstPathEnv)
        ret = self._generateConfigToRoot(ainstPkgDir, aicfInfo, settingMap,
                                         self._confBakDict)
        self._removeFromEnv(settingsEnv)
        self._removeFromEnv(ainstPathEnv)

        if not ret:
            Log.cout(Log.ERROR,
                     'Generate config of %s to root failed' % self._pkg.name)
            self.undo()
            return False

        if not SettingStreamer().dump(newSettings, settingPath):
            Log.cout(Log.ERROR, 'Dump settings of %s failed' % self._pkg.name)
            self.undo()
            return False
        self._bakSettings = srcSettings
        return True