[anaconda 2/3] Install selected ks repos to target (#1119867)
Brian C. Lane
bcl at redhat.com
Fri Jul 25 01:34:12 UTC 2014
This implements writing selected kickstart repos to the target system.
Add --install to the repo commands in the kickstart and the repo will be
written to /etc/yum.repos.d/<repoid>.repo
---
anaconda.spec.in | 2 +-
pyanaconda/kickstart.py | 4 +-
pyanaconda/packaging/yumpayload.py | 135 ++++++++++++++++++++++---------------
3 files changed, 82 insertions(+), 59 deletions(-)
diff --git a/anaconda.spec.in b/anaconda.spec.in
index 685886c..a24162b 100644
--- a/anaconda.spec.in
+++ b/anaconda.spec.in
@@ -21,7 +21,7 @@ Source0: %{name}-%{version}.tar.bz2
# Also update in AM_GNU_GETTEXT_VERSION in configure.ac
%define gettextver 0.18.3
%define intltoolver 0.31.2-3
-%define pykickstartver 1.99.57
+%define pykickstartver 1.99.58
%define yumver 3.4.3-91
%define dnfver 0.4.18
%define partedver 1.8.1
diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
index 09f2a88..bbcc5a9 100644
--- a/pyanaconda/kickstart.py
+++ b/pyanaconda/kickstart.py
@@ -1426,7 +1426,7 @@ class RaidData(commands.raid.F18_RaidData):
parents=request)
storage.createDevice(luksdev)
-class RepoData(commands.repo.F15_RepoData):
+class RepoData(commands.repo.F21_RepoData):
def __init__(self, *args, **kwargs):
""" Add enabled kwarg
@@ -1435,7 +1435,7 @@ class RepoData(commands.repo.F15_RepoData):
"""
self.enabled = kwargs.pop("enabled", True)
- commands.repo.F15_RepoData.__init__(self, *args, **kwargs)
+ commands.repo.F21_RepoData.__init__(self, *args, **kwargs)
class RootPw(commands.rootpw.F18_RootPw):
def execute(self, storage, ksdata, instClass, users):
diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index 6dca7f6..a36ef55 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -58,6 +58,7 @@ try:
# handler setup. We already set one up so we don't need it to run.
# yum may give us an API to fiddle this at a later time.
yum.logginglevels._added_handlers = True
+ from yum.Errors import RepoError, RepoMDError, GroupsError
except ImportError:
log.error("import of yum failed")
yum = None
@@ -299,6 +300,65 @@ reposdir=%s
root = self._yum.conf.installroot
self._yum.conf.cachedir = self._yum.conf.cachedir[len(root):]
+ def _writeYumRepo(self, repo, repo_path):
+ """ Write a repo object to a yum repo.conf file
+
+ :param repo: Yum repository object
+ :param string repo_path: Path to write the repo to
+ :raises: PayloadSetupError if the repo doesn't have a url
+ """
+ with open(repo_path, "w") as f:
+ f.write("[%s]\n" % repo.id)
+ f.write("name=%s\n" % repo.id)
+ if self.isRepoEnabled(repo.id):
+ f.write("enabled=1\n")
+ else:
+ f.write("enabled=0\n")
+
+ if repo.mirrorlist:
+ f.write("mirrorlist=%s\n" % repo.mirrorlist)
+ elif repo.metalink:
+ f.write("metalink=%s\n" % repo.metalink)
+ elif repo.baseurl:
+ f.write("baseurl=%s\n" % repo.baseurl[0])
+ else:
+ f.close()
+ os.unlink(repo_path)
+ raise PayloadSetupError("repo %s has no baseurl, mirrorlist or metalink", repo.id)
+
+ # kickstart repo modifiers
+ ks_repo = self.getAddOnRepo(repo.id)
+ if ks_repo:
+ if ks_repo.noverifyssl:
+ f.write("sslverify=0\n")
+
+ if ks_repo.proxy:
+ try:
+ proxy = ProxyString(ks_repo.proxy)
+ f.write("proxy=%s\n" % (proxy.noauth_url,))
+ if proxy.username:
+ f.write("proxy_username=%s\n" % (proxy.username,))
+ if proxy.password:
+ f.write("proxy_password=%s\n" % (proxy.password,))
+ except ProxyStringError as e:
+ log.error("Failed to parse proxy for _writeInstallConfig %s: %s",
+ ks_repo.proxy, e)
+
+ if ks_repo.cost:
+ f.write("cost=%d\n" % ks_repo.cost)
+
+ if ks_repo.includepkgs:
+ f.write("includepkgs=%s\n"
+ % ",".join(ks_repo.includepkgs))
+
+ if ks_repo.excludepkgs:
+ f.write("exclude=%s\n"
+ % ",".join(ks_repo.excludepkgs))
+
+ if ks_repo.ignoregroups:
+ f.write("enablegroups=0\n")
+
+
def _writeInstallConfig(self):
""" Write out the yum config that will be used to install packages.
@@ -315,53 +375,10 @@ reposdir=%s
for repo in self._yum.repos.listEnabled():
cfg_path = "%s/%s.repo" % (self._repos_dir, repo.id)
log.debug("writing repository file %s for repository %s", cfg_path, repo.id)
- ks_repo = self.getAddOnRepo(repo.id)
- with open(cfg_path, "w") as f:
- f.write("[%s]\n" % repo.id)
- f.write("name=Install - %s\n" % repo.id)
- f.write("enabled=1\n")
- if repo.mirrorlist:
- f.write("mirrorlist=%s" % repo.mirrorlist)
- elif repo.metalink:
- f.write("metalink=%s" % repo.metalink)
- elif repo.baseurl:
- f.write("baseurl=%s\n" % repo.baseurl[0])
- else:
- log.error("repo %s has no baseurl, mirrorlist or metalink", repo.id)
- f.close()
- os.unlink(cfg_path)
- continue
-
- # kickstart repo modifiers
- if ks_repo:
- if ks_repo.noverifyssl:
- f.write("sslverify=0\n")
-
- if ks_repo.proxy:
- try:
- proxy = ProxyString(ks_repo.proxy)
- f.write("proxy=%s\n" % (proxy.noauth_url,))
- if proxy.username:
- f.write("proxy_username=%s\n" % (proxy.username,))
- if proxy.password:
- f.write("proxy_password=%s\n" % (proxy.password,))
- except ProxyStringError as e:
- log.error("Failed to parse proxy for _writeInstallConfig %s: %s",
- ks_repo.proxy, e)
-
- if ks_repo.cost:
- f.write("cost=%d\n" % ks_repo.cost)
-
- if ks_repo.includepkgs:
- f.write("includepkgs=%s\n"
- % ",".join(ks_repo.includepkgs))
-
- if ks_repo.excludepkgs:
- f.write("exclude=%s\n"
- % ",".join(ks_repo.excludepkgs))
-
- if ks_repo.ignoregroups:
- f.write("enablegroups=0\n")
+ try:
+ self._writeYumRepo(repo, cfg_path)
+ except PayloadSetupError as e:
+ log.error(e)
releasever = self._yum.conf.yumvar['releasever']
self._writeYumConfig()
@@ -455,8 +472,6 @@ reposdir=%s
def isRepoEnabled(self, repo_id):
""" Return True if repo is enabled. """
- from yum.Errors import RepoError
-
try:
return self.getRepo(repo_id).enabled
except RepoError:
@@ -722,8 +737,6 @@ reposdir=%s
def _getRepoMetadata(self, yumrepo):
""" Retrieve repo metadata if we don't already have it. """
- from yum.Errors import RepoError, RepoMDError
-
# And try to grab its metadata. We do this here so it can be done
# on a per-repo basis, so we can then get some finer grained error
# handling and recovery.
@@ -765,8 +778,6 @@ reposdir=%s
def _addYumRepo(self, name, baseurl, mirrorlist=None, proxyurl=None, **kwargs):
""" Add a yum repo to the YumBase instance. """
- from yum.Errors import RepoError
-
needsAdding = True
# First, delete any pre-existing repo with the same name.
@@ -999,7 +1010,6 @@ reposdir=%s
@property
def _yumGroups(self):
""" yum.comps.Comps instance. """
- from yum.Errors import RepoError, GroupsError
with _yum_lock:
if not self._groups:
if not self.needsNetwork or nm_is_connected():
@@ -1109,8 +1119,6 @@ reposdir=%s
###
@property
def packages(self):
- from yum.Errors import RepoError
-
with _yum_lock:
if not self._packages:
if self.needsNetwork and not nm_is_connected():
@@ -1489,6 +1497,21 @@ reposdir=%s
self.writeMultiLibConfig()
+ # Write selected kickstart repos to target system
+ for ks_repo in (ks for ks in (self.getAddOnRepo(r) for r in self.addOns) if ks.install):
+ try:
+ repo = self.getRepo(ks_repo.name)
+ if not repo:
+ continue
+ except RepoError:
+ continue
+ repo_path = iutil.getSysroot() + "/etc/yum.repos.d/%s.repo" % repo.id
+ try:
+ log.info("Writing %s.repo to target system.", repo.id)
+ self._writeYumRepo(repo, repo_path)
+ except PayloadSetupError as e:
+ log.error(e)
+
super(YumPayload, self).postInstall()
# Make sure yum is really done and gone and lets go of the yum.log
--
1.9.3
More information about the anaconda-patches
mailing list