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
							
								
									9bf93d7154
								
							
						
					
					
						commit
						25394eefb7
					
				| @ -44,8 +44,8 @@ def configure(conf_file="/etc/lorax/composer.conf", root_dir="/", test_config=Fa | |||||||
|     conf.add_section("composer") |     conf.add_section("composer") | ||||||
|     conf.set("composer", "share_dir", os.path.realpath(joinpaths(root_dir, "/usr/share/lorax/"))) |     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", "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", "dnf_conf", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/dnf.conf"))) | ||||||
|     conf.set("composer", "yum_root", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/yum/root/"))) |     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", "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/"))) |     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 |     return conf | ||||||
| 
 | 
 | ||||||
| def make_yum_dirs(conf): | def make_dnf_dirs(conf): | ||||||
|     """Make any missing yum directories |     """Make any missing dnf directories | ||||||
| 
 | 
 | ||||||
|     :param conf: The configuration to use |     :param conf: The configuration to use | ||||||
|     :type conf: ComposerConfig |     :type conf: ComposerConfig | ||||||
|     :returns: None |     :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)) |         p_dir = os.path.dirname(conf.get("composer", p)) | ||||||
|         if not os.path.exists(p_dir): |         if not os.path.exists(p_dir): | ||||||
|             os.makedirs(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