def do_transaction(self): """Take care of package downloading, checking, user confirmation and actually running the transaction. :return: a numeric return code, and optionally a list of errors. A negative return code indicates that errors occurred in the pre-transaction checks """ grp_diff = self._groups_diff() grp_str = self.output.list_group_transaction(self.comps, grp_diff) if grp_str: logger.info(grp_str) trans = self.transaction pkg_str = self.output.list_transaction(trans) if pkg_str: logger.info(pkg_str) if trans: # Check which packages have to be downloaded downloadpkgs = [] rmpkgs = [] stuff_to_download = False install_only = True for tsi in trans: installed = tsi.installed if installed is not None: stuff_to_download = True downloadpkgs.append(installed) erased = tsi.erased if erased is not None: install_only = False rmpkgs.append(erased) # Close the connection to the rpmdb so that rpm doesn't hold the # SIGINT handler during the downloads. del self.ts # report the total download size to the user if not stuff_to_download: self.output.reportRemoveSize(rmpkgs) else: self.output.reportDownloadSize(downloadpkgs, install_only) if trans or grp_diff: # confirm with user if self._promptWanted(): if self.conf.assumeno or not self.output.userconfirm(): raise CliError(_("Operation aborted.")) else: logger.info(_('Nothing to do.')) return if trans: if downloadpkgs: logger.info(_('Downloading Packages:')) try: total_cb = self.output.download_callback_total_cb self.download_packages(downloadpkgs, self.output.progress, total_cb) except dnf.exceptions.DownloadError as e: specific = dnf.cli.format.indent_block(str(e)) errstring = _('Error downloading packages:\n%s') % specific raise dnf.exceptions.Error(errstring) # Check GPG signatures self.gpgsigcheck(downloadpkgs) display = output.CliTransactionDisplay() super(BaseCli, self).do_transaction(display) if trans: msg = self.output.post_transaction_output(trans) logger.info(msg) self.plugins.run_transaction() logger.info(_('Complete!'))
def do_transaction(self, display=()): """Take care of package downloading, checking, user confirmation and actually running the transaction. :param display: `rpm.callback.TransactionProgress` object(s) :return: history database transaction ID or None """ if dnf.base.WITH_MODULES: if not self.conf.module_stream_switch: switchedModules = dict( self._moduleContainer.getSwitchedStreams()) if switchedModules: report_module_switch(switchedModules) msg = _( "It is not possible to switch enabled streams of a module unless explicitly " "enabled via configuration option module_stream_switch.\n" "It is recommended to rather remove all installed content from the module, and " "reset the module using '{prog} module reset <module_name>' command. After " "you reset the module, you can install the other stream." ).format(prog=dnf.util.MAIN_PROG) raise dnf.exceptions.Error(msg) trans = self.transaction pkg_str = self.output.list_transaction(trans) if pkg_str: logger.info(pkg_str) if trans: # Check which packages have to be downloaded install_pkgs = [] rmpkgs = [] install_only = True for tsi in trans: if tsi.action in dnf.transaction.FORWARD_ACTIONS: install_pkgs.append(tsi.pkg) elif tsi.action in dnf.transaction.BACKWARD_ACTIONS: install_only = False rmpkgs.append(tsi.pkg) # Close the connection to the rpmdb so that rpm doesn't hold the # SIGINT handler during the downloads. del self._ts # report the total download size to the user if not install_pkgs: self.output.reportRemoveSize(rmpkgs) else: self.output.reportDownloadSize(install_pkgs, install_only) if trans or self._moduleContainer.isChanged() or \ (self._history and (self._history.group or self._history.env)): # confirm with user if self.conf.downloadonly: logger.info( _("{prog} will only download packages for the transaction." ).format(prog=dnf.util.MAIN_PROG_UPPER)) elif 'test' in self.conf.tsflags: logger.info( _("{prog} will only download packages, install gpg keys, and check the " "transaction.").format(prog=dnf.util.MAIN_PROG_UPPER)) if self._promptWanted(): if self.conf.assumeno or not self.output.userconfirm(): raise CliError(_("Operation aborted.")) else: logger.info(_('Nothing to do.')) return if trans: if install_pkgs: logger.info(_('Downloading Packages:')) try: total_cb = self.output.download_callback_total_cb self.download_packages(install_pkgs, self.output.progress, total_cb) except dnf.exceptions.DownloadError as e: specific = dnf.cli.format.indent_block(ucd(e)) errstr = _( 'Error downloading packages:') + '\n%s' % specific # setting the new line to prevent next chars being eaten up # by carriage returns print() raise dnf.exceptions.Error(errstr) # Check GPG signatures self.gpgsigcheck(install_pkgs) if self.conf.downloadonly: return if not isinstance(display, Sequence): display = [display] display = [output.CliTransactionDisplay()] + list(display) tid = super(BaseCli, self).do_transaction(display) # display last transaction (which was closed during do_transaction()) if tid is not None: trans = self.history.old([tid])[0] trans = dnf.db.group.RPMTransaction(self.history, trans._trans) else: trans = None if trans: # the post transaction summary is already written to log during # Base.do_transaction() so here only print the messages to the # user arranged in columns print() print('\n'.join(self.output.post_transaction_output(trans))) print() for tsi in trans: if tsi.state == libdnf.transaction.TransactionItemState_ERROR: raise dnf.exceptions.Error(_('Transaction failed')) return tid
def do_transaction(self, display=()): """Take care of package downloading, checking, user confirmation and actually running the transaction. :param display: `rpm.callback.TransactionProgress` object(s) :return: history database transaction ID or None """ trans = self.transaction pkg_str = self.output.list_transaction(trans) if pkg_str: logger.info(pkg_str) if trans: # Check which packages have to be downloaded install_pkgs = [] rmpkgs = [] install_only = True for tsi in trans: if tsi.action in dnf.transaction.FORWARD_ACTIONS: install_pkgs.append(tsi.pkg) elif tsi.action in dnf.transaction.BACKWARD_ACTIONS: install_only = False rmpkgs.append(tsi.pkg) # Close the connection to the rpmdb so that rpm doesn't hold the # SIGINT handler during the downloads. del self._ts # report the total download size to the user if not install_pkgs: self.output.reportRemoveSize(rmpkgs) else: self.output.reportDownloadSize(install_pkgs, install_only) if trans or self._moduleContainer.isChanged() or \ (self._history and (self._history.group or self._history.env)): # confirm with user if self.conf.downloadonly: logger.info( _("DNF will only download packages for the transaction.")) elif 'test' in self.conf.tsflags: logger.info( _("DNF will only download packages, install gpg keys, and check the " "transaction.")) if self._promptWanted(): if self.conf.assumeno or not self.output.userconfirm(): raise CliError(_("Operation aborted.")) else: logger.info(_('Nothing to do.')) return if trans: if install_pkgs: logger.info(_('Downloading Packages:')) try: total_cb = self.output.download_callback_total_cb self.download_packages(install_pkgs, self.output.progress, total_cb) except dnf.exceptions.DownloadError as e: specific = dnf.cli.format.indent_block(ucd(e)) errstr = _( 'Error downloading packages:') + '\n%s' % specific # setting the new line to prevent next chars being eaten up # by carriage returns print() raise dnf.exceptions.Error(errstr) # Check GPG signatures self.gpgsigcheck(install_pkgs) if self.conf.downloadonly: return if not isinstance(display, Sequence): display = [display] display = [output.CliTransactionDisplay()] + list(display) tid = super(BaseCli, self).do_transaction(display) # display last transaction (which was closed during do_transaction()) if tid is not None: trans = self.history.old([tid])[0] trans = dnf.db.group.RPMTransaction(self.history, trans._trans) else: trans = None if trans: msg = self.output.post_transaction_output(trans) logger.info(msg) for tsi in trans: if tsi.state == libdnf.transaction.TransactionItemState_ERROR: raise dnf.exceptions.Error(_('Transaction failed')) return tid
def check_reboot(self): if not self.state.download_status == 'complete': raise CliError(_("system is not ready for upgrade")) if os.path.lexists(MAGIC_SYMLINK): raise CliError(_("upgrade is already scheduled")) dnf.util.ensure_dir(DEFAULT_DATADIR)
def do_transaction(self, display=()): """Take care of package downloading, checking, user confirmation and actually running the transaction. :param display: `rpm.callback.TransactionProgress` object(s) :return: a numeric return code, and optionally a list of errors. A negative return code indicates that errors occurred in the pre-transaction checks """ # Reports about excludes and includes (but not from plugins) if self.conf.excludepkgs: logger.debug('Excludes in dnf.conf: ' + ", ".join(sorted(set(self.conf.excludepkgs)))) if self.conf.includepkgs: logger.debug('Includes in dnf.conf: ' + ", ".join(sorted(set(self.conf.includepkgs)))) for repo in self.repos.iter_enabled(): if repo.excludepkgs: logger.debug('Excludes in repo ' + repo.id + ": " + ", ".join(sorted(set(repo.excludepkgs)))) if repo.includepkgs: logger.debug('Includes in repo ' + repo.id + ": " + ", ".join(sorted(set(repo.includepkgs)))) trans = self.transaction pkg_str = self.output.list_transaction(trans) if pkg_str: logger.info(pkg_str) if trans: # Check which packages have to be downloaded install_pkgs = [] rmpkgs = [] install_only = True for tsi in trans: installed = tsi.installed if installed is not None: install_pkgs.append(installed) erased = tsi.erased if erased is not None: install_only = False rmpkgs.append(erased) # Close the connection to the rpmdb so that rpm doesn't hold the # SIGINT handler during the downloads. del self._ts # report the total download size to the user if not install_pkgs: self.output.reportRemoveSize(rmpkgs) else: self.output.reportDownloadSize(install_pkgs, install_only) if trans: # confirm with user if self.conf.downloadonly: logger.info( _("DNF will only download packages for the transaction.")) elif 'test' in self.conf.tsflags: logger.info( _("DNF will only download packages, install gpg keys, and check the " "transaction.")) if self._promptWanted(): if self.conf.assumeno or not self.output.userconfirm(): raise CliError(_("Operation aborted.")) else: logger.info(_('Nothing to do.')) return if trans: if install_pkgs: logger.info(_('Downloading Packages:')) try: total_cb = self.output.download_callback_total_cb self.download_packages(install_pkgs, self.output.progress, total_cb) except dnf.exceptions.DownloadError as e: specific = dnf.cli.format.indent_block(ucd(e)) errstr = _( 'Error downloading packages:') + '\n%s' % specific # setting the new line to prevent next chars being eaten up # by carriage returns print() raise dnf.exceptions.Error(errstr) # Check GPG signatures self.gpgsigcheck(install_pkgs) if self.conf.downloadonly: return if not isinstance(display, collections.Sequence): display = [display] display = [output.CliTransactionDisplay()] + list(display) super(BaseCli, self).do_transaction(display) if trans: msg = self.output.post_transaction_output(trans) logger.info(msg) for tsi in trans: if tsi.op_type == dnf.transaction.FAIL: raise dnf.exceptions.Error(_('Transaction failed'))
def check_reboot(self, *args): if not self.state.download_status == 'complete': raise CliError(_("system is not ready for upgrade")) if os.path.lexists(MAGIC_SYMLINK): raise CliError(_("upgrade is already scheduled"))
def do_transaction(self, display=()): """Take care of package downloading, checking, user confirmation and actually running the transaction. :param display: `rpm.callback.TransactionProgress` object(s) :return: a numeric return code, and optionally a list of errors. A negative return code indicates that errors occurred in the pre-transaction checks """ grp_diff = self._groups_diff() grp_str = self.output.list_group_transaction(self.comps, self.group_persistor, grp_diff) if grp_str: logger.info(grp_str) trans = self.transaction pkg_str = self.output.list_transaction(trans) if pkg_str: logger.info(pkg_str) if trans: # Check which packages have to be downloaded downloadpkgs = [] rmpkgs = [] stuff_to_download = False install_only = True for tsi in trans: installed = tsi.installed if installed is not None: stuff_to_download = True downloadpkgs.append(installed) erased = tsi.erased if erased is not None: install_only = False rmpkgs.append(erased) # Close the connection to the rpmdb so that rpm doesn't hold the # SIGINT handler during the downloads. del self.ts # report the total download size to the user if not stuff_to_download: self.output.reportRemoveSize(rmpkgs) else: self.output.reportDownloadSize(downloadpkgs, install_only) if trans or (grp_diff and not grp_diff.empty()): # confirm with user if self._promptWanted(): if self.conf.assumeno or not self.output.userconfirm(): raise CliError(_("Operation aborted.")) else: logger.info(_('Nothing to do.')) return if trans: if downloadpkgs: logger.info(_('Downloading Packages:')) try: total_cb = self.output.download_callback_total_cb self.download_packages(downloadpkgs, self.output.progress, total_cb) except dnf.exceptions.DownloadError as e: specific = dnf.cli.format.indent_block(ucd(e)) errstring = _('Error downloading packages:\n%s') % specific # setting the new line to prevent next chars being eaten up by carriage returns print() raise dnf.exceptions.Error(errstring) # Check GPG signatures self.gpgsigcheck(downloadpkgs) if self.cmd_conf.downloadonly: return if not isinstance(display, collections.Sequence): display = [display] display = [output.CliTransactionDisplay()] + list(display) super(BaseCli, self).do_transaction(display) if trans: msg = self.output.post_transaction_output(trans) logger.info(msg)
def checkDataDir(datadir): if os.path.exists(datadir) and not os.path.isdir(datadir): raise CliError(_("--datadir: File exists"))
def _check_state_version(self, command): if self.state.state_version != STATE_VERSION: msg = _( "Incompatible version of data. Rerun 'dnf {command} download [OPTIONS]'" "").format(command=command) raise CliError(msg)
def parse_args(self, args=None, namespace=None): try: return ArgumentParser.parse_args(self, args, namespace) except AttributeError as e: self.print_help() raise CliError(str(e))
def __call__(self, parser, namespace, values, option_string=None): message = REMOVED_OPTIONS[option_string] % dict(option=option_string) raise CliError(message)
def checkDNFVer(): if DNFVERSION < StrictVersion("1.1.0"): raise CliError(_("This plugin requires DNF 1.1.0 or later."))