Skip to content

Commit 7f559d3

Browse files
committed
Implement support for DNF5
Fix #215
1 parent ff8fc92 commit 7f559d3

File tree

3 files changed

+86
-2
lines changed

3 files changed

+86
-2
lines changed

tracer.spec

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,18 @@ BuildRequires: python3-dbus
104104
BuildRequires: python3-rpm
105105
BuildRequires: python3-distro
106106
BuildRequires: python3-setuptools
107+
%if 0%{?fedora}
108+
BuildRequires: python3-libdnf5
109+
%endif
107110
Requires: python3-rpm
108111
Requires: python3-psutil
109112
Requires: python3-dbus
110113
Requires: python3-six
111114
Requires: python3-distro
112115
Requires: %{name}-common = %{version}-%{release}
116+
%if 0%{?fedora}
117+
Requires: python3-libdnf5
118+
%endif
113119
%if %{with suggest}
114120
Suggests: python3-argcomplete
115121
%else

tracer/packageManagers/dnf.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import subprocess
2727
from tracer.packageManagers.rpm import Rpm
28+
from tracer.resources.package import Package
29+
from tracer.resources.collections import PackagesCollection
2830

2931
class Dnf(Rpm):
3032

@@ -55,3 +57,69 @@ def package_files(self, pkg_name):
5557
process = subprocess.Popen(["dnf", "repoquery", "-q", "-l", pkg_name], stdout=subprocess.PIPE)
5658
out = process.communicate()[0]
5759
return out.decode().split("\n")
60+
61+
62+
class FakeDnf5(Dnf):
63+
def packages_newer_than(self, unix_time):
64+
return []
65+
66+
def package_files(self, pkg_name):
67+
return []
68+
69+
70+
class Dnf5(Dnf):
71+
def __new__(cls, *args, **kwargs):
72+
"""
73+
We are going to enable DNF5 on all Fedora, EPEL, Mageia, openSUSE,
74+
etc systems and not all of them may have DNF5 (yet).
75+
"""
76+
try:
77+
import libdnf5
78+
return super().__new__(cls)
79+
except ImportError:
80+
return FakeDnf5(*args, **kwargs)
81+
82+
def packages_newer_than(self, unix_time):
83+
import libdnf5
84+
base = libdnf5.base.Base()
85+
base.setup()
86+
87+
# Package names as a keys and timestamps as values
88+
packages = {}
89+
90+
history = base.get_transaction_history()
91+
for transaction in history.list_all_transactions():
92+
if transaction.get_dt_start() < unix_time:
93+
continue
94+
for package in transaction.get_packages():
95+
packages[package.get_name()] = transaction.get_dt_start()
96+
97+
collection = PackagesCollection()
98+
for name, timestamp in packages.items():
99+
collection.append(Package(name, timestamp))
100+
101+
return collection
102+
103+
def package_files(self, pkg_name):
104+
if not self.opts.get("erased"):
105+
return super(Dnf, self).package_files(pkg_name)
106+
107+
import libdnf5
108+
base = libdnf5.base.Base()
109+
base.setup()
110+
111+
repo_sack = base.get_repo_sack()
112+
if hasattr(repo_sack, "load_repos"):
113+
# On F41+, this is what should be done
114+
repo_sack.load_repos()
115+
else:
116+
# On F40 there is only python3-libdnf5-5.1.17 so we have to use
117+
# this now-deprecated function
118+
repo_sack.update_and_load_enabled_repos(True)
119+
120+
query = libdnf5.rpm.PackageQuery(base)
121+
query.filter_name([pkg_name])
122+
paths = []
123+
for pkg in query:
124+
paths.extend(pkg.get_files())
125+
return paths

tracer/resources/system.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,26 +76,36 @@ def get_instance(pair):
7676
"gentoo": [("tracer.packageManagers.portage", "Portage")],
7777
"debian": [("tracer.packageManagers.dpkg", "Dpkg")],
7878
"rhel": [
79+
("tracer.packageManagers.dnf", "Dnf5"),
7980
("tracer.packageManagers.dnf", "Dnf"),
8081
("tracer.packageManagers.yum", "Yum"),
8182
],
8283
"centos": [
84+
("tracer.packageManagers.dnf", "Dnf5"),
8385
("tracer.packageManagers.dnf", "Dnf"),
8486
("tracer.packageManagers.yum", "Yum"),
8587
],
8688
"centos-7": [("tracer.packageManagers.yum", "Yum")],
8789
"ol": [
90+
("tracer.packageManagers.dnf", "Dnf5"),
8891
("tracer.packageManagers.dnf", "Dnf"),
8992
("tracer.packageManagers.yum", "Yum"),
9093
],
91-
"mageia": [("tracer.packageManagers.dnf", "Dnf")],
94+
"mageia": [
95+
("tracer.packageManagers.dnf", "Dnf5"),
96+
("tracer.packageManagers.dnf", "Dnf"),
97+
],
9298
"arch": [("tracer.packageManagers.alpm", "Alpm")],
9399
"archarm": [("tracer.packageManagers.alpm", "Alpm")],
94100
"fedora": [
101+
("tracer.packageManagers.dnf", "Dnf5"),
95102
("tracer.packageManagers.dnf", "Dnf"),
96103
("tracer.packageManagers.yum", "Yum"),
97104
],
98-
"suse": [("tracer.packageManagers.dnf", "Dnf")],
105+
"suse": [
106+
("tracer.packageManagers.dnf", "Dnf5"),
107+
("tracer.packageManagers.dnf", "Dnf"),
108+
],
99109
}
100110

101111
distribution = System.distribution()

0 commit comments

Comments
 (0)