[rhel7-branch 16/29] Install selected ks repos to target (#1119867)

bcl installerbot-noreply at redhat.com
Wed Jun 3 00:36:48 UTC 2015


From: "Brian C. Lane" <bcl at redhat.com>

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

Resolves: rhbz#1119867

(cherry picked from commit 349dc8fcfe7c83095a27d0bbf2a395423b73e2d6)

Related: rhbz#1196721
---
 pyanaconda/kickstart.py            |   4 +-
 pyanaconda/packaging/yumpayload.py | 135 ++++++++++++++++++++++---------------
 2 files changed, 81 insertions(+), 58 deletions(-)

diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
index 22b0b81..80199e6 100644
--- a/pyanaconda/kickstart.py
+++ b/pyanaconda/kickstart.py
@@ -1512,7 +1512,7 @@ def execute(self, storage, ksdata, instClass):
                                      parents=request)
             storage.createDevice(luksdev)
 
-class RepoData(commands.repo.F15_RepoData):
+class RepoData(commands.repo.RHEL7_RepoData):
     def __init__(self, *args, **kwargs):
         """ Add enabled kwarg
 
@@ -1521,7 +1521,7 @@ def __init__(self, *args, **kwargs):
         """
         self.enabled = kwargs.pop("enabled", True)
 
-        commands.repo.F15_RepoData.__init__(self, *args, **kwargs)
+        commands.repo.RHEL7_RepoData.__init__(self, *args, **kwargs)
 
 class ReqPart(commands.reqpart.RHEL7_ReqPart):
     def execute(self, storage, ksdata, instClass):
diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
index 37209de..34a5201 100644
--- a/pyanaconda/packaging/yumpayload.py
+++ b/pyanaconda/packaging/yumpayload.py
@@ -58,6 +58,7 @@
     # 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
@@ -86,6 +87,7 @@
 from pykickstart.constants import GROUP_ALL, GROUP_DEFAULT, KS_MISSING_IGNORE
 
 YUM_PLUGINS = ["fastestmirror", "langpacks"]
+YUM_REPOS_DIR = "/etc/yum.repos.d/"
 BASE_REPO_NAMES = [BASE_REPO_NAME] + PackagePayload.DEFAULT_REPOS
 
 import inspect
@@ -306,6 +308,64 @@ def _yumCacheDirHack(self):
             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.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 not ks_repo:
+                return
+
+            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 _writeYumRepo %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.
 
@@ -322,53 +382,10 @@ def _writeInstallConfig(self):
         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()
@@ -468,8 +485,6 @@ def getRepo(self, repo_id):
 
     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:
@@ -735,8 +750,6 @@ def _getAddons(self, baseurl, proxy_url, sslverify):
 
     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.
@@ -778,8 +791,6 @@ def _replaceVars(self, url):
 
     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.
@@ -1015,7 +1026,6 @@ def _yumGroups(self):
         if not self._setup:
             return []
 
-        from yum.Errors import RepoError, GroupsError
         with _yum_lock:
             if not self._groups:
                 if not self.needsNetwork or nm_is_connected():
@@ -1125,8 +1135,6 @@ def _deselectYumGroup(self, groupid):
     ###
     @property
     def packages(self):
-        from yum.Errors import RepoError
-
         with _yum_lock:
             if not self._packages:
                 if self.needsNetwork and not nm_is_connected():
@@ -1508,6 +1516,21 @@ def postInstall(self):
         self.writeMultiLibConfig()
         self._copyLangpacksConfigToTarget()
 
+        # 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() + YUM_REPOS_DIR + "%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


-- 
To view this commit on github, visit https://github.com/rhinstaller/anaconda/commit/5e0a25d2918a6ba2b3a089d0f816c6085d853a8e


More information about the anaconda-patches mailing list