"""
Builds out filesystem trees/data based on the object tree.
This is the code behind 'cobbler sync'.
"""
# SPDX-License-Identifier: GPL-2.0-or-later
# SPDX-FileCopyrightText: Copyright 2006-2009, Red Hat, Inc and Others
# SPDX-FileCopyrightText: Michael DeHaan <michael.dehaan AT gmail>
import pathlib
from typing import TYPE_CHECKING, List
from cobbler import templar, utils
if TYPE_CHECKING:
from cobbler.api import CobblerAPI
from cobbler.items.item import Item
[docs]class YumGen:
"""
TODO
"""
def __init__(self, api: "CobblerAPI"):
"""
Constructor
:param api: The main API instance which is used by the current running server.
"""
self.api = api
self.settings = api.settings()
self.templar = templar.Templar(self.api)
[docs] def get_yum_config(self, obj: "Item", is_profile: bool) -> str:
"""
Return one large yum repo config blob suitable for use by any target system that requests it.
:param obj: The object to generate the yumconfig for.
:param is_profile: If the requested object is a profile. (Parameter not used currently)
:return: The generated yumconfig or the errors.
"""
totalbuf = ""
blended = utils.blender(self.api, False, obj) # type: ignore
input_files: List[pathlib.Path] = []
# Tack on all the install source repos IF there is more than one. This is basically to support things like
# RHEL5 split trees if there is only one, then there is no need to do this.
included = {}
for repo in blended["source_repos"]:
filename = pathlib.Path(self.settings.webdir).joinpath(
"/".join(repo[0].split("/")[4:])
)
if filename not in included:
input_files.append(filename)
included[filename] = 1
for repo in blended["repos"]:
path = pathlib.Path(self.settings.webdir).joinpath(
"repo_mirror", repo, "config.repo"
)
if path not in included:
input_files.append(path)
included[path] = 1
for infile in input_files:
try:
with open(infile, encoding="UTF-8") as infile_h:
infile_data = infile_h.read()
except Exception:
# File does not exist and the user needs to run reposync before we will use this, Cobbler check will
# mention this problem
totalbuf += f"\n# error: could not read repo source: {infile}\n\n"
continue
outfile = None # disk output only
totalbuf += self.templar.render(infile_data, blended, outfile)
totalbuf += "\n\n"
return totalbuf