def preinstallPkgs(self): if not self.ts_pre: self.__initialize_transaction() self.ts_pre.order() cb = rpmmisc.RPMInstallCallback(self.ts_pre) cb.headmsg = "Preinstall" installlogfile = "%s/__catched_stderr.buf" % (self.instroot) # start to catch stderr output from librpm msger.enable_logstderr(installlogfile) errors = self.ts_pre.run(cb.callback, '') # stop catch msger.disable_logstderr() self.ts_pre.closeDB() self.ts_pre = None if errors is not None: if len(errors) == 0: msger.warning('scriptlet or other non-fatal errors occurred ' 'during transaction.') else: for e in errors: msger.warning(e[0]) raise RepoError('Could not run transaction.')
def testLogstderr(self): excepted = "hello\n" cwd = os.getcwd() msger.enable_logstderr(cwd + "/__tmp_err.log") print >>sys.stderr, "hello" msger.disable_logstderr() self.assertEqual(excepted, sys.stderr.getvalue())
def testLogstderr(self): excepted = "hello\n" cwd = os.getcwd() msger.enable_logstderr(cwd + "/__tmp_err.log") print >> sys.stderr, "hello" msger.disable_logstderr() self.assertEqual(excepted, sys.stderr.getvalue())
msger.warning("Dependency check failed!") rc = self.ts.order() if rc != 0: raise CreatorError("ordering packages for installation failed") # FIXME: callback should be refactored a little in yum cb = rpmmisc.RPMInstallCallback(self.ts) cb.tsInfo = self.tsInfo cb.filelog = False msger.warning('\nCaution, do NOT interrupt the installation, ' 'else mic cannot finish the cleanup.') installlogfile = "%s/__catched_stderr.buf" % (self.instroot) msger.enable_logstderr(installlogfile) self.runTransaction(cb) self._cleanupRpmdbLocks(self.conf.installroot) except rpmUtils.RpmUtilsError, e: raise CreatorError("mic does NOT support delta rpm: %s" % e) except yum.Errors.RepoError, e: raise CreatorError("Unable to download from repo : %s" % e) except yum.Errors.YumBaseError, e: raise CreatorError("Unable to install: %s" % e) finally: msger.disable_logstderr() def getAllContent(self): return self.__pkgs_content
def installPkgs(self, package_objects): if not self.ts: self.__initialize_transaction() """ Set filters """ probfilter = 0 for flag in self.probFilterFlags: probfilter |= flag self.ts.setProbFilter(probfilter) localpkgs = self.localpkgs.keys() for po in package_objects: pkgname = po.name() if pkgname in localpkgs: rpmpath = self.localpkgs[pkgname] else: rpmpath = self.getLocalPkgPath(po) if not os.path.exists(rpmpath): """ Maybe it is a local repo """ baseurl = str(po.repoInfo().baseUrls()[0]) baseurl = baseurl.strip() location = zypp.asKindPackage(po).location() location = str(location.filename()) if baseurl.startswith("file:/"): rpmpath = baseurl[5:] + "/%s" % (location) if not os.path.exists(rpmpath): raise RpmError("Error: %s doesn't exist" % rpmpath) h = rpmmisc.readRpmHeader(self.ts, rpmpath) self.ts.addInstall(h, rpmpath, 'u') unresolved_dependencies = self.ts.check() if not unresolved_dependencies: self.ts.order() cb = rpmmisc.RPMInstallCallback(self.ts) installlogfile = "%s/__catched_stderr.buf" % ( self.creator._instroot) msger.enable_logstderr(installlogfile) errors = self.ts.run(cb.callback, '') if errors is None: pass elif len(errors) == 0: msger.warning( 'scriptlet or other non-fatal errors occurred during transaction.' ) else: for e in errors: msger.warning(e[0]) msger.error('Could not run transaction.') msger.disable_logstderr() self.ts.closeDB() self.ts = None else: for pkg, need, needflags, sense, key in unresolved_dependencies: package = '-'.join(pkg) if needflags == rpm.RPMSENSE_LESS: deppkg = ' < '.join(need) elif needflags == rpm.RPMSENSE_EQUAL: deppkg = ' = '.join(need) elif needflags == rpm.RPMSENSE_GREATER: deppkg = ' > '.join(need) else: deppkg = '-'.join(need) if sense == rpm.RPMDEP_SENSE_REQUIRES: msger.warning("[%s] Requires [%s], which is not provided" % (package, deppkg)) elif sense == rpm.RPMDEP_SENSE_CONFLICTS: msger.warning("[%s] Conflicts with [%s]" % (package, deppkg)) raise RepoError("Unresolved dependencies, transaction failed.")
def installPkgs(self, package_objects): if not self.ts: self.__initialize_transaction() # clean rpm lock self._cleanupRpmdbLocks(self.instroot) self._cleanupZyppJunk(self.instroot) # Set filters probfilter = 0 for flag in self.probFilterFlags: probfilter |= flag self.ts.setProbFilter(probfilter) self.ts_pre.setProbFilter(probfilter) localpkgs = self.localpkgs.keys() for po in package_objects: pkgname = po.name() if pkgname in localpkgs: rpmpath = self.localpkgs[pkgname] else: rpmpath = self.getLocalPkgPath(po) if not os.path.exists(rpmpath): # Maybe it is a local repo rpmuri = self.get_url(po) if rpmuri.startswith("file:/"): rpmpath = rpmuri[5:] if not os.path.exists(rpmpath): raise RpmError("Error: %s doesn't exist" % rpmpath) h = rpmmisc.readRpmHeader(self.ts, rpmpath) if pkgname in self.pre_pkgs: msger.verbose("pre-install package added: %s" % pkgname) self.ts_pre.addInstall(h, rpmpath, 'u') self.ts.addInstall(h, rpmpath, 'u') unresolved_dependencies = self.ts.check() if not unresolved_dependencies: if self.pre_pkgs: self.preinstallPkgs() self.ts.order() cb = rpmmisc.RPMInstallCallback(self.ts) installlogfile = "%s/__catched_stderr.buf" % (self.instroot) # start to catch stderr output from librpm msger.enable_logstderr(installlogfile) errors = self.ts.run(cb.callback, '') # stop catch msger.disable_logstderr() self.ts.closeDB() self.ts = None if errors is not None: if len(errors) == 0: msger.warning('scriptlet or other non-fatal errors occurred ' 'during transaction.') else: for e in errors: msger.warning(e[0]) raise RepoError('Could not run transaction.') else: for pkg, need, needflags, sense, key in unresolved_dependencies: package = '-'.join(pkg) if needflags == rpm.RPMSENSE_LESS: deppkg = ' < '.join(need) elif needflags == rpm.RPMSENSE_EQUAL: deppkg = ' = '.join(need) elif needflags == rpm.RPMSENSE_GREATER: deppkg = ' > '.join(need) else: deppkg = '-'.join(need) if sense == rpm.RPMDEP_SENSE_REQUIRES: msger.warning("[%s] Requires [%s], which is not provided" \ % (package, deppkg)) elif sense == rpm.RPMDEP_SENSE_CONFLICTS: msger.warning("[%s] Conflicts with [%s]" %(package,deppkg)) raise RepoError("Unresolved dependencies, transaction failed.")
def runInstall(self, checksize=0): #FIXME: WHY? os.environ["HOME"] = "/" os.environ["LD_PRELOAD"] = "" try: (res, resmsg) = self.buildTransaction() except yum.Errors.RepoError as e: raise CreatorError("Unable to download from repo : %s" % (e, )) if res != 2: raise CreatorError("Failed to build transaction : %s" \ % str.join("\n", resmsg)) dlpkgs = [ x.po for x in [ txmbr for txmbr in self.tsInfo.getMembers() if txmbr.ts_state in ("i", "u") ] ] # record all pkg and the content for pkg in dlpkgs: pkg_long_name = misc.RPM_FMT % { 'name': pkg.name, 'arch': pkg.arch, 'ver_rel': pkg.printVer(), } self.__pkgs_content[pkg_long_name] = pkg.files license = pkg.license if license in list(self.__pkgs_license.keys()): self.__pkgs_license[license].append(pkg_long_name) else: self.__pkgs_license[license] = [pkg_long_name] total_count = len(dlpkgs) cached_count = 0 download_total_size = sum([int(x.packagesize) for x in dlpkgs]) msger.info("\nChecking packages cache and packages integrity ...") for po in dlpkgs: local = po.localPkg() if not os.path.exists(local): continue if not self.verifyPkg(local, po, False): msger.warning("Package %s is damaged: %s" \ % (os.path.basename(local), local)) else: download_total_size -= int(po.packagesize) cached_count += 1 cache_avail_size = misc.get_filesystem_avail(self.cachedir) if cache_avail_size < download_total_size: raise CreatorError("No enough space used for downloading.") # record the total size of installed pkgs pkgs_total_size = 0 for x in dlpkgs: if hasattr(x, 'installedsize'): pkgs_total_size += int(x.installedsize) else: pkgs_total_size += int(x.size) # check needed size before actually download and install if checksize and pkgs_total_size > checksize: raise CreatorError("No enough space used for installing, " "please resize partition size in ks file") msger.info("%d packages to be installed, " "%d packages gotten from cache, " "%d packages to be downloaded" \ % (total_count, cached_count, total_count - cached_count)) try: repos = self.repos.listEnabled() for repo in repos: repo.setCallback( rpmmisc.TextProgress(total_count - cached_count)) self.downloadPkgs(dlpkgs) # FIXME: sigcheck? self.initActionTs() self.populateTs(keepold=0) deps = self.ts.check() if len(deps) != 0: # This isn't fatal, Ubuntu has this issue but it is ok. msger.debug(deps) msger.warning("Dependency check failed!") rc = self.ts.order() if rc != 0: raise CreatorError("ordering packages for installation failed") # FIXME: callback should be refactored a little in yum cb = rpmmisc.RPMInstallCallback(self.ts) cb.tsInfo = self.tsInfo cb.filelog = False msger.warning('\nCaution, do NOT interrupt the installation, ' 'else mic cannot finish the cleanup.') installlogfile = "%s/__catched_stderr.buf" % (self.instroot) msger.enable_logstderr(installlogfile) self.runTransaction(cb) self._cleanupRpmdbLocks(self.conf.installroot) except rpmUtils.RpmUtilsError as e: raise CreatorError("mic does NOT support delta rpm: %s" % e) except yum.Errors.RepoError as e: raise CreatorError("Unable to download from repo : %s" % e) except yum.Errors.YumBaseError as e: raise CreatorError("Unable to install: %s" % e) finally: msger.disable_logstderr()
def installPkgs(self, package_objects): if not self.ts: self.__initialize_transaction() # clean rpm lock self._cleanupRpmdbLocks(self.instroot) self._cleanupZyppJunk(self.instroot) # Set filters probfilter = 0 for flag in self.probFilterFlags: probfilter |= flag self.ts.setProbFilter(probfilter) self.ts_pre.setProbFilter(probfilter) localpkgs = self.localpkgs.keys() for po in package_objects: pkgname = po.name() if pkgname in localpkgs: rpmpath = self.localpkgs[pkgname] else: rpmpath = self.getLocalPkgPath(po) if not os.path.exists(rpmpath): # Maybe it is a local repo rpmuri = self.get_url(po) if rpmuri.startswith("file:/"): rpmpath = rpmuri[5:] if not os.path.exists(rpmpath): raise RpmError("Error: %s doesn't exist" % rpmpath) h = rpmmisc.readRpmHeader(self.ts, rpmpath) if pkgname in self.pre_pkgs: msger.verbose("pre-install package added: %s" % pkgname) self.ts_pre.addInstall(h, rpmpath, 'u') self.ts.addInstall(h, rpmpath, 'u') unresolved_dependencies = self.ts.check() if not unresolved_dependencies: if self.pre_pkgs: self.preinstallPkgs() self.ts.order() cb = rpmmisc.RPMInstallCallback(self.ts) installlogfile = "%s/__catched_stderr.buf" % (self.instroot) # start to catch stderr output from librpm msger.enable_logstderr(installlogfile) errors = self.ts.run(cb.callback, '') # stop catch msger.disable_logstderr() self.ts.closeDB() self.ts = None if errors is not None: if len(errors) == 0: msger.warning('scriptlet or other non-fatal errors occurred ' 'during transaction.') if self.strict_mode: raise CreatorError("mic failes to install some packages") else: for e in errors: msger.warning(e[0]) raise RepoError('Could not run transaction.') else: for pkg, need, needflags, sense, key in unresolved_dependencies: package = '-'.join(pkg) if needflags == rpm.RPMSENSE_LESS: deppkg = ' < '.join(need) elif needflags == rpm.RPMSENSE_EQUAL: deppkg = ' = '.join(need) elif needflags == rpm.RPMSENSE_GREATER: deppkg = ' > '.join(need) else: deppkg = '-'.join(need) if sense == rpm.RPMDEP_SENSE_REQUIRES: msger.warning("[%s] Requires [%s], which is not provided" \ % (package, deppkg)) elif sense == rpm.RPMDEP_SENSE_CONFLICTS: msger.warning("[%s] Conflicts with [%s]" % (package, deppkg)) raise RepoError("Unresolved dependencies, transaction failed.")
def installPkgs(self, package_objects): if not self.ts: self.__initialize_transaction() """ Set filters """ probfilter = 0 for flag in self.probFilterFlags: probfilter |= flag self.ts.setProbFilter(probfilter) localpkgs = self.localpkgs.keys() for po in package_objects: pkgname = po.name() if pkgname in localpkgs: rpmpath = self.localpkgs[pkgname] else: rpmpath = self.getLocalPkgPath(po) if not os.path.exists(rpmpath): """ Maybe it is a local repo """ baseurl = str(po.repoInfo().baseUrls()[0]) baseurl = baseurl.strip() location = zypp.asKindPackage(po).location() location = str(location.filename()) if baseurl.startswith("file:/"): rpmpath = baseurl[5:] + "/%s" % (location) if not os.path.exists(rpmpath): raise RpmError("Error: %s doesn't exist" % rpmpath) h = rpmmisc.readRpmHeader(self.ts, rpmpath) self.ts.addInstall(h, rpmpath, 'u') unresolved_dependencies = self.ts.check() if not unresolved_dependencies: self.ts.order() cb = rpmmisc.RPMInstallCallback(self.ts) installlogfile = "%s/__catched_stderr.buf" % (self.creator._instroot) msger.enable_logstderr(installlogfile) errors = self.ts.run(cb.callback, '') if errors is None: pass elif len(errors) == 0: msger.warning('scriptlet or other non-fatal errors occurred during transaction.') else: for e in errors: msger.warning(e[0]) msger.error('Could not run transaction.') msger.disable_logstderr() self.ts.closeDB() self.ts = None else: for pkg, need, needflags, sense, key in unresolved_dependencies: package = '-'.join(pkg) if needflags == rpm.RPMSENSE_LESS: deppkg = ' < '.join(need) elif needflags == rpm.RPMSENSE_EQUAL: deppkg = ' = '.join(need) elif needflags == rpm.RPMSENSE_GREATER: deppkg = ' > '.join(need) else: deppkg = '-'.join(need) if sense == rpm.RPMDEP_SENSE_REQUIRES: msger.warning ("[%s] Requires [%s], which is not provided" % (package, deppkg)) elif sense == rpm.RPMDEP_SENSE_CONFLICTS: msger.warning ("[%s] Conflicts with [%s]" % (package, deppkg)) raise RepoError("Unresolved dependencies, transaction failed.")