Skip to content

Commit

Permalink
automatic: Check availability of config file
Browse files Browse the repository at this point in the history
If a configuration file is explicitly specified on the command line,
ensure that it exists and is readable. If the file is not found, notify
the user immediately and terminate the process.

This resolves issues where users may run dnf-automatic with unrecognized
positional arguments, such as `dnf-automatic install`.

Resolves: https://issues.redhat.com/browse/RHEL-46030
  • Loading branch information
m-blaha committed Oct 17, 2024
1 parent c2bc704 commit 69ac1e3
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions dnf/automatic/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def build_emitters(conf):

def parse_arguments(args):
parser = argparse.ArgumentParser()
parser.add_argument('conf_path', nargs='?', default=dnf.const.CONF_AUTOMATIC_FILENAME)
parser.add_argument('conf_path', nargs='?')
parser.add_argument('--timer', action='store_true')
parser.add_argument('--installupdates', dest='installupdates', action='store_true')
parser.add_argument('--downloadupdates', dest='downloadupdates', action='store_true')
Expand All @@ -89,7 +89,17 @@ def parse_arguments(args):
class AutomaticConfig(object):
def __init__(self, filename=None, downloadupdates=None,
installupdates=None):
if not filename:
if filename:
# Specific config file was explicitely requested. Check that it exists
# and is readable.
if os.access(filename, os.F_OK):
if not os.access(filename, os.R_OK):
raise dnf.exceptions.Error(
"Configuration file \"{}\" is not readable.".format(filename))
else:
raise dnf.exceptions.Error(
"Configuration file \"{}\" not found.".format(filename))
else:
filename = dnf.const.CONF_AUTOMATIC_FILENAME
self.commands = CommandsConfig()
self.email = EmailConfig()
Expand Down Expand Up @@ -304,9 +314,10 @@ def main(args):
(opts, parser) = parse_arguments(args)

try:
conf = None
emitters = None
conf = AutomaticConfig(opts.conf_path, opts.downloadupdates,
opts.installupdates)
emitters = None
with dnf.Base() as base:
cli = dnf.cli.Cli(base)
cli._read_conf_file()
Expand Down Expand Up @@ -371,7 +382,7 @@ def main(args):
raise dnf.exceptions.Error('reboot command returned nonzero exit code: %d', exit_code)
except dnf.exceptions.Error as exc:
logger.error(_('Error: %s'), ucd(exc))
if conf.emitters.send_error_messages and emitters != None:
if conf != None and conf.emitters.send_error_messages and emitters != None:
emitters.notify_error(_('Error: %s') % str(exc))
emitters.commit()
return 1
Expand Down

0 comments on commit 69ac1e3

Please sign in to comment.