def install(self): progress_message(N_('Starting package installation process')) # Add the rpm macros to the global transaction environment for macro in self.rpmMacros: rpm.addMacro(macro[0], macro[1]) if self.install_device: self._setupMedia(self.install_device) try: self.checkSoftwareSelection() self._download_location = self._pick_download_location() except packaging.PayloadError as e: if errors.errorHandler.cb(e) == errors.ERROR_RAISE: _failure_limbo() pkgs_to_download = self._base.transaction.install_set log.info('Downloading packages to %s.', self._download_location) progressQ.send_message(_('Downloading packages')) progress = DownloadProgress() try: self._base.download_packages(pkgs_to_download, progress) except dnf.exceptions.DownloadError as e: msg = 'Failed to download the following packages: %s' % str(e) exc = packaging.PayloadInstallError(msg) if errors.errorHandler.cb(exc) == errors.ERROR_RAISE: _failure_limbo() log.info('Downloading packages finished.') pre_msg = (N_("Preparing transaction from installation source")) progress_message(pre_msg) queue_instance = multiprocessing.Queue() process = multiprocessing.Process(target=do_transaction, args=(self._base, queue_instance)) process.start() (token, msg) = queue_instance.get() while token not in ('post', 'quit'): if token == 'install': msg = _("Installing %s") % msg progressQ.send_message(msg) (token, msg) = queue_instance.get() if token == 'quit': raise packaging.PayloadError("DNF error: %s" % msg) post_msg = (N_("Performing post-installation setup tasks")) progress_message(post_msg) process.join() self._base.close() if os.path.exists(self._download_location): log.info("Cleaning up downloaded packages: %s", self._download_location) shutil.rmtree(self._download_location) else: # Some installation sources, such as NFS, don't need to download packages to # local storage, so the download location might not always exist. So for now # warn about this, at least until the RFE in bug 1193121 is implemented and # we don't have to care about clearing the download location ourselves. log.warning("Can't delete nonexistent download location: %s", self._download_location)
def __init__(self, data): packaging.PackagePayload.__init__(self, data) if rpm is None or dnf is None: raise packaging.PayloadError("unsupported payload type") self._base = None self._required_groups = [] self._required_pkgs = [] self._configure()
def _pick_download_location(self): required = self._download_space df_map = _df_map() mpoint = _pick_mpoint(df_map, required) log.info("Download space required: %s, use filesystem at: %s", required, mpoint) if mpoint is None: msg = "Not enough disk space to download the packages." raise packaging.PayloadError(msg) pkgdir = '%s/%s' % (mpoint, DNF_PACKAGE_CACHE_DIR_SUFFIX) for repo in self._base.repos.iter_enabled(): repo.pkgdir = pkgdir
def _pick_download_location(self): download_size = self._download_space install_size = self._spaceRequired() df_map = _df_map() mpoint = _pick_mpoint(df_map, download_size, install_size) if mpoint is None: msg = "Not enough disk space to download the packages." raise packaging.PayloadError(msg) pkgdir = '%s/%s' % (mpoint, DNF_PACKAGE_CACHE_DIR_SUFFIX) with self._repos_lock: for repo in self._base.repos.iter_enabled(): repo.pkgdir = pkgdir return pkgdir