Backport patches

Resolves: rhbz#2124793
Resolves: rhbz#2203069
Resolves: rhbz#2189851
This commit is contained in:
Jaroslav Rohel 2023-04-25 10:36:15 +02:00
parent b75daf58a4
commit 2e74dd7138
4 changed files with 372 additions and 1 deletions

View File

@ -0,0 +1,252 @@
From 56d3e10ecb666da53a77d17e9ac7524f3e1341d8 Mon Sep 17 00:00:00 2001
From: Evan Goode <mail@evangoo.de>
Date: Tue, 24 Jan 2023 09:53:47 -0500
Subject: [PATCH 1/4] Add reboot option to DNF Automatic (RhBug:2124793)
Add ability in DNF Automatic to automatically trigger a reboot after an
upgrade. The `reboot` option supports three settings: ``never`` does not
reboot the system (current behavior). ``when-changed`` triggers a reboot
after any upgrade. ``when-needed`` triggers a reboot only when rebooting
is necessary to apply changes, such as when systemd or the kernel is
upgraded. The `reboot_command` option allows customizing the command
used to reboot (default is `shutdown -r`).
= changelog =
msg: Add `reboot` option to DNF Automatic
type: enhancement
resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2124793
---
dnf/automatic/main.py | 9 +++++++++
dnf/base.py | 14 ++++++++++++++
doc/automatic.rst | 12 ++++++++++++
etc/dnf/automatic.conf | 9 +++++++++
tests/automatic/test_main.py | 4 ++++
5 files changed, 48 insertions(+)
diff --git a/dnf/automatic/main.py b/dnf/automatic/main.py
index b53d9c00..b68962c2 100644
--- a/dnf/automatic/main.py
+++ b/dnf/automatic/main.py
@@ -24,6 +24,7 @@ from __future__ import unicode_literals
import argparse
import logging
+import os
import random
import socket
import time
@@ -179,6 +180,9 @@ class CommandsConfig(Config):
libdnf.conf.VectorString(['default', 'security'])))
self.add_option('random_sleep', libdnf.conf.OptionNumberInt32(300))
self.add_option('network_online_timeout', libdnf.conf.OptionNumberInt32(60))
+ self.add_option('reboot', libdnf.conf.OptionEnumString('never',
+ libdnf.conf.VectorString(['never', 'when-changed', 'when-needed'])))
+ self.add_option('reboot_command', libdnf.conf.OptionString('shutdown -r'))
def imply(self):
if self.apply_updates:
@@ -340,6 +344,11 @@ def main(args):
base.do_transaction()
emitters.notify_applied()
emitters.commit()
+
+ if (conf.commands.reboot == 'when-changed' or
+ (conf.commands.reboot == 'when-needed' and base.reboot_needed())):
+ if os.waitstatus_to_exitcode(os.system(conf.commands.reboot_command)) != 0:
+ return 1
except dnf.exceptions.Error as exc:
logger.error(_('Error: %s'), ucd(exc))
return 1
diff --git a/dnf/base.py b/dnf/base.py
index 154eb4e3..24c5a444 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -2790,6 +2790,20 @@ class Base(object):
return skipped_conflicts, skipped_dependency
+ def reboot_needed(self):
+ """Check whether a system reboot is recommended following the transaction
+
+ :return: bool
+ """
+ if not self.transaction:
+ return False
+
+ # List taken from DNF needs-restarting
+ need_reboot = frozenset(('kernel', 'kernel-rt', 'glibc',
+ 'linux-firmware', 'systemd', 'dbus',
+ 'dbus-broker', 'dbus-daemon'))
+ changed_pkgs = self.transaction.install_set | self.transaction.remove_set
+ return any(pkg.name in need_reboot for pkg in changed_pkgs)
def _msg_installed(pkg):
name = ucd(pkg)
diff --git a/doc/automatic.rst b/doc/automatic.rst
index b8e47ad1..ade0ca1a 100644
--- a/doc/automatic.rst
+++ b/doc/automatic.rst
@@ -90,6 +90,18 @@ Setting the mode of operation of the program.
What kind of upgrades to look at. ``default`` signals looking for all available updates, ``security`` only those with an issued security advisory.
+``reboot``
+ either one of ``never``, ``when-changed``, ``when-needed``, default: ``never``
+
+ When the system should reboot following upgrades. ``never`` does not reboot the system. ``when-changed`` triggers a reboot after any upgrade. ``when-needed`` triggers a reboot only when rebooting is necessary to apply changes, such as when systemd or the kernel is upgraded.
+
+``reboot_command``
+ string, default: ``shutdown -r``
+
+ Specify the command to run to trigger a reboot of the system. For example, add a 5-minute delay and a wall message by using ``shutdown -r +5 'Rebooting after upgrading packages'``
+
+
+
----------------------
``[emitters]`` section
----------------------
diff --git a/etc/dnf/automatic.conf b/etc/dnf/automatic.conf
index 1f7e9402..9735447f 100644
--- a/etc/dnf/automatic.conf
+++ b/etc/dnf/automatic.conf
@@ -21,6 +21,15 @@ download_updates = yes
# install.timer override this setting.
apply_updates = no
+# When the system should reboot following upgrades:
+# never = don't reboot after upgrades
+# when-changed = reboot after any changes
+# when-needed = reboot when necessary to apply changes
+reboot = never
+
+# The command that is run to trigger a system reboot.
+reboot_command = "shutdown -r"
+
[emitters]
# Name to use for this system in messages that are emitted. Default is the
diff --git a/tests/automatic/test_main.py b/tests/automatic/test_main.py
index 27ffa407..dc4acd52 100644
--- a/tests/automatic/test_main.py
+++ b/tests/automatic/test_main.py
@@ -49,3 +49,7 @@ class TestConfig(tests.support.TestCase):
conf = dnf.automatic.main.AutomaticConfig(FILE, downloadupdates=True, installupdates=False)
self.assertTrue(conf.commands.download_updates)
self.assertFalse(conf.commands.apply_updates)
+
+ # test that reboot is "never" by default
+ conf = dnf.automatic.main.AutomaticConfig(FILE)
+ self.assertEqual(conf.commands.reboot, 'never')
--
2.40.0
From 8d7608f3462deddf36d5a75ff66f847a30b78026 Mon Sep 17 00:00:00 2001
From: Evan Goode <mail@evangoo.de>
Date: Tue, 24 Jan 2023 09:59:22 -0500
Subject: [PATCH 2/4] Add Evan Goode to AUTHORS
---
AUTHORS | 1 +
1 file changed, 1 insertion(+)
diff --git a/AUTHORS b/AUTHORS
index 50bff95b..e802a51e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -69,6 +69,7 @@ DNF CONTRIBUTORS
Dave Johansen <davejohansen@gmail.com>
Dylan Pindur <dylanpindur@gmail.com>
Eduard Cuba <ecuba@redhat.com>
+ Evan Goode <egoode@redhat.com>
Filipe Brandenburger <filbranden@gmail.com>
Frank Dana <ferdnyc@gmail.com>
George Machitidze <giomac@gmail.com>
--
2.40.0
From 9deed331cb7a1890e1f11a57c989c300b1641a88 Mon Sep 17 00:00:00 2001
From: Evan Goode <mail@evangoo.de>
Date: Tue, 24 Jan 2023 17:12:46 -0500
Subject: [PATCH 3/4] DNF Automatic reboot: 5-minute delay and wall by default
---
dnf/automatic/main.py | 2 +-
doc/automatic.rst | 4 ++--
etc/dnf/automatic.conf | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dnf/automatic/main.py b/dnf/automatic/main.py
index b68962c2..a03c359f 100644
--- a/dnf/automatic/main.py
+++ b/dnf/automatic/main.py
@@ -182,7 +182,7 @@ class CommandsConfig(Config):
self.add_option('network_online_timeout', libdnf.conf.OptionNumberInt32(60))
self.add_option('reboot', libdnf.conf.OptionEnumString('never',
libdnf.conf.VectorString(['never', 'when-changed', 'when-needed'])))
- self.add_option('reboot_command', libdnf.conf.OptionString('shutdown -r'))
+ self.add_option('reboot_command', libdnf.conf.OptionString('shutdown -r +5 \'Rebooting after applying package updates\''))
def imply(self):
if self.apply_updates:
diff --git a/doc/automatic.rst b/doc/automatic.rst
index ade0ca1a..329c2f46 100644
--- a/doc/automatic.rst
+++ b/doc/automatic.rst
@@ -96,9 +96,9 @@ Setting the mode of operation of the program.
When the system should reboot following upgrades. ``never`` does not reboot the system. ``when-changed`` triggers a reboot after any upgrade. ``when-needed`` triggers a reboot only when rebooting is necessary to apply changes, such as when systemd or the kernel is upgraded.
``reboot_command``
- string, default: ``shutdown -r``
+ string, default: ``shutdown -r +5 'Rebooting after applying package updates'``
- Specify the command to run to trigger a reboot of the system. For example, add a 5-minute delay and a wall message by using ``shutdown -r +5 'Rebooting after upgrading packages'``
+ Specify the command to run to trigger a reboot of the system. For example, to skip the 5-minute delay and wall message, use ``shutdown -r``
diff --git a/etc/dnf/automatic.conf b/etc/dnf/automatic.conf
index 9735447f..e61b12af 100644
--- a/etc/dnf/automatic.conf
+++ b/etc/dnf/automatic.conf
@@ -28,7 +28,7 @@ apply_updates = no
reboot = never
# The command that is run to trigger a system reboot.
-reboot_command = "shutdown -r"
+reboot_command = "shutdown -r +5 'Rebooting after applying package updates'"
[emitters]
--
2.40.0
From b002f47a763e442277913a06df963b0ca91deb54 Mon Sep 17 00:00:00 2001
From: Evan Goode <mail@evangoo.de>
Date: Wed, 25 Jan 2023 09:47:59 -0500
Subject: [PATCH 4/4] DNF Automatic: error message for failed reboot command
---
dnf/automatic/main.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/dnf/automatic/main.py b/dnf/automatic/main.py
index a03c359f..11c35ecf 100644
--- a/dnf/automatic/main.py
+++ b/dnf/automatic/main.py
@@ -347,7 +347,9 @@ def main(args):
if (conf.commands.reboot == 'when-changed' or
(conf.commands.reboot == 'when-needed' and base.reboot_needed())):
- if os.waitstatus_to_exitcode(os.system(conf.commands.reboot_command)) != 0:
+ exit_code = os.waitstatus_to_exitcode(os.system(conf.commands.reboot_command))
+ if exit_code != 0:
+ logger.error('Error: reboot command returned nonzero exit code: %d', exit_code)
return 1
except dnf.exceptions.Error as exc:
logger.error(_('Error: %s'), ucd(exc))
--
2.40.0

View File

@ -0,0 +1,45 @@
From b0caa16589763699174f47a3e36a703e1af32ed4 Mon Sep 17 00:00:00 2001
From: Kyle Walker <kwalker@redhat.com>
Date: Tue, 20 Dec 2022 08:42:03 -0500
Subject: [PATCH] Omit src RPMs from check-update (RhBug: 2151910)
The current check-update operation relies on src RPMs not being included
in the available repos. When those repos are enabled, *.src RPMs can be
emitted as updates that are available. Those RPMs are not updated in the
traditional fashion and can cause confusion to end users.
This change unconditionally filters out src packages in the
_list_patterns() callpath.
= changelog =
type: bugfix
resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2151910
---
dnf/base.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/dnf/base.py b/dnf/base.py
index 24c5a44..7e97e21 100644
--- a/dnf/base.py
+++ b/dnf/base.py
@@ -1543,6 +1543,8 @@ class Base(object):
updates = query_for_repo(q).filterm(upgrades_by_priority=True)
# reduce a query to security upgrades if they are specified
updates = self._merge_update_filters(updates, upgrade=True)
+ # reduce a query to remove src RPMs
+ updates.filterm(arch__neq=['src', 'nosrc'])
# reduce a query to latest packages
updates = updates.latest().run()
@@ -1595,6 +1597,8 @@ class Base(object):
self.sack.query()).filter(obsoletes_by_priority=inst)
# reduce a query to security upgrades if they are specified
obsoletes = self._merge_update_filters(obsoletes, warning=False, upgrade=True)
+ # reduce a query to remove src RPMs
+ obsoletes.filterm(arch__neq=['src', 'nosrc'])
obsoletesTuples = []
for new in obsoletes:
obsoleted_reldeps = new.obsoletes
--
libgit2 1.3.2

View File

@ -0,0 +1,66 @@
From fcc21cf217a7dfaaf79ca36b5afab6344380eae1 Mon Sep 17 00:00:00 2001
From: Marek Blaha <mblaha@redhat.com>
Date: Mon, 3 Apr 2023 12:19:40 +0200
Subject: [PATCH] automatic: Fix online detection with proxy (RhBz:2022440)
In case the proxy is configured (either for a repo of globally) it is
used also for detecting whether the system is online.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2022440
---
dnf/automatic/main.py | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/dnf/automatic/main.py b/dnf/automatic/main.py
index 11c35ec..756531e 100644
--- a/dnf/automatic/main.py
+++ b/dnf/automatic/main.py
@@ -182,7 +182,8 @@ class CommandsConfig(Config):
self.add_option('network_online_timeout', libdnf.conf.OptionNumberInt32(60))
self.add_option('reboot', libdnf.conf.OptionEnumString('never',
libdnf.conf.VectorString(['never', 'when-changed', 'when-needed'])))
- self.add_option('reboot_command', libdnf.conf.OptionString('shutdown -r +5 \'Rebooting after applying package updates\''))
+ self.add_option('reboot_command', libdnf.conf.OptionString(
+ 'shutdown -r +5 \'Rebooting after applying package updates\''))
def imply(self):
if self.apply_updates:
@@ -255,21 +256,29 @@ def wait_for_network(repos, timeout):
'http': 80,
'https': 443,
'ftp': 21,
+ 'socks': 1080,
+ 'socks5': 1080,
}
def remote_address(url_list):
for url in url_list:
parsed_url = dnf.pycomp.urlparse.urlparse(url)
- if parsed_url.hostname and parsed_url.scheme in remote_schemes:
- yield (parsed_url.hostname,
- parsed_url.port or remote_schemes[parsed_url.scheme])
+ if (not parsed_url.hostname) \
+ or (not parsed_url.port and parsed_url.scheme not in remote_schemes):
+ # skip urls without hostname or without recognized port
+ continue
+ yield (parsed_url.hostname,
+ parsed_url.port or remote_schemes[parsed_url.scheme])
# collect possible remote repositories urls
addresses = set()
for repo in repos.iter_enabled():
- addresses.update(remote_address(repo.baseurl))
- addresses.update(remote_address([repo.mirrorlist]))
- addresses.update(remote_address([repo.metalink]))
+ if repo.proxy:
+ addresses.update(remote_address([repo.proxy]))
+ else:
+ addresses.update(remote_address(repo.baseurl))
+ addresses.update(remote_address([repo.mirrorlist]))
+ addresses.update(remote_address([repo.metalink]))
if not addresses:
# there is no remote repository enabled so network connection should not be needed
--
libgit2 1.3.2

View File

@ -66,7 +66,7 @@ It supports RPMs, modules and comps groups & environments.
Name: dnf Name: dnf
Version: 4.14.0 Version: 4.14.0
Release: 5%{?dist} Release: 6%{?dist}
Summary: %{pkg_summary} Summary: %{pkg_summary}
# For a breakdown of the licensing, see PACKAGE-LICENSING # For a breakdown of the licensing, see PACKAGE-LICENSING
License: GPLv2+ License: GPLv2+
@ -78,6 +78,9 @@ Patch3: 0003-Move-system-upgrade-plugin-to-core-RhBug-2054235.patch
Patch4: 0004-Fix-plugins-unit-tests.patch Patch4: 0004-Fix-plugins-unit-tests.patch
Patch5: 0005-Ignore-processing-variable-files-with-unsupported-en.patch Patch5: 0005-Ignore-processing-variable-files-with-unsupported-en.patch
Patch6: 0006-Update-translations.patch Patch6: 0006-Update-translations.patch
Patch7: 0007-Add-reboot-option-to-DNF-Automatic.patch
Patch8: 0008-Omit-src-RPMs-from-check-update-RhBug-2151910.patch
Patch9: 0009-automatic-Fix-online-detection-with-proxy-RhBz2022440.patch
BuildArch: noarch BuildArch: noarch
BuildRequires: cmake BuildRequires: cmake
@ -366,6 +369,11 @@ popd
%{python3_sitelib}/%{name}/automatic/ %{python3_sitelib}/%{name}/automatic/
%changelog %changelog
* Thu May 11 2023 Jaroslav Rohel <jrohel@redhat.com> - 4.14.0-6
- Add reboot option to DNF Automatic (RhBug:2124793)
- Omit src RPMs from check-update (RhBug:2151910,2203069)
- automatic: Fix online detection with proxy (RhBug:2022440,2189851)
* Wed Mar 15 2023 Marek Blaha <mblaha@redhat.com> - 4.14.0-5 * Wed Mar 15 2023 Marek Blaha <mblaha@redhat.com> - 4.14.0-5
- Update translations - Update translations