Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport: Check availability of dnf-automatic config file #2177

Merged
merged 2 commits into from
Dec 13, 2024

Conversation

m-blaha
Copy link
Member

@m-blaha m-blaha commented Dec 12, 2024

Upstream commit: 13ecc39

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.

The most natural approach to handle a non-existing config file would be by catching the exception thrown by the read() method of the libdnf.conf.ConfigParser class. Unfortunately, the Python bindings override the read() method at the SWIG level, causing it to suppress any potentially raised IOError.
For details see this section of the commit
rpm-software-management/libdnf@8f1fedf

def ConfigParser__newRead(self, filenames):
parsedFNames = []
try:
if isinstance(filenames, str) or isinstance(filenames, unicode):
filenames = [filenames]
except NameError:
pass
for fname in filenames:
try:
self.readFileName(fname)
parsedFNames.append(fname)
except IOError:
pass
except Exception as e:
raise RuntimeError("Parsing file '%s' failed: %s" % (fname, str(e)))
return parsedFNames
ConfigParser.read = ConfigParser__newRead

Resolves: https://issues.redhat.com/browse/RHEL-68979

Upstream commit: 13ecc39

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`.

The most natural approach to handle a non-existing config file would be
by catching the exception thrown by the `read()` method of the
`libdnf.conf.ConfigParser` class. Unfortunately, the Python bindings
override the `read()` method at the SWIG level, causing it to suppress any
potentially raised IOError.
For details see this section of the commit
rpm-software-management/libdnf@8f1fedf

def ConfigParser__newRead(self, filenames):
    parsedFNames = []
    try:
        if isinstance(filenames, str) or isinstance(filenames, unicode):
            filenames = [filenames]
    except NameError:
        pass
    for fname in filenames:
        try:
            self.readFileName(fname)
            parsedFNames.append(fname)
        except IOError:
            pass
        except Exception as e:
            raise RuntimeError("Parsing file '%s' failed: %s" % (fname, str(e)))
    return parsedFNames
ConfigParser.read = ConfigParser__newRead

Resolves: https://issues.redhat.com/browse/RHEL-68979
dnf.exceptions.Error class constructor accepts only one argument - error
message.
@m-blaha m-blaha marked this pull request as ready for review December 13, 2024 08:38
@m-blaha m-blaha changed the title automatic: Check availability of config file Backport: Check availability of dnf-automatic config file Dec 13, 2024
@kontura kontura merged commit bfc4d7a into rhel-10.0 Dec 13, 2024
5 of 9 checks passed
@kontura kontura deleted the automatic-config-file branch December 13, 2024 12:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants