diff options
Diffstat (limited to 'dnf5madbbase.py')
-rw-r--r-- | dnf5madbbase.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/dnf5madbbase.py b/dnf5madbbase.py new file mode 100644 index 0000000..e3f0859 --- /dev/null +++ b/dnf5madbbase.py @@ -0,0 +1,167 @@ +import libdnf5 +import os +from datetime import datetime, timedelta +from libdnf5.common import QueryCmp_GLOB as GLOB +import config + + +class Dnf5MadbBase(): + + def __init__(self, release, arch, root, refresh=False): + + self.release = release + self.arch = arch + self.root = root + + # Create a new Base object + self._base = libdnf5.base.Base() + self._base_config = self._base.get_config() + self._base_config.installroot = root + # https://github.com/rpm-software-management/dnf5/issues/412#issuecomment-1493782078 + self._base_config.optional_metadata_types = ['filelists', 'other'] + self._base.config_file_path = os.path.join(root, "dnf/dnf.conf") + self._base.load_config() + vars = self._base.get_vars().get() + vars.set('releasever', release) + vars.set('arch', arch) + self._base_config.logdir = os.path.join(config.LOG_PATH) + self._base_config.cachedir = os.path.join(root, "dnf", "cache") + self._base_config.reposdir = os.path.join(root, "dnf", "etc","distro.repos.d") + log_router = self._base.get_logger() + logger = libdnf5.logger.create_file_logger(self._base) + log_router.add_logger(logger) + self._base_config.module_platform_id = f"Mageia:{release}" + self._base_config.metadata_expire = 20 if refresh else -1 + self._base.setup() + self._repo_sack = self._base.get_repo_sack() + repos = {} + for section in ("core", "nonfree", "tainted"): + for cl in ("backports", "backports_testing", "release", "updates", "updates_testing"): + repo_name = f"{release}-{arch}-{section}-{cl}" + repo_srpms_name = f"{release}-SRPMS-{section}-{cl}" + repos[repo_name] = self._repo_sack.create_repo(repo_name) + repos[repo_name].get_config().baseurl = os.path.join(config.MIRROR_URL, release, arch, "media", section, cl) + repos[repo_name].get_config().name = f"{config.DISTRIBUTION[release]} {arch} {section.capitalize()} {cl.capitalize()}" + repos[repo_srpms_name] = self._repo_sack.create_repo(repo_srpms_name) + repos[repo_srpms_name].get_config().baseurl = os.path.join(config.MIRROR_URL, release, "SRPMS", section, cl) + repos[repo_srpms_name].get_config().name = f"{config.DISTRIBUTION[release]} SRPMS {section.capitalize()} {cl.capitalize()}" + self._repo_sack.update_and_load_enabled_repos(False) + + + def search_name(self, values, graphical=False, repo=None): + """Search in a list of package attributes for a list of keys. + + :param values: the values to match + :params graphical: boolean, filter on *.desktop files in /usr/share/applications + :param repo: name of the repository to search in. Accept wildcards. + :return: a list of package objects + """ + query = libdnf5.rpm.PackageQuery(self._base) + #query.filter_arch([self.arch, "noarch"]) + query.filter_name(values, GLOB) + if graphical: + query.filter_file(["/usr/share/applications/*.desktop"], GLOB) + if repo: + query.filter_repo_id([repo], GLOB) + return query + + def search_nevra(self, values, graphical=False, repo=None): + """Search in a list of package attributes for a list of keys. + + :param values: the values to match + :params graphical: boolean, filter on *.desktop files in /usr/share/applications + :param repo: name of the repository to search in. Accept wildcards. + :return: a list of package objects + """ + query = libdnf5.rpm.PackageQuery(self._base) + #query.filter_arch([self.arch, "noarch"]) + query.filter_nevra(values, GLOB) + if graphical: + query.filter_file(["/usr/share/applications/*.desktop"], GLOB) + if repo: + query.filter_repo_id([repo], GLOB) + return query + + def search_in_group(self, value, graphical=False, repo=None): + """Search a list of package in a group. + + :param values: the values to match + :return: a list of package objects + """ + query = libdnf5.rpm.PackageQuery(self._base) + query.filter_arch([self.arch, "noarch"]) + if graphical and graphical == "1": + query.filter_file(["/usr/share/applications/*.desktop"], GLOB) + if repo: + query.filter_repo_id([repo]) + return [rpm for rpm in query if rpm.get_group().startswith(value)] + + def search_updates(self, backports=False, last=False, testing=True, graphical=False): + query = libdnf5.rpm.PackageQuery(self._base) + query.filter_arch([self.arch, "noarch"]) + if backports: + repo = "*backports" + days = config.RECENT_BACKPORTS_DURATION + else: + repo = "*updates" + days = config.RECENT_UPDATES_DURATION + if testing: + repo += "_testing" + query.filter_repo_id([repo], GLOB) + if graphical: + query.filter_file(["/usr/share/applications/*.desktop"], GLOB) + if last: + query.filter_recent(int((datetime.now() - timedelta(days=days)).timestamp())) + return query + + def search_by_sources(self, values, repo=None): + query = libdnf5.rpm.PackageQuery(self._base) + query.filter_arch([self.arch, "noarch"]) + if repo: + query.filter_repo_id([repo], GLOB) + query.filter_sourcerpm(values, GLOB) + return query + + def provides_requires(self, rpm_list): + query = libdnf5.rpm.PackageQuery(self._base) + query.filter_arch([self.arch, "noarch"]) + query.filter_repo_id([self.release + "*"], GLOB) + query.filter_provides(rpm_list) + return query + + def search_provides(self, rpm_list): + query = libdnf5.rpm.PackageQuery(self._base) + query.filter_arch([self.arch, "noarch"]) + query.filter_repo_id([self.release + "*"], GLOB) + query.filter_provides(rpm_list) + return query + + def search(self, search_type, search_list, graphical=False, repo=""): + query = libdnf5.rpm.PackageQuery(self._base) + query.filter_arch([self.arch, "noarch"]) + if repo == "": + query.filter_repo_id([self.release + "*"], GLOB) + else: + query.filter_repo_id([repo], GLOB) + #search_list = self.search_name(rpm_list) + if search_type == "requires": + query.filter_requires(search_list) + elif search_type == "recommends": + query.filter_recommends(search_list) + elif search_type == "suggests": + query.filter_suggests(search_list) + elif search_type == "supplements": + query.filter_supplements(search_list) + elif search_type == "provides": + query.filter_provides(search_list) + else: + query.filter_name(search_list, GLOB) + if graphical: + query.filter_file(["/usr/share/applications/*.desktop"], GLOB) + return query + + + def repo_enabled(self): + query = libdnf5.repo.RepoQuery(self._base) + query.filter_enabled(True) + return query |