From 3cb5a62c08d89e5c4d6e1900ff302a7b6127d006 Mon Sep 17 00:00:00 2001 From: Nicola Sella Date: Wed, 31 May 2023 14:27:53 +0200 Subject: [PATCH] Backport patch "Add fix and test assertion" Resolves: rhbz#2122587 --- ...-assertion-for-no-systemd-unit-exist.patch | 88 +++++++++++++++++++ dnf-plugins-core.spec | 6 +- 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 0033-Add-fix-and-test-assertion-for-no-systemd-unit-exist.patch diff --git a/0033-Add-fix-and-test-assertion-for-no-systemd-unit-exist.patch b/0033-Add-fix-and-test-assertion-for-no-systemd-unit-exist.patch new file mode 100644 index 0000000..7439956 --- /dev/null +++ b/0033-Add-fix-and-test-assertion-for-no-systemd-unit-exist.patch @@ -0,0 +1,88 @@ +From b086bfe09cf0eec67ea830e0e0f3482c6b6b2aa9 Mon Sep 17 00:00:00 2001 +From: Andy Baugh +Date: Fri, 28 Apr 2023 10:52:16 -0500 +Subject: [PATCH] Add fix and test assertion for "no systemd unit exists for + pid" + += changelog = +msg: Catch exception in needs-restarting.py when no systemd unit exists for pid +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2122587 +related: None +--- + plugins/needs_restarting.py | 18 ++++++++++++++---- + tests/test_needs_restarting.py | 15 +++++++++++++-- + 2 files changed, 27 insertions(+), 6 deletions(-) + +diff --git a/plugins/needs_restarting.py b/plugins/needs_restarting.py +index 03831fa..8dbc965 100644 +--- a/plugins/needs_restarting.py ++++ b/plugins/needs_restarting.py +@@ -138,10 +138,20 @@ def get_service_dbus(pid): + systemd_manager_object, + 'org.freedesktop.systemd1.Manager' + ) +- service_proxy = bus.get_object( +- 'org.freedesktop.systemd1', +- systemd_manager_interface.GetUnitByPID(pid) +- ) ++ service_proxy = None ++ try: ++ service_proxy = bus.get_object( ++ 'org.freedesktop.systemd1', ++ systemd_manager_interface.GetUnitByPID(pid) ++ ) ++ except dbus.DBusException as e: ++ # There is no unit for the pid. Usually error is 'NoUnitForPid'. ++ # Considering what we do at the bottom (just return if not service) ++ # Then there's really no reason to exit here on that exception. ++ # Log what's happened then move on. ++ msg = str(e) ++ logger.warning("Failed to get systemd unit for PID {}: {}".format(pid, msg)) ++ return + service_properties = dbus.Interface( + service_proxy, dbus_interface="org.freedesktop.DBus.Properties") + name = service_properties.Get( +diff --git a/tests/test_needs_restarting.py b/tests/test_needs_restarting.py +index 0ad70a5..7b629b4 100644 +--- a/tests/test_needs_restarting.py ++++ b/tests/test_needs_restarting.py +@@ -20,6 +20,8 @@ from __future__ import absolute_import + from __future__ import print_function + from __future__ import unicode_literals + ++from unittest.mock import patch, Mock ++import dbus + import needs_restarting + import tests.support + +@@ -29,8 +31,6 @@ MM_FILE = '7fc4e1168000-7fc4e1169000 rw-s 1096dd000 00:05 7749' \ + ' /dev/dri/card0' + SO_FILE = '30efe06000-30efe07000 r--p 00006000 08:02 139936' \ + ' /usr/lib64/libSM.so.6.0.1' +- +- + class NeedsRestartingTest(tests.support.TestCase): + def test_smap2opened_file(self): + func = needs_restarting.smap2opened_file +@@ -46,6 +46,17 @@ class NeedsRestartingTest(tests.support.TestCase): + self.assertTrue(ofile.deleted) + self.assertEqual(ofile.name, '/usr/lib64/libXfont.so.1.4.1;5408628d') + ++ def test_get_service_dbus_nounitforpid(self): ++ func = needs_restarting.get_service_dbus ++ # So, This is gonna look kinda screwy unless you are aware of what ++ # this proxies interface is actually doing. The GetUnitByPid function ++ # is normally "dynamically" defined by the get_dbus_method at runtime. ++ # As such there's no actual way to mock it out in any meaningful way ++ # without create=True. ++ with patch( "dbus.proxies.Interface.GetUnitByPID", create=True, side_effect=dbus.DBusException('org.freedesktop.systemd1.NoUnitForPID: PID 1234 does not belong to any loaded unit.') ), \ ++ patch( "dbus.SystemBus", return_value=Mock(spec=dbus.Bus) ), \ ++ patch( "dbus.bus.BusConnection.__new__", side_effect=dbus.DBusException("Never should hit this exception if mock above works")): ++ self.assertIsNone(func(1234)) + + class OpenedFileTest(tests.support.TestCase): + def test_presumed_name(self): +-- +2.40.1 + diff --git a/dnf-plugins-core.spec b/dnf-plugins-core.spec index a4c24dd..193e7d4 100644 --- a/dnf-plugins-core.spec +++ b/dnf-plugins-core.spec @@ -34,7 +34,7 @@ Name: dnf-plugins-core Version: 4.0.21 -Release: 21%{?dist} +Release: 22%{?dist} Summary: Core Plugins for DNF License: GPLv2+ URL: https://github.com/rpm-software-management/dnf-plugins-core @@ -71,6 +71,7 @@ Patch29: 0029-Update-translations.patch Patch30: 0030-versionlock-Use-only-most-specif-NEVRA-RhBug-1961217.patch Patch31: 0031-Fix-boot-time-derivation-for-systems-with-no-rtc.patch Patch32: 0032-Doc-update-for-reposync-RhBug-2132383-2182004.patch +Patch33: 0033-Add-fix-and-test-assertion-for-no-systemd-unit-exist.patch BuildArch: noarch @@ -847,6 +848,9 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/ %endif %changelog +* Wed May 31 2023 Nicola Sella - 4.0.21-22 +- Add fix and test assertion for "no systemd unit exists for pid" + * Fri May 19 2023 Jaroslav Rohel - 4.0.21-21 - Remove patch: "reposync: Implement --safe-write-path option (RhBug:1898089,2203766)" (RhBug:2208444)