Enable "leaves" and "show-leaves" plugins, backport patches

Resolves: rhbz#2182157
Resolves: rhbz#2157844
Resolves: rhbz#2182004
Resolves: rhbz#2203766
Resolves: rhbz#2134638
This commit is contained in:
Jaroslav Rohel 2023-05-15 12:57:04 +02:00
parent a708071b9e
commit 022945760b
5 changed files with 443 additions and 34 deletions

View File

@ -0,0 +1,55 @@
From f65bb02d8c6fb6569c3e1db43c3b0e9f2a0ab283 Mon Sep 17 00:00:00 2001
From: Todd Lewis <todd_lewis@unc.edu>
Date: Wed, 16 Nov 2022 10:45:39 -0500
Subject: [PATCH] Fix boot time derivation for systems with no rtc
That addresses https://bugzilla.redhat.com/show_bug.cgi?id=2137935
---
plugins/needs_restarting.py | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/plugins/needs_restarting.py b/plugins/needs_restarting.py
index 91dbe66..03831fa 100644
--- a/plugins/needs_restarting.py
+++ b/plugins/needs_restarting.py
@@ -34,6 +34,7 @@ import functools
import os
import re
import stat
+import time
# For which package updates we should recommend a reboot
@@ -199,7 +200,28 @@ class ProcessStart(object):
@staticmethod
def get_boot_time():
- return int(os.stat('/proc/1').st_mtime)
+ """
+ We have two sources from which to derive the boot time. These values vary
+ depending on containerization, existence of a Real Time Clock, etc.
+ For our purposes we want the latest derived value.
+ - st_mtime of /proc/1
+ Reflects the time the first process was run after booting
+ This works for all known cases except machines without
+ a RTC - they awake at the start of the epoch.
+ - /proc/uptime
+ Seconds field of /proc/uptime subtracted from the current time
+ Works for machines without RTC iff the current time is reasonably correct.
+ Does not work on containers which share their kernel with the
+ host - there the host kernel uptime is returned
+ """
+
+ proc_1_boot_time = int(os.stat('/proc/1').st_mtime)
+ if os.path.isfile('/proc/uptime'):
+ with open('/proc/uptime', 'rb') as f:
+ uptime = f.readline().strip().split()[0].strip()
+ proc_uptime_boot_time = int(time.time() - float(uptime))
+ return max(proc_1_boot_time, proc_uptime_boot_time)
+ return proc_1_boot_time
@staticmethod
def get_sc_clk_tck():
--
2.40.1

View File

@ -0,0 +1,241 @@
From d5f5883623ada37b4cec5909a1032c4bc3123a9a Mon Sep 17 00:00:00 2001
From: Cameron Rodriguez <rod.cam2014+dev@gmail.com>
Date: Tue, 1 Nov 2022 02:25:52 -0400
Subject: [PATCH] [system-upgrade] Add --poweroff option to reboot subcommand
= changelog =
msg: Add --poweroff option to system-upgrade reboot
type: enhancement
---
doc/system-upgrade.rst | 10 ++++++++++
plugins/system_upgrade.py | 28 ++++++++++++++++++++++------
tests/test_system_upgrade.py | 18 +++++++++++++++++-
3 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/doc/system-upgrade.rst b/doc/system-upgrade.rst
index 87b7319..6a7785b 100644
--- a/doc/system-upgrade.rst
+++ b/doc/system-upgrade.rst
@@ -44,6 +44,8 @@ Synopsis
``dnf system-upgrade reboot``
+``dnf system-upgrade reboot --poweroff``
+
``dnf system-upgrade clean``
``dnf system-upgrade log``
@@ -54,6 +56,8 @@ Synopsis
``dnf offline-upgrade reboot``
+``dnf offline-upgrade reboot --poweroff``
+
``dnf offline-upgrade clean``
``dnf offline-upgrade log``
@@ -64,6 +68,8 @@ Synopsis
``dnf offline-distrosync reboot``
+``dnf offline-distrosync reboot --poweroff``
+
``dnf offline-distrosync clean``
``dnf offline-distrosync log``
@@ -116,6 +122,10 @@ Options
``--distro-sync``. If both are specified, the last option will be used. The option cannot be
used with the ``offline-distrosync`` command.
+``--poweroff``
+ When applied with the ``reboot`` subcommand, the system will power off after
+ upgrades are completed, instead of restarting.
+
``--number``
Applied with ``log`` subcommand will show the log specified by the number.
diff --git a/plugins/system_upgrade.py b/plugins/system_upgrade.py
index 4f7620f..b99dd8a 100644
--- a/plugins/system_upgrade.py
+++ b/plugins/system_upgrade.py
@@ -61,16 +61,19 @@ DOWNLOAD_FINISHED_MSG = _( # Translators: do not change "reboot" here
CANT_RESET_RELEASEVER = _(
"Sorry, you need to use 'download --releasever' instead of '--network'")
-STATE_VERSION = 2
+STATE_VERSION = 3
# --- Miscellaneous helper functions ------------------------------------------
-def reboot():
+def reboot(poweroff = False):
if os.getenv("DNF_SYSTEM_UPGRADE_NO_REBOOT", default=False):
logger.info(_("Reboot turned off, not rebooting."))
else:
- Popen(["systemctl", "reboot"])
+ if poweroff:
+ Popen(["systemctl", "poweroff"])
+ else:
+ Popen(["systemctl", "reboot"])
def get_url_from_os_release():
@@ -183,6 +186,7 @@ class State(object):
upgrade_status = _prop("upgrade_status")
upgrade_command = _prop("upgrade_command")
distro_sync = _prop("distro_sync")
+ poweroff_after = _prop("poweroff_after")
enable_disable_repos = _prop("enable_disable_repos")
module_platform_id = _prop("module_platform_id")
@@ -359,6 +363,10 @@ class SystemUpgradeCommand(dnf.cli.Command):
action='store_false',
help=_("keep installed packages if the new "
"release's version is older"))
+ parser.add_argument('--poweroff', dest='poweroff_after',
+ action='store_true',
+ help=_("power off system after the operation "
+ "is completed"))
parser.add_argument('tid', nargs=1, choices=CMDS,
metavar="[%s]" % "|".join(CMDS))
parser.add_argument('--number', type=int, help=_('which logs to show'))
@@ -566,8 +574,13 @@ class SystemUpgradeCommand(dnf.cli.Command):
if not self.opts.tid[0] == "reboot":
return
+ self.state.poweroff_after = self.opts.poweroff_after
+
self.log_status(_("Rebooting to perform upgrade."),
REBOOT_REQUESTED_ID)
+
+ # Explicit write since __exit__ doesn't seem to get called when rebooting
+ self.state.write()
reboot()
def run_download(self):
@@ -686,12 +699,15 @@ class SystemUpgradeCommand(dnf.cli.Command):
self.log_status(_("Download finished."), DOWNLOAD_FINISHED_ID)
def transaction_upgrade(self):
- Plymouth.message(_("Upgrade complete! Cleaning up and rebooting..."))
- self.log_status(_("Upgrade complete! Cleaning up and rebooting..."),
+ power_op = "powering off" if self.state.poweroff_after else "rebooting"
+
+ Plymouth.message(_("Upgrade complete! Cleaning up and " + power_op + "..."))
+ self.log_status(_("Upgrade complete! Cleaning up and " + power_op + "..."),
UPGRADE_FINISHED_ID)
+
self.run_clean()
if self.opts.tid[0] == "upgrade":
- reboot()
+ reboot(self.state.poweroff_after)
class OfflineUpgradeCommand(SystemUpgradeCommand):
diff --git a/tests/test_system_upgrade.py b/tests/test_system_upgrade.py
index 6ef4c21..769720d 100644
--- a/tests/test_system_upgrade.py
+++ b/tests/test_system_upgrade.py
@@ -322,7 +322,7 @@ class RebootCheckCommandTestCase(CommandTestCaseBase):
def check_reboot(self, status='complete', lexists=False, command='system-upgrade',
state_command='system-upgrade'):
with patch('system_upgrade.os.path.lexists') as lexists_func:
- self.command.state.state_version = 2
+ self.command.state.state_version = 3
self.command.state.download_status = status
self.command.opts = mock.MagicMock()
self.command.opts.command = command
@@ -356,6 +356,7 @@ class RebootCheckCommandTestCase(CommandTestCaseBase):
@patch('system_upgrade.reboot')
def test_run_reboot(self, reboot, log_status, run_prepare):
self.command.opts = mock.MagicMock()
+ self.command.opts.poweroff_after = False
self.command.opts.tid = ["reboot"]
self.command.run_reboot()
run_prepare.assert_called_once_with()
@@ -363,6 +364,21 @@ class RebootCheckCommandTestCase(CommandTestCaseBase):
log_status.call_args[0][1])
self.assertTrue(reboot.called)
+ @patch('system_upgrade.SystemUpgradeCommand.run_prepare')
+ @patch('system_upgrade.SystemUpgradeCommand.log_status')
+ @patch('system_upgrade.reboot')
+ def test_reboot_poweroff_after(self, reboot, log_status, run_prepare):
+ self.command.opts = mock.MagicMock()
+ self.command.opts.tid = ["reboot"]
+ self.command.opts.poweroff_after = True
+ self.command.run_reboot()
+ run_prepare.assert_called_with()
+ self.assertEqual(system_upgrade.REBOOT_REQUESTED_ID,
+ log_status.call_args[0][1])
+ self.assertTrue(self.command.state.poweroff_after)
+ self.assertTrue(reboot.called)
+
+
@patch('system_upgrade.SystemUpgradeCommand.run_prepare')
@patch('system_upgrade.SystemUpgradeCommand.log_status')
@patch('system_upgrade.reboot')
--
2.40.1
From 52aec32ef129874dc28fc93947e5d32c78baff0c Mon Sep 17 00:00:00 2001
From: Cameron Rodriguez <rod.cam2014+dev@gmail.com>
Date: Tue, 1 Nov 2022 02:29:29 -0400
Subject: [PATCH] Add Cameron Rodriguez to AUTHORS file
---
AUTHORS | 1 +
1 file changed, 1 insertion(+)
diff --git a/AUTHORS b/AUTHORS
index f098cb6..a6102ec 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -20,6 +20,7 @@ DNF-PLUGINS-CORE CONTRIBUTORS
Adam Salih <salih.max@gmail.com>
Alexander Todorov <atodorov@otb.bg>
Anders Blomdell <anders.blomdell@gmail.com>
+ Cameron Rodriguez <rod.cam2014+dev@gmail.com>
Cyril Jouve <jv.cyril@gmail.com>
David Michael <fedora.dm0@gmail.com>
François Rigault <francois.rigault@amadeus.com>
--
2.40.1
From dd081ebd4c46a79688f81ef639628189f8b78db3 Mon Sep 17 00:00:00 2001
From: Cameron Rodriguez <rod.cam2014+dev@gmail.com>
Date: Sun, 4 Dec 2022 10:06:08 -0500
Subject: [PATCH] [offline-upgrade] Fix strings for l10n
---
plugins/system_upgrade.py | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/plugins/system_upgrade.py b/plugins/system_upgrade.py
index b99dd8a..64195fd 100644
--- a/plugins/system_upgrade.py
+++ b/plugins/system_upgrade.py
@@ -699,11 +699,13 @@ class SystemUpgradeCommand(dnf.cli.Command):
self.log_status(_("Download finished."), DOWNLOAD_FINISHED_ID)
def transaction_upgrade(self):
- power_op = "powering off" if self.state.poweroff_after else "rebooting"
+ if self.state.poweroff_after:
+ upgrade_complete_msg = _("Upgrade complete! Cleaning up and powering off...")
+ else:
+ upgrade_complete_msg = _("Upgrade complete! Cleaning up and rebooting...")
- Plymouth.message(_("Upgrade complete! Cleaning up and " + power_op + "..."))
- self.log_status(_("Upgrade complete! Cleaning up and " + power_op + "..."),
- UPGRADE_FINISHED_ID)
+ Plymouth.message(upgrade_complete_msg)
+ self.log_status(upgrade_complete_msg, UPGRADE_FINISHED_ID)
self.run_clean()
if self.opts.tid[0] == "upgrade":
--
2.40.1

View File

@ -0,0 +1,34 @@
From 52c980f191993b61a42438a478d1e5629ea36c9f Mon Sep 17 00:00:00 2001
From: Jaroslav Mracek <jmracek@redhat.com>
Date: Mon, 27 Mar 2023 10:24:59 +0200
Subject: [PATCH] Documentation update for reposync (RhBug:2132383,2182004)
The update describe the behavior when `-n` and `--download-metadata`
is used.
https://bugzilla.redhat.com/show_bug.cgi?id=2132383
https://bugzilla.redhat.com/show_bug.cgi?id=2182004
---
doc/reposync.rst | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/doc/reposync.rst b/doc/reposync.rst
index 0df00b9..bbf714c 100644
--- a/doc/reposync.rst
+++ b/doc/reposync.rst
@@ -46,7 +46,11 @@ All general DNF options are accepted. Namely, the ``--repoid`` option can be use
Delete local packages no longer present in repository.
``--download-metadata``
- Download all repository metadata. Downloaded copy is instantly usable as a repository, no need to run createrepo_c on it.
+ Download all repository metadata. Downloaded copy is instantly usable as a repository, no need to run createrepo_c
+ on it. When the option is used with `--newest-only`, only latest packages will be downloaded, but metadata will
+ still contain older packages. It might be useful to update metadata using `createrepo_c --update` to remove
+ the packages with missing RPM files from metadata. Otherwise, DNF ends with an error due to the missing files
+ whenever it tries to download older packages.
``-g, --gpgcheck``
Remove packages that fail GPG signature checking after downloading. Exit code is ``1`` if at least one package was removed.
--
2.40.1

View File

@ -0,0 +1,97 @@
From bb8c0ad46144362e2e1e2bd9f2d2400aca9a72c0 Mon Sep 17 00:00:00 2001
From: Marek Blaha <mblaha@redhat.com>
Date: Wed, 6 Oct 2021 16:43:10 +0200
Subject: [PATCH] reposync: Implement --safe-write-path option (RhBug:1898089)
By default reposync is not allowed to write files outside of repository
download path (by default ./<repo id>). But there are some repositories
that store packages using relative parent paths (e.g.
../packages-store/f/foo.rpm).
This patch introduces new --safe-write-path option that can override
this limitation and set a root directory that is considered safe for
writing.
For example `dnf reposync --repoid=the_repo --safe-write-path=.` will
allow reposync to write files not only to `./the_repo` directory but
also to current working directory itself.
= changelog =
msg: With --safe-write-path option reposync can download repositories with relative package locations (like ../package-store/f/foo.rpm)
type: enhancement
resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1898089
---
doc/reposync.rst | 3 +++
plugins/reposync.py | 27 ++++++++++++++++++++-------
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/doc/reposync.rst b/doc/reposync.rst
index bbf714c..ede8901 100644
--- a/doc/reposync.rst
+++ b/doc/reposync.rst
@@ -71,6 +71,9 @@ All general DNF options are accepted. Namely, the ``--repoid`` option can be use
``-p <download-path>, --download-path=<download-path>``
Root path under which the downloaded repositories are stored, relative to the current working directory. Defaults to the current working directory. Every downloaded repository has a subdirectory named after its ID under this path.
+``--safe-write-path``
+ Specify the filesystem path prefix under which the reposync is allowed to write. If not specified it defaults to download path of the repository. Useful for repositories that use relative locations of packages out of repository directory (e.g. "../packages_store/foo.rpm"). Use with care, any file under the ``safe-write-path`` can be overwritten. Can be only used when syncing a single repository.
+
``--remote-time``
Try to set the timestamps of the downloaded files to those on the remote side.
diff --git a/plugins/reposync.py b/plugins/reposync.py
index 0ff936f..63d8e98 100644
--- a/plugins/reposync.py
+++ b/plugins/reposync.py
@@ -88,6 +88,8 @@ class RepoSyncCommand(dnf.cli.Command):
parser.add_argument('-u', '--urls', default=False, action='store_true',
help=_("Just list urls of what would be downloaded, "
"don't download"))
+ parser.add_argument('--safe-write-path', default=None,
+ help=_("Filesystem path that is considered safe for writing. Defaults to download path."))
def configure(self):
demands = self.cli.demands
@@ -108,9 +110,16 @@ class RepoSyncCommand(dnf.cli.Command):
if self.opts.source:
repos.enable_source_repos()
- if len(list(repos.iter_enabled())) > 1 and self.opts.norepopath:
- raise dnf.cli.CliError(
- _("Can't use --norepopath with multiple repositories"))
+ if self.opts.safe_write_path is not None:
+ self.opts.safe_write_path = os.path.realpath(self.opts.safe_write_path)
+
+ if len(list(repos.iter_enabled())) > 1:
+ if self.opts.norepopath:
+ raise dnf.cli.CliError(
+ _("Can't use --norepopath with multiple repositories"))
+ elif self.opts.safe_write_path is not None:
+ raise dnf.cli.CliError(
+ _("Can't use --safe-write-path with multiple repositories"))
for repo in repos.iter_enabled():
repo._repo.expire()
@@ -188,13 +197,17 @@ class RepoSyncCommand(dnf.cli.Command):
repo_target = self.repo_target(pkg.repo)
pkg_download_path = os.path.realpath(
os.path.join(repo_target, pkg.location))
- # join() ensures repo_target ends with a path separator (otherwise the
+
+ # join() ensures safe_write_path ends with a path separator (otherwise the
# check would pass if pkg_download_path was a "sibling" path component
# of repo_target that has the same prefix).
- if not pkg_download_path.startswith(os.path.join(repo_target, '')):
+ safe_write_path = os.path.join(self.opts.safe_write_path or repo_target, '')
+
+ if not pkg_download_path.startswith(safe_write_path):
raise dnf.exceptions.Error(
- _("Download target '{}' is outside of download path '{}'.").format(
- pkg_download_path, repo_target))
+ _("Download target '{0}' for location '{1}' of '{2}' package "
+ "is outside of safe write path '{3}'.").format(
+ pkg_download_path, pkg.location, pkg.name, safe_write_path))
return pkg_download_path
def delete_old_local_packages(self, repo, pkglist):
--
2.40.1

View File

@ -34,7 +34,7 @@
Name: dnf-plugins-core Name: dnf-plugins-core
Version: 4.3.0 Version: 4.3.0
Release: 5%{?dist} Release: 6%{?dist}
Summary: Core Plugins for DNF Summary: Core Plugins for DNF
License: GPLv2+ License: GPLv2+
URL: https://github.com/rpm-software-management/dnf-plugins-core URL: https://github.com/rpm-software-management/dnf-plugins-core
@ -44,7 +44,10 @@ Patch2: 0002-Add-a-warning-when-using-system-upgrade-on-RHEL.patch
Patch3: 0003-offline-upgrade-Add-security-filters.patch Patch3: 0003-offline-upgrade-Add-security-filters.patch
Patch4: 0004-system-upgrade-Show-warning-always-for-a-downstream.patch Patch4: 0004-system-upgrade-Show-warning-always-for-a-downstream.patch
Patch5: 0005-Update-translations.patch Patch5: 0005-Update-translations.patch
Patch6: 0006-Fix-boot-time-derivation-for-systems-with-no-rtc.patch
Patch7: 0007-system-upgrade-Add-poweroff-option-to-reboot-subcomm.patch
Patch8: 0008-Doc-update-for-reposync-RhBug-2132383-2182004.patch
Patch9: 0009-reposync-Implement-safe-write-path-opt-RhBug-1898089.patch
BuildArch: noarch BuildArch: noarch
BuildRequires: cmake BuildRequires: cmake
@ -219,7 +222,7 @@ repoquery, reposync, repotrack, repodiff, builddep, config-manager, debug,
download and yum-groups-manager that use new implementations using DNF. download and yum-groups-manager that use new implementations using DNF.
%endif %endif
%if 0%{?rhel} == 0 && %{with python2} %if %{with python2}
%package -n python2-dnf-plugin-leaves %package -n python2-dnf-plugin-leaves
Summary: Leaves Plugin for DNF Summary: Leaves Plugin for DNF
Requires: python2-%{name} = %{version}-%{release} Requires: python2-%{name} = %{version}-%{release}
@ -238,7 +241,7 @@ Leaves Plugin for DNF, Python 2 version. List all installed packages
not required by any other installed package. not required by any other installed package.
%endif %endif
%if 0%{?rhel} == 0 && %{with python3} %if %{with python3}
%package -n python3-dnf-plugin-leaves %package -n python3-dnf-plugin-leaves
Summary: Leaves Plugin for DNF Summary: Leaves Plugin for DNF
Requires: python3-%{name} = %{version}-%{release} Requires: python3-%{name} = %{version}-%{release}
@ -336,7 +339,7 @@ Post transaction actions Plugin for DNF, Python 3 version. Plugin runs actions
files. files.
%endif %endif
%if 0%{?rhel} == 0 && %{with python2} %if %{with python2}
%package -n python2-dnf-plugin-show-leaves %package -n python2-dnf-plugin-show-leaves
Summary: Leaves Plugin for DNF Summary: Leaves Plugin for DNF
Requires: python2-%{name} = %{version}-%{release} Requires: python2-%{name} = %{version}-%{release}
@ -357,7 +360,7 @@ packages that are no longer required by any other installed package
after a transaction. after a transaction.
%endif %endif
%if 0%{?rhel} == 0 && %{with python3} %if %{with python3}
%package -n python3-dnf-plugin-show-leaves %package -n python3-dnf-plugin-show-leaves
Summary: Show-leaves Plugin for DNF Summary: Show-leaves Plugin for DNF
Requires: python3-%{name} = %{version}-%{release} Requires: python3-%{name} = %{version}-%{release}
@ -687,8 +690,6 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/
%exclude %{_mandir}/man1/yum-utils.* %exclude %{_mandir}/man1/yum-utils.*
%endif %endif
%if 0%{?rhel} == 0
%if %{with python2} %if %{with python2}
%files -n python2-dnf-plugin-leaves %files -n python2-dnf-plugin-leaves
%{python2_sitelib}/dnf-plugins/leaves.* %{python2_sitelib}/dnf-plugins/leaves.*
@ -702,18 +703,6 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/
%{_mandir}/man8/dnf-leaves.* %{_mandir}/man8/dnf-leaves.*
%endif %endif
%else
%exclude %{_mandir}/man8/dnf-leaves.*
%if %{with python2}
%exclude %{python2_sitelib}/dnf-plugins/leaves.*
%endif
%if %{with python3}
%exclude %{python3_sitelib}/dnf-plugins/leaves.*
%exclude %{python3_sitelib}/dnf-plugins/__pycache__/leaves.*
%endif
%endif
# endif 0%%{?rhel} == 0
%if 0%{?rhel} == 0 && %{with python2} %if 0%{?rhel} == 0 && %{with python2}
%files -n python2-dnf-plugin-local %files -n python2-dnf-plugin-local
%config(noreplace) %{_sysconfdir}/dnf/plugins/local.conf %config(noreplace) %{_sysconfdir}/dnf/plugins/local.conf
@ -754,8 +743,6 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/
%{_mandir}/man8/dnf-post-transaction-actions.* %{_mandir}/man8/dnf-post-transaction-actions.*
%endif %endif
%if 0%{?rhel} == 0
%if %{with python2} %if %{with python2}
%files -n python2-dnf-plugin-show-leaves %files -n python2-dnf-plugin-show-leaves
%{python2_sitelib}/dnf-plugins/show_leaves.* %{python2_sitelib}/dnf-plugins/show_leaves.*
@ -769,18 +756,6 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/
%{_mandir}/man8/dnf-show-leaves.* %{_mandir}/man8/dnf-show-leaves.*
%endif %endif
%else
%exclude %{_mandir}/man8/dnf-show-leaves.*
%if %{with python2}
%exclude %{python2_sitelib}/dnf-plugins/show_leaves.*
%endif
%if %{with python3}
%exclude %{python3_sitelib}/dnf-plugins/show_leaves.*
%exclude %{python3_sitelib}/dnf-plugins/__pycache__/show_leaves.*
%endif
%endif
# endif 0%%{?rhel} == 0
%if %{with python2} %if %{with python2}
%files -n python2-dnf-plugin-versionlock %files -n python2-dnf-plugin-versionlock
%config(noreplace) %{_sysconfdir}/dnf/plugins/versionlock.conf %config(noreplace) %{_sysconfdir}/dnf/plugins/versionlock.conf
@ -820,6 +795,13 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/
%endif %endif
%changelog %changelog
* Mon May 15 2023 Jaroslav Rohel <jrohel@redhat.com> - 4.3.0-6
- Fix boot time derivation for systems with no rtc (RhBug:2166444,2182157)
- system-upgrade: Add --poweroff option to reboot subcommand (RhBug:2157844)
- Doc update for reposync (RhBug:2132383,2182004)
- reposync: Implement --safe-write-path option (RhBug:1898089,2203766)
- Enable the leaves and show-leaves DNF plugins (RhBug:2134638)
* Wed Mar 15 2023 Marek Blaha <mblaha@redhat.com> - 4.3.0-5 * Wed Mar 15 2023 Marek Blaha <mblaha@redhat.com> - 4.3.0-5
- Update translations - Update translations