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.
This commit is contained in:
parent
d31bea7bd3
commit
63b473d4ba
@ -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)
|
||||
|
86
src/pylorax/api/dnfbase.py
Normal file
86
src/pylorax/api/dnfbase.py
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# 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
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# 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
|
Loading…
Reference in New Issue
Block a user