From 63b473d4ba849f1f472b04da2557835d15090e71 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 30 Apr 2018 15:23:48 -0700 Subject: [PATCH] Convert lorax-composer yum base object to DNF This no longer uses the enabled configuration setting to select repos to use. It uses everything in the repo_dir, and if system repos have not been disabled it copies them into the repo_dir at startup, overwriting the previous copy. --- src/pylorax/api/config.py | 10 ++-- src/pylorax/api/dnfbase.py | 86 ++++++++++++++++++++++++++++ src/pylorax/api/yumbase.py | 113 ------------------------------------- 3 files changed, 91 insertions(+), 118 deletions(-) create mode 100644 src/pylorax/api/dnfbase.py delete mode 100644 src/pylorax/api/yumbase.py diff --git a/src/pylorax/api/config.py b/src/pylorax/api/config.py index b7ab36db..a27be4dd 100644 --- a/src/pylorax/api/config.py +++ b/src/pylorax/api/config.py @@ -44,8 +44,8 @@ def configure(conf_file="/etc/lorax/composer.conf", root_dir="/", test_config=Fa conf.add_section("composer") conf.set("composer", "share_dir", os.path.realpath(joinpaths(root_dir, "/usr/share/lorax/"))) conf.set("composer", "lib_dir", os.path.realpath(joinpaths(root_dir, "/var/lib/lorax/composer/"))) - conf.set("composer", "yum_conf", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/yum.conf"))) - conf.set("composer", "yum_root", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/yum/root/"))) + conf.set("composer", "dnf_conf", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/dnf.conf"))) + conf.set("composer", "dnf_root", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/dnf/root/"))) conf.set("composer", "repo_dir", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/repos.d/"))) conf.set("composer", "cache_dir", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/cache/"))) @@ -64,14 +64,14 @@ def configure(conf_file="/etc/lorax/composer.conf", root_dir="/", test_config=Fa return conf -def make_yum_dirs(conf): - """Make any missing yum directories +def make_dnf_dirs(conf): + """Make any missing dnf directories :param conf: The configuration to use :type conf: ComposerConfig :returns: None """ - for p in ["yum_conf", "repo_dir", "cache_dir", "yum_root"]: + for p in ["dnf_conf", "repo_dir", "cache_dir", "dnf_root"]: p_dir = os.path.dirname(conf.get("composer", p)) if not os.path.exists(p_dir): os.makedirs(p_dir) diff --git a/src/pylorax/api/dnfbase.py b/src/pylorax/api/dnfbase.py new file mode 100644 index 00000000..7392041c --- /dev/null +++ b/src/pylorax/api/dnfbase.py @@ -0,0 +1,86 @@ +# +# Copyright (C) 2017-2018 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# pylint: disable=bad-preconf-access + +import logging +log = logging.getLogger("lorax-composer") + +import dnf +import dnf.logging +from glob import glob +import os +import shutil + + +def get_base_object(conf): + """Get the DNF object with settings from the config file + + :param conf: configuration object + :type conf: ComposerParser + :returns: A DNF Base object + :rtype: dnf.Base + """ + cachedir = os.path.abspath(conf.get("composer", "cache_dir")) + dnfconf = os.path.abspath(conf.get("composer", "dnf_conf")) + dnfroot = os.path.abspath(conf.get("composer", "dnf_root")) + repodir = os.path.abspath(conf.get("composer", "repo_dir")) + + # Setup the config for the DNF Base object + dbo = dnf.Base() + dbc = dbo.conf +# TODO - Handle this +# dbc.logdir = logdir + dbc.installroot = dnfroot + if not os.path.isdir(dnfroot): + os.makedirs(dnfroot) + + dbc.cachedir = cachedir + dbc.reposdir = [repodir] + dbc.install_weak_deps = False + dbc.prepend_installroot('persistdir') + dbc.tsflags.append('nodocs') + + if conf.get_default("dnf", "proxy", None): + dbc.proxy = conf.get("dnf", "proxy") + + if conf.has_option("dnf", "sslverify") and not conf.getboolean("dnf", "sslverify"): + dbc.sslverify = False + + _releasever = conf.get_default("composer", "releasever", None) + if not _releasever: + # Use the releasever of the host system + _releasever = dnf.rpm.detect_releasever("/") + log.info("releasever = %s", _releasever) + dbc.releasever = _releasever + + # write the dnf configuration file + with open(dnfconf, "w") as f: + f.write(dbc.dump()) + + # dnf needs the repos all in one directory, composer uses repodir for this + # if system repos are supposed to be used, copy them into repodir, overwriting any previous copies + if not conf.has_option("repos", "use_system_repos") or conf.getboolean("repos", "use_system_repos"): + for repo_file in glob("/etc/yum.repos.d/*.repo"): + shutil.copy2(repo_file, repodir) + dbo.read_all_repos() + + # Update the metadata from the enabled repos to speed up later operations + log.info("Updating repository metadata") + dbo.fill_sack(load_system_repo=False) + dbo.read_comps() + + return dbo diff --git a/src/pylorax/api/yumbase.py b/src/pylorax/api/yumbase.py deleted file mode 100644 index 9cc29aa8..00000000 --- a/src/pylorax/api/yumbase.py +++ /dev/null @@ -1,113 +0,0 @@ -# -# Copyright (C) 2017 Red Hat, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# pylint: disable=bad-preconf-access - -import logging -log = logging.getLogger("lorax-composer") - -import configparser -from fnmatch import fnmatchcase -from glob import glob -import os -import yum -# This is a hack to short circuit yum's internal logging -yum.logginglevels._added_handlers = True - -from pylorax.sysutils import joinpaths - -def get_base_object(conf): - """Get the Yum object with settings from the config file - - :param conf: configuration object - :type conf: ComposerParser - :returns: A Yum base object - :rtype: YumBase - """ - cachedir = os.path.abspath(conf.get("composer", "cache_dir")) - yumconf = os.path.abspath(conf.get("composer", "yum_conf")) - yumroot = os.path.abspath(conf.get("composer", "yum_root")) - repodir = os.path.abspath(conf.get("composer", "repo_dir")) - - c = configparser.ConfigParser() - - # add the main section - section = "main" - data = {"cachedir": cachedir, - "keepcache": 0, - "gpgcheck": 0, - "plugins": 0, - "assumeyes": 1, - "reposdir": "", - "tsflags": "nodocs"} - - if conf.get_default("yum", "proxy", None): - data["proxy"] = conf.get("yum", "proxy") - - if conf.has_option("yum", "sslverify") and not conf.getboolean("yum", "sslverify"): - data["sslverify"] = "0" - - c.add_section(section) - list(map(lambda key_value: c.set(section, key_value[0], key_value[1]), list(data.items()))) - - # write the yum configuration file - with open(yumconf, "w") as f: - c.write(f) - - # create the yum base object - yb = yum.YumBase() - - yb.preconf.fn = yumconf - - yb.preconf.root = yumroot - if not os.path.isdir(yb.preconf.root): - os.makedirs(yb.preconf.root) - - _releasever = conf.get_default("composer", "releasever", None) - if not _releasever: - distroverpkg = ['system-release(releasever)', 'redhat-release'] - # Use yum private function to guess the releasever - _releasever = yum.config._getsysver("/", distroverpkg) - log.info("releasever = %s", _releasever) - yb.preconf.releasever = _releasever - - # Turn on as much yum logging as we can - yb.preconf.debuglevel = 6 - yb.preconf.errorlevel = 6 - yb.logger.setLevel(logging.DEBUG) - yb.verbose_logger.setLevel(logging.DEBUG) - - # Gather up all the available repo files, add the ones matching "repos":"enabled" patterns - enabled_repos = conf.get("repos", "enabled").split(",") - repo_files = glob(joinpaths(repodir, "*.repo")) - if not conf.has_option("repos", "use_system_repos") or conf.getboolean("repos", "use_system_repos"): - repo_files.extend(glob("/etc/yum.repos.d/*.repo")) - - for repo_file in repo_files: - name = os.path.basename(repo_file)[:-5] - if any([fnmatchcase(name, pattern) for pattern in enabled_repos]): # pylint: disable=cell-var-from-loop - yb.getReposFromConfigFile(repo_file) - - # Update the metadata from the enabled repos to speed up later operations - log.info("Updating yum repository metadata") - for r in yb.repos.sort(): - r.metadata_expire = 0 - r.mdpolicy = "group:all" - yb.doRepoSetup() - yb.repos.doSetup() - yb.repos.populateSack(mdtype='all', cacheonly=1) - - return yb