diff options
Diffstat (limited to 'scripts/lib')
| -rw-r--r-- | scripts/lib/mic/kickstart/__init__.py | 763 | 
1 files changed, 0 insertions, 763 deletions
| diff --git a/scripts/lib/mic/kickstart/__init__.py b/scripts/lib/mic/kickstart/__init__.py index 11cdf63279..590bf4728f 100644 --- a/scripts/lib/mic/kickstart/__init__.py +++ b/scripts/lib/mic/kickstart/__init__.py @@ -34,54 +34,6 @@ from mic import msger  from mic.utils import errors, misc, runner, fs_related as fs  from custom_commands import wicboot, partition - -AUTH_URL_PTN = r"(?P<scheme>.*)://(?P<username>.*)(:?P<password>.*)?@(?P<url>.*)" - - -class PrepackageSection(kssections.Section): -    sectionOpen = "%prepackages" - -    def handleLine(self, line): -        if not self.handler: -            return - -        (h, s, t) = line.partition('#') -        line = h.rstrip() - -        self.handler.prepackages.add([line]) - -    def handleHeader(self, lineno, args): -        kssections.Section.handleHeader(self, lineno, args) - -class AttachmentSection(kssections.Section): -    sectionOpen = "%attachment" - -    def handleLine(self, line): -        if not self.handler: -            return - -        (h, s, t) = line.partition('#') -        line = h.rstrip() - -        self.handler.attachment.add([line]) - -    def handleHeader(self, lineno, args): -        kssections.Section.handleHeader(self, lineno, args) - -def apply_wrapper(func): -    def wrapper(*kargs, **kwargs): -        try: -            func(*kargs, **kwargs) -        except (OSError, IOError, errors.KsError), err: -            cfgcls = kargs[0].__class__.__name__ -            if msger.ask("Failed to apply %s, skip and continue?" % cfgcls): -                msger.warning("%s" % err) -                pass -            else: -                # just throw out the exception -                raise -    return wrapper -  def read_kickstart(path):      """Parse a kickstart file and return a KickstartParser instance. @@ -105,12 +57,8 @@ def read_kickstart(path):      class KSHandlers(superclass):          def __init__(self):              superclass.__init__(self, mapping=commandMap[using_version]) -            self.prepackages = ksparser.Packages() -            self.attachment = ksparser.Packages()      ks = ksparser.KickstartParser(KSHandlers(), errorsAreFatal=False) -    ks.registerSection(PrepackageSection(ks.handler)) -    ks.registerSection(AttachmentSection(ks.handler))      try:          ks.readKickstart(path) @@ -123,526 +71,6 @@ def read_kickstart(path):      return ks -class KickstartConfig(object): -    """A base class for applying kickstart configurations to a system.""" -    def __init__(self, instroot): -        self.instroot = instroot - -    def path(self, subpath): -        return self.instroot + subpath - -    def _check_sysconfig(self): -        if not os.path.exists(self.path("/etc/sysconfig")): -            fs.makedirs(self.path("/etc/sysconfig")) - -    def chroot(self): -        os.chroot(self.instroot) -        os.chdir("/") - -    def call(self, args): -        if not os.path.exists("%s/%s" %(self.instroot, args[0])): -            raise errors.KsError("Can't find %s in chroot" % args[0]) -        subprocess.call(args, preexec_fn = self.chroot) - -    def apply(self): -        pass - -class LanguageConfig(KickstartConfig): -    """A class to apply a kickstart language configuration to a system.""" -    @apply_wrapper -    def apply(self, kslang): -        self._check_sysconfig() -        if kslang.lang: -            f = open(self.path("/etc/sysconfig/i18n"), "w+") -            f.write("LANG=\"" + kslang.lang + "\"\n") -            f.close() - -class KeyboardConfig(KickstartConfig): -    """A class to apply a kickstart keyboard configuration to a system.""" -    @apply_wrapper -    def apply(self, kskeyboard): -        # -        # FIXME: -        #   should this impact the X keyboard config too? -        #   or do we want to make X be able to do this mapping? -        # -        #k = rhpl.keyboard.Keyboard() -        #if kskeyboard.keyboard: -        #   k.set(kskeyboard.keyboard) -        #k.write(self.instroot) -        pass - -class TimezoneConfig(KickstartConfig): -    """A class to apply a kickstart timezone configuration to a system.""" -    @apply_wrapper -    def apply(self, kstimezone): -        self._check_sysconfig() -        tz = kstimezone.timezone or "America/New_York" -        utc = str(kstimezone.isUtc) - -        f = open(self.path("/etc/sysconfig/clock"), "w+") -        f.write("ZONE=\"" + tz + "\"\n") -        f.write("UTC=" + utc + "\n") -        f.close() -        tz_source = "/usr/share/zoneinfo/%s" % (tz) -        tz_dest = "/etc/localtime" -        try: -            cpcmd = fs.find_binary_inchroot('cp', self.instroot) -            if cpcmd: -                self.call([cpcmd, "-f", tz_source, tz_dest]) -            else: -                cpcmd = fs.find_binary_path('cp') -                subprocess.call([cpcmd, "-f", -                                 self.path(tz_source), -                                 self.path(tz_dest)]) -        except (IOError, OSError), (errno, msg): -            raise errors.KsError("Timezone setting error: %s" % msg) - -class AuthConfig(KickstartConfig): -    """A class to apply a kickstart authconfig configuration to a system.""" -    @apply_wrapper -    def apply(self, ksauthconfig): -        auth = ksauthconfig.authconfig or "--useshadow --enablemd5" -        args = ["/usr/share/authconfig/authconfig.py", "--update", "--nostart"] -        self.call(args + auth.split()) - -class FirewallConfig(KickstartConfig): -    """A class to apply a kickstart firewall configuration to a system.""" -    @apply_wrapper -    def apply(self, ksfirewall): -        # -        # FIXME: should handle the rest of the options -        # -        if not os.path.exists(self.path("/usr/sbin/lokkit")): -            return -        if ksfirewall.enabled: -            status = "--enabled" -        else: -            status = "--disabled" - -        self.call(["/usr/sbin/lokkit", -                   "-f", "--quiet", "--nostart", status]) - -class RootPasswordConfig(KickstartConfig): -    """A class to apply a kickstart root password configuration to a system.""" -    def unset(self): -        self.call(["/usr/bin/passwd", "-d", "root"]) - -    def set_encrypted(self, password): -        self.call(["/usr/sbin/usermod", "-p", password, "root"]) - -    def set_unencrypted(self, password): -        for p in ("/bin/echo", "/usr/sbin/chpasswd"): -            if not os.path.exists("%s/%s" %(self.instroot, p)): -                raise errors.KsError("Unable to set unencrypted password due " -                                     "to lack of %s" % p) - -        p1 = subprocess.Popen(["/bin/echo", "root:%s" %password], -                              stdout = subprocess.PIPE, -                              preexec_fn = self.chroot) -        p2 = subprocess.Popen(["/usr/sbin/chpasswd", "-m"], -                              stdin = p1.stdout, -                              stdout = subprocess.PIPE, -                              preexec_fn = self.chroot) -        p2.communicate() - -    @apply_wrapper -    def apply(self, ksrootpw): -        if ksrootpw.isCrypted: -            self.set_encrypted(ksrootpw.password) -        elif ksrootpw.password != "": -            self.set_unencrypted(ksrootpw.password) -        else: -            self.unset() - -class UserConfig(KickstartConfig): -    def set_empty_passwd(self, user): -        self.call(["/usr/bin/passwd", "-d", user]) - -    def set_encrypted_passwd(self, user, password): -        self.call(["/usr/sbin/usermod", "-p", "%s" % password, user]) - -    def set_unencrypted_passwd(self, user, password): -        for p in ("/bin/echo", "/usr/sbin/chpasswd"): -            if not os.path.exists("%s/%s" %(self.instroot, p)): -                raise errors.KsError("Unable to set unencrypted password due " -                                     "to lack of %s" % p) - -        p1 = subprocess.Popen(["/bin/echo", "%s:%s" %(user, password)], -                              stdout = subprocess.PIPE, -                              preexec_fn = self.chroot) -        p2 = subprocess.Popen(["/usr/sbin/chpasswd", "-m"], -                              stdin = p1.stdout, -                              stdout = subprocess.PIPE, -                              preexec_fn = self.chroot) -        p2.communicate() - -    def addUser(self, userconfig): -        args = [ "/usr/sbin/useradd" ] -        if userconfig.groups: -            args += [ "--groups", string.join(userconfig.groups, ",") ] -        if userconfig.name: -            args += [ "-m"] -            args += [ "-d", "/home/%s" % userconfig.name  ] -            args.append(userconfig.name) -            try: -                dev_null = os.open("/dev/null", os.O_WRONLY) -                msger.debug('adding user with %s' % args) -                subprocess.call(args, -                                 stdout = dev_null, -                                 stderr = dev_null, -                                 preexec_fn = self.chroot) -                os.close(dev_null) -            except: -                msger.warning('Cannot add user using "useradd"') - -            if userconfig.password not in (None, ""): -                if userconfig.isCrypted: -                    self.set_encrypted_passwd(userconfig.name, -                                              userconfig.password) -                else: -                    self.set_unencrypted_passwd(userconfig.name, -                                                userconfig.password) -            else: -                self.set_empty_passwd(userconfig.name) -        else: -            raise errors.KsError("Invalid kickstart command: %s" \ -                                 % userconfig.__str__()) - -    @apply_wrapper -    def apply(self, user): -        for userconfig in user.userList: -            self.addUser(userconfig) - -class ServicesConfig(KickstartConfig): -    """A class to apply a kickstart services configuration to a system.""" -    @apply_wrapper -    def apply(self, ksservices): -        if not os.path.exists(self.path("/sbin/chkconfig")): -            return -        for s in ksservices.enabled: -            self.call(["/sbin/chkconfig", s, "on"]) -        for s in ksservices.disabled: -            self.call(["/sbin/chkconfig", s, "off"]) - -class XConfig(KickstartConfig): -    """A class to apply a kickstart X configuration to a system.""" -    @apply_wrapper -    def apply(self, ksxconfig): -        if ksxconfig.startX and os.path.exists(self.path("/etc/inittab")): -            f = open(self.path("/etc/inittab"), "rw+") -            buf = f.read() -            buf = buf.replace("id:3:initdefault", "id:5:initdefault") -            f.seek(0) -            f.write(buf) -            f.close() -        if ksxconfig.defaultdesktop: -            self._check_sysconfig() -            f = open(self.path("/etc/sysconfig/desktop"), "w") -            f.write("DESKTOP="+ksxconfig.defaultdesktop+"\n") -            f.close() - -class DesktopConfig(KickstartConfig): -    """A class to apply a kickstart desktop configuration to a system.""" -    @apply_wrapper -    def apply(self, ksdesktop): -        if ksdesktop.defaultdesktop: -            self._check_sysconfig() -            f = open(self.path("/etc/sysconfig/desktop"), "w") -            f.write("DESKTOP="+ksdesktop.defaultdesktop+"\n") -            f.close() -            if os.path.exists(self.path("/etc/gdm/custom.conf")): -                f = open(self.path("/etc/skel/.dmrc"), "w") -                f.write("[Desktop]\n") -                f.write("Session="+ksdesktop.defaultdesktop.lower()+"\n") -                f.close() -        if ksdesktop.session: -            if os.path.exists(self.path("/etc/sysconfig/uxlaunch")): -                f = open(self.path("/etc/sysconfig/uxlaunch"), "a+") -                f.write("session="+ksdesktop.session.lower()+"\n") -                f.close() -        if ksdesktop.autologinuser: -            self._check_sysconfig() -            f = open(self.path("/etc/sysconfig/desktop"), "a+") -            f.write("AUTOLOGIN_USER=" + ksdesktop.autologinuser + "\n") -            f.close() -            if os.path.exists(self.path("/etc/gdm/custom.conf")): -                f = open(self.path("/etc/gdm/custom.conf"), "w") -                f.write("[daemon]\n") -                f.write("AutomaticLoginEnable=true\n") -                f.write("AutomaticLogin=" + ksdesktop.autologinuser + "\n") -                f.close() - -class MoblinRepoConfig(KickstartConfig): -    """A class to apply a kickstart desktop configuration to a system.""" -    def __create_repo_section(self, repo, type, fd): -        baseurl = None -        mirrorlist = None -        reposuffix = {"base":"", "debuginfo":"-debuginfo", "source":"-source"} -        reponame = repo.name + reposuffix[type] -        if type == "base": -            if repo.baseurl: -                baseurl = repo.baseurl -            if repo.mirrorlist: -                mirrorlist = repo.mirrorlist - -        elif type == "debuginfo": -            if repo.baseurl: -                if repo.baseurl.endswith("/"): -                    baseurl = os.path.dirname(os.path.dirname(repo.baseurl)) -                else: -                    baseurl = os.path.dirname(repo.baseurl) -                baseurl += "/debug" - -            if repo.mirrorlist: -                variant = repo.mirrorlist[repo.mirrorlist.find("$"):] -                mirrorlist = repo.mirrorlist[0:repo.mirrorlist.find("$")] -                mirrorlist += "debug" + "-" + variant - -        elif type == "source": -            if repo.baseurl: -                if repo.baseurl.endswith("/"): -                    baseurl = os.path.dirname( -                                 os.path.dirname( -                                    os.path.dirname(repo.baseurl))) -                else: -                    baseurl = os.path.dirname(os.path.dirname(repo.baseurl)) -                baseurl += "/source" - -            if repo.mirrorlist: -                variant = repo.mirrorlist[repo.mirrorlist.find("$"):] -                mirrorlist = repo.mirrorlist[0:repo.mirrorlist.find("$")] -                mirrorlist += "source" + "-" + variant - -        fd.write("[" + reponame + "]\n") -        fd.write("name=" + reponame + "\n") -        fd.write("failovermethod=priority\n") -        if baseurl: -            auth_url = re.compile(AUTH_URL_PTN) -            m = auth_url.match(baseurl) -            if m: -                baseurl = "%s://%s" % (m.group('scheme'), m.group('url')) -            fd.write("baseurl=" + baseurl + "\n") -        if mirrorlist: -            fd.write("mirrorlist=" + mirrorlist + "\n") -        """ Skip saving proxy settings """ -        #if repo.proxy: -        #    fd.write("proxy=" + repo.proxy + "\n") -        #if repo.proxy_username: -        #    fd.write("proxy_username=" + repo.proxy_username + "\n") -        #if repo.proxy_password: -        #    fd.write("proxy_password=" + repo.proxy_password + "\n") -        if repo.gpgkey: -            fd.write("gpgkey=" + repo.gpgkey + "\n") -            fd.write("gpgcheck=1\n") -        else: -            fd.write("gpgcheck=0\n") -        if type == "source" or type == "debuginfo" or repo.disable: -            fd.write("enabled=0\n") -        else: -            fd.write("enabled=1\n") -        fd.write("\n") - -    def __create_repo_file(self, repo, repodir): -        fs.makedirs(self.path(repodir)) -        f = open(self.path(repodir + "/" + repo.name + ".repo"), "w") -        self.__create_repo_section(repo, "base", f) -        if repo.debuginfo: -            self.__create_repo_section(repo, "debuginfo", f) -        if repo.source: -            self.__create_repo_section(repo, "source", f) -        f.close() - -    @apply_wrapper -    def apply(self, ksrepo, repodata, repourl): -        for repo in ksrepo.repoList: -            if repo.name in repourl: -                repo.baseurl = repourl[repo.name] -            if repo.save: -                #self.__create_repo_file(repo, "/etc/yum.repos.d") -                self.__create_repo_file(repo, "/etc/zypp/repos.d") -        """ Import repo gpg keys """ -        if repodata: -            for repo in repodata: -                if repo['repokey']: -                    runner.quiet(['rpm', -                                  "--root=%s" % self.instroot, -                                  "--import", -                                  repo['repokey']]) - -class RPMMacroConfig(KickstartConfig): -    """A class to apply the specified rpm macros to the filesystem""" -    @apply_wrapper -    def apply(self, ks): -        if not ks: -            return -        if not os.path.exists(self.path("/etc/rpm")): -            os.mkdir(self.path("/etc/rpm")) -        f = open(self.path("/etc/rpm/macros.imgcreate"), "w+") -        if exclude_docs(ks): -            f.write("%_excludedocs 1\n") -        f.write("%__file_context_path %{nil}\n") -        if inst_langs(ks) != None: -            f.write("%_install_langs ") -            f.write(inst_langs(ks)) -            f.write("\n") -        f.close() - -class NetworkConfig(KickstartConfig): -    """A class to apply a kickstart network configuration to a system.""" -    def write_ifcfg(self, network): -        p = self.path("/etc/sysconfig/network-scripts/ifcfg-" + network.device) - -        f = file(p, "w+") -        os.chmod(p, 0644) - -        f.write("DEVICE=%s\n" % network.device) -        f.write("BOOTPROTO=%s\n" % network.bootProto) - -        if network.bootProto.lower() == "static": -            if network.ip: -                f.write("IPADDR=%s\n" % network.ip) -            if network.netmask: -                f.write("NETMASK=%s\n" % network.netmask) - -        if network.onboot: -            f.write("ONBOOT=on\n") -        else: -            f.write("ONBOOT=off\n") - -        if network.essid: -            f.write("ESSID=%s\n" % network.essid) - -        if network.ethtool: -            if network.ethtool.find("autoneg") == -1: -                network.ethtool = "autoneg off " + network.ethtool -            f.write("ETHTOOL_OPTS=%s\n" % network.ethtool) - -        if network.bootProto.lower() == "dhcp": -            if network.hostname: -                f.write("DHCP_HOSTNAME=%s\n" % network.hostname) -            if network.dhcpclass: -                f.write("DHCP_CLASSID=%s\n" % network.dhcpclass) - -        if network.mtu: -            f.write("MTU=%s\n" % network.mtu) - -        f.close() - -    def write_wepkey(self, network): -        if not network.wepkey: -            return - -        p = self.path("/etc/sysconfig/network-scripts/keys-" + network.device) -        f = file(p, "w+") -        os.chmod(p, 0600) -        f.write("KEY=%s\n" % network.wepkey) -        f.close() - -    def write_sysconfig(self, useipv6, hostname, gateway): -        path = self.path("/etc/sysconfig/network") -        f = file(path, "w+") -        os.chmod(path, 0644) - -        f.write("NETWORKING=yes\n") - -        if useipv6: -            f.write("NETWORKING_IPV6=yes\n") -        else: -            f.write("NETWORKING_IPV6=no\n") - -        if hostname: -            f.write("HOSTNAME=%s\n" % hostname) -        else: -            f.write("HOSTNAME=localhost.localdomain\n") - -        if gateway: -            f.write("GATEWAY=%s\n" % gateway) - -        f.close() - -    def write_hosts(self, hostname): -        localline = "" -        if hostname and hostname != "localhost.localdomain": -            localline += hostname + " " -            l = hostname.split(".") -            if len(l) > 1: -                localline += l[0] + " " -        localline += "localhost.localdomain localhost" - -        path = self.path("/etc/hosts") -        f = file(path, "w+") -        os.chmod(path, 0644) -        f.write("127.0.0.1\t\t%s\n" % localline) -        f.write("::1\t\tlocalhost6.localdomain6 localhost6\n") -        f.close() - -    def write_resolv(self, nodns, nameservers): -        if nodns or not nameservers: -            return - -        path = self.path("/etc/resolv.conf") -        f = file(path, "w+") -        os.chmod(path, 0644) - -        for ns in (nameservers): -            if ns: -                f.write("nameserver %s\n" % ns) - -        f.close() - -    @apply_wrapper -    def apply(self, ksnet): -        fs.makedirs(self.path("/etc/sysconfig/network-scripts")) - -        useipv6 = False -        nodns = False -        hostname = None -        gateway = None -        nameservers = None - -        for network in ksnet.network: -            if not network.device: -                raise errors.KsError("No --device specified with " -                                            "network kickstart command") - -            if (network.onboot and network.bootProto.lower() != "dhcp" and -                not (network.ip and network.netmask)): -                raise errors.KsError("No IP address and/or netmask " -                                            "specified with static " -                                            "configuration for '%s'" % -                                            network.device) - -            self.write_ifcfg(network) -            self.write_wepkey(network) - -            if network.ipv6: -                useipv6 = True -            if network.nodns: -                nodns = True - -            if network.hostname: -                hostname = network.hostname -            if network.gateway: -                gateway = network.gateway - -            if network.nameserver: -                nameservers = network.nameserver.split(",") - -        self.write_sysconfig(useipv6, hostname, gateway) -        self.write_hosts(hostname) -        self.write_resolv(nodns, nameservers) - -def use_installerfw(ks, feature): -    """ Check if the installer framework has to be used for a feature -    "feature". """ - -    features = ks.handler.installerfw.features -    if features: -        if feature in features or "all" in features: -            return True -    return False -  def get_image_size(ks, default = None):      __size = 0      for p in ks.handler.partition.partitions: @@ -665,21 +93,6 @@ def get_image_fsopts(ks, default = None):              return p.fsopts      return default -def get_modules(ks): -    devices = [] -    if isinstance(ks.handler.device, kscommands.device.FC3_Device): -        devices.append(ks.handler.device) -    else: -        devices.extend(ks.handler.device.deviceList) - -    modules = [] -    for device in devices: -        if not device.moduleName: -            continue -        modules.extend(device.moduleName.split(":")) - -    return modules -  def get_timeout(ks, default = None):      if not hasattr(ks.handler.bootloader, "timeout"):          return default @@ -708,181 +121,5 @@ def get_default_kernel(ks, default = None):          return default      return ks.handler.bootloader.default -def get_repos(ks, repo_urls=None): -    repos = {} -    for repo in ks.handler.repo.repoList: -        inc = [] -        if hasattr(repo, "includepkgs"): -            inc.extend(repo.includepkgs) - -        exc = [] -        if hasattr(repo, "excludepkgs"): -            exc.extend(repo.excludepkgs) - -        baseurl = repo.baseurl -        mirrorlist = repo.mirrorlist - -        if repo_urls and repo.name in repo_urls: -            baseurl = repo_urls[repo.name] -            mirrorlist = None - -        if repos.has_key(repo.name): -            msger.warning("Overriding already specified repo %s" %(repo.name,)) - -        proxy = None -        if hasattr(repo, "proxy"): -            proxy = repo.proxy -        proxy_username = None -        if hasattr(repo, "proxy_username"): -            proxy_username = repo.proxy_username -        proxy_password = None -        if hasattr(repo, "proxy_password"): -            proxy_password = repo.proxy_password -        if hasattr(repo, "debuginfo"): -            debuginfo = repo.debuginfo -        if hasattr(repo, "source"): -            source = repo.source -        if hasattr(repo, "gpgkey"): -            gpgkey = repo.gpgkey -        if hasattr(repo, "disable"): -            disable = repo.disable -        ssl_verify = True -        if hasattr(repo, "ssl_verify"): -            ssl_verify = repo.ssl_verify == "yes" -        nocache = False -        if hasattr(repo, "nocache"): -            nocache = repo.nocache -        cost = None -        if hasattr(repo, "cost"): -            cost = repo.cost -        priority = None -        if hasattr(repo, "priority"): -            priority = repo.priority - -        repos[repo.name] = (repo.name, baseurl, mirrorlist, inc, exc, -                            proxy, proxy_username, proxy_password, debuginfo, -                            source, gpgkey, disable, ssl_verify, nocache, -                            cost, priority) - -    return repos.values() - -def convert_method_to_repo(ks): -    try: -        ks.handler.repo.methodToRepo() -    except (AttributeError, kserrors.KickstartError): -        pass - -def get_attachment(ks, required=()): -    return ks.handler.attachment.packageList + list(required) - -def get_pre_packages(ks, required=()): -    return ks.handler.prepackages.packageList + list(required) - -def get_packages(ks, required=()): -    return ks.handler.packages.packageList + list(required) - -def get_groups(ks, required=()): -    return ks.handler.packages.groupList + list(required) - -def get_excluded(ks, required=()): -    return ks.handler.packages.excludedList + list(required) -  def get_partitions(ks):      return ks.handler.partition.partitions - -def ignore_missing(ks): -    return ks.handler.packages.handleMissing == ksconstants.KS_MISSING_IGNORE - -def exclude_docs(ks): -    return ks.handler.packages.excludeDocs - -def inst_langs(ks): -    if hasattr(ks.handler.packages, "instLange"): -        return ks.handler.packages.instLange -    elif hasattr(ks.handler.packages, "instLangs"): -        return ks.handler.packages.instLangs -    return "" - -def get_post_scripts(ks): -    scripts = [] -    for s in ks.handler.scripts: -        if s.type != ksparser.KS_SCRIPT_POST: -            continue -        scripts.append(s) -    return scripts - -def add_repo(ks, repostr): -    args = repostr.split() -    repoobj = ks.handler.repo.parse(args[1:]) -    if repoobj and repoobj not in ks.handler.repo.repoList: -        ks.handler.repo.repoList.append(repoobj) - -def remove_all_repos(ks): -    while len(ks.handler.repo.repoList) != 0: -        del ks.handler.repo.repoList[0] - -def remove_duplicate_repos(ks): -    i = 0 -    j = i + 1 -    while True: -        if len(ks.handler.repo.repoList) < 2: -            break -        if i >= len(ks.handler.repo.repoList) - 1: -            break -        name = ks.handler.repo.repoList[i].name -        baseurl = ks.handler.repo.repoList[i].baseurl -        if j < len(ks.handler.repo.repoList): -            if (ks.handler.repo.repoList[j].name == name or \ -                ks.handler.repo.repoList[j].baseurl == baseurl): -                del ks.handler.repo.repoList[j] -            else: -                j += 1 -            if j >= len(ks.handler.repo.repoList): -                i += 1 -                j = i + 1 -        else: -            i += 1 -            j = i + 1 - -def resolve_groups(creatoropts, repometadata): -    iszypp = False -    if 'zypp' == creatoropts['pkgmgr']: -        iszypp = True -    ks = creatoropts['ks'] - -    for repo in repometadata: -        """ Mustn't replace group with package list if repo is ready for the -            corresponding package manager. -        """ - -        if iszypp and repo["patterns"]: -            continue -        if not iszypp and repo["comps"]: -            continue - -        # But we also must handle such cases, use zypp but repo only has comps, -        # use yum but repo only has patterns, use zypp but use_comps is true, -        # use yum but use_comps is false. -        groupfile = None -        if iszypp and repo["comps"]: -            groupfile = repo["comps"] -            get_pkglist_handler = misc.get_pkglist_in_comps -        if not iszypp and repo["patterns"]: -            groupfile = repo["patterns"] -            get_pkglist_handler = misc.get_pkglist_in_patterns - -        if groupfile: -            i = 0 -            while True: -                if i >= len(ks.handler.packages.groupList): -                    break -                pkglist = get_pkglist_handler( -                                        ks.handler.packages.groupList[i].name, -                                        groupfile) -                if pkglist: -                    del ks.handler.packages.groupList[i] -                    for pkg in pkglist: -                        if pkg not in ks.handler.packages.packageList: -                            ks.handler.packages.packageList.append(pkg) -                else: -                    i = i + 1 | 
