File Explorer

/proc/thread-self/root/proc/self/root/usr/lib/python3.9/site-packages/dnf/cli

This explorer reads the filesystem of the server it runs on, so /workspace/user isn't present here. Browsing and the terminal still work against this server's own disk from /.

main.py6.3 KB · 209 lines
# Copyright 2005 Duke University# Copyright (C) 2012-2016 Red Hat, Inc.## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU Library General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """Entrance point for the yum command line interface.""" from __future__ import print_functionfrom __future__ import absolute_importfrom __future__ import unicode_literalsfrom dnf.conf import Conffrom dnf.cli.cli import Clifrom dnf.cli.option_parser import OptionParserfrom dnf.i18n import ucdfrom dnf.cli.utils import show_lock_ownerfrom dnf.i18n import _ import dnf.cliimport dnf.cli.cliimport dnf.cli.option_parserimport dnf.exceptionsimport dnf.i18nimport dnf.loggingimport dnf.utilimport errnoimport hawkeyimport libdnf.errorimport loggingimport osimport os.pathimport sys logger = logging.getLogger("dnf")  def ex_IOError(e):    logger.log(dnf.logging.SUBDEBUG, '', exc_info=True)    logger.critical(ucd(e))    return 1  def ex_Error(e):    logger.log(dnf.logging.SUBDEBUG, '', exc_info=True)    if e.value is not None:        logger.critical(_('Error: %s'), ucd(e))    return 1  def main(args, conf_class=Conf, cli_class=Cli, option_parser_class=OptionParser):    try:        dnf.i18n.setup_stdout()        with dnf.cli.cli.BaseCli(conf_class()) as base:            return _main(base, args, cli_class, option_parser_class)    except dnf.exceptions.ProcessLockError as e:        logger.critical(e.value)        show_lock_owner(e.pid)        return 200    except dnf.exceptions.LockError as e:        logger.critical(e.value)        return 200    except dnf.exceptions.DepsolveError as e:        return 1    except dnf.exceptions.Error as e:        return ex_Error(e)    except hawkey.Exception as e:        logger.critical(_('Error: %s'), ucd(e))        return 1    except libdnf.error.Error as e:        logger.critical(_('Error: %s'), ucd(e))        return 1    except IOError as e:        return ex_IOError(e)    except KeyboardInterrupt as e:        logger.critical('{}: {}'.format(type(e).__name__, _("Terminated.")))        return 1  def _main(base, args, cli_class, option_parser):    """Run the dnf program from a command line interface."""     # our core object for the cli    base._logging._presetup()    cli = cli_class(base)     # do our cli parsing and config file setup    # also sanity check the things being passed on the cli    try:        cli.configure(list(map(ucd, args)), option_parser())    except (IOError, OSError) as e:        return ex_IOError(e)     return cli_run(cli, base)  def cli_run(cli, base):    # Try to open the current directory to see if we have    # read and execute access. If not, chdir to /    try:        f = open(".")    except IOError as e:        if e.errno == errno.EACCES:            logger.critical(_('No read/execute access in current directory, moving to /'))            os.chdir("/")    else:        f.close()     try:        cli.run()    except dnf.exceptions.LockError:        raise    except (IOError, OSError) as e:        return ex_IOError(e)     if cli.demands.resolving:        try:            ret = resolving(cli, base)        except dnf.exceptions.DepsolveError as e:            ex_Error(e)            msg = ""            if not cli.demands.allow_erasing and base._goal.problem_conflicts(available=True):                msg += _("try to add '{}' to command line to replace conflicting "                         "packages").format("--allowerasing")            if cli.base.conf.strict:                if not msg:                    msg += _("try to add '{}' to skip uninstallable packages").format(                        "--skip-broken")                else:                    msg += _(" or '{}' to skip uninstallable packages").format("--skip-broken")            if cli.base.conf.best:                prio = cli.base.conf._get_priority("best")                if prio <= dnf.conf.PRIO_MAINCONFIG:                    if not msg:                        msg += _("try to add '{}' to use not only best candidate packages").format(                            "--nobest")                    else:                        msg += _(" or '{}' to use not only best candidate packages").format(                            "--nobest")            if msg:                logger.info("({})".format(msg))            raise        if ret:            return ret     cli.command.run_transaction()    return cli.demands.success_exit_status  def resolving(cli, base):    """Perform the depsolve, download and RPM transaction stage."""     if base.transaction is None:        base.resolve(cli.demands.allow_erasing)        logger.info(_('Dependencies resolved.'))     cli.command.run_resolved()     # Run the transaction    displays = []    if cli.demands.transaction_display is not None:        displays.append(cli.demands.transaction_display)    try:        base.do_transaction(display=displays)    except dnf.cli.CliError as exc:        logger.error(ucd(exc))        return 1    except dnf.exceptions.TransactionCheckError as err:        for msg in cli.command.get_error_output(err):            logger.critical(msg)        return 1    except IOError as e:        return ex_IOError(e)    else:        logger.info(_('Complete!'))    return 0  def user_main(args, exit_code=False):    """Call one of the multiple main() functions based on environment variables.     :param args: command line arguments passed into yum    :param exit_code: if *exit_code* is True, this function will exit       python with its exit code when it has finished executing.       Otherwise, it will return its exit code.    :return: the exit code from dnf.yum execution    """     errcode = main(args)    if exit_code:        sys.exit(errcode)    return errcode  if __name__ == "__main__":    user_main(sys.argv[1:], exit_code=True)