# # powerel.py # # Copyright (C) 2010 Red Hat, Inc. All rights reserved. # # 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 . # import os import logging log = logging.getLogger("anaconda") from pyanaconda.installclass import BaseInstallClass from pyanaconda.product import productName from pyanaconda import network from pyanaconda import nm from pyanaconda import iutil from pyanaconda.kickstart import getAvailableDiskSpace from blivet.partspec import PartSpec from blivet.platform import platform from blivet.devicelibs import swap from blivet.size import Size __all__ = ["PELBaseInstallClass", "PELAtomicInstallClass"] class PELBaseInstallClass(BaseInstallClass): name = "PowerEL" sortPriority = 20000 if not productName.startswith("PowerEL"): hidden = True defaultFS = "xfs" bootloaderTimeoutDefault = 5 ignoredPackages = [ "reiserfs-utils" ] installUpdates = False _l10n_domain = "comps" efi_dir = "powerel" help_placeholder = "PowerEL7Placeholder.html" help_placeholder_with_links = "PowerEL7PlaceholderWithLinks.html" def configure(self, anaconda): BaseInstallClass.configure(self, anaconda) def setNetworkOnbootDefault(self, ksdata): if any(nd.onboot for nd in ksdata.network.network if nd.device): return # choose the device used during installation # (ie for majority of cases the one having the default route) dev = network.default_route_device() \ or network.default_route_device(family="inet6") if not dev: return # ignore wireless (its ifcfgs would need to be handled differently) if nm.nm_device_type_is_wifi(dev): return network.update_onboot_value(dev, True, ksdata=ksdata) def __init__(self): BaseInstallClass.__init__(self) class PELAtomicInstallClass(PELBaseInstallClass): name = "PowerEL Atomic Host" sortPriority=21000 hidden = not productName.startswith(("PowerEL Atomic Host", "PEL Atomic")) def __init__(self): self.localemap = {} # loaded lazily RHELBaseInstallClass.__init__(self) def setDefaultPartitioning(self, storage): autorequests = [PartSpec(mountpoint="/", fstype=storage.defaultFSType, size=Size("3GiB"), maxSize=Size("15GiB"), grow=True, lv=True)] bootreqs = platform.setDefaultPartitioning() if bootreqs: autorequests.extend(bootreqs) disk_space = getAvailableDiskSpace(storage) swp = swap.swapSuggestion(disk_space=disk_space) autorequests.append(PartSpec(fstype="swap", size=swp, grow=False, lv=True, encrypted=True)) for autoreq in autorequests: if autoreq.fstype is None: if autoreq.mountpoint == "/boot": autoreq.fstype = storage.defaultBootFSType autoreq.size = Size("256MiB") else: autoreq.fstype = storage.defaultFSType storage.autoPartitionRequests = autorequests def filterSupportedLangs(self, ksdata, langs): self._initialize_localemap(ksdata.ostreesetup.ref, ksdata.ostreesetup.url) for lang in langs: if lang in self.localemap: yield lang def filterSupportedLocales(self, ksdata, lang, locales): self._initialize_localemap(ksdata.ostreesetup.ref, ksdata.ostreesetup.url) supported = [] if lang in self.localemap: for locale in locales: stripped = self._strip_codeset_and_modifier(locale) if stripped in self.localemap[lang]: supported.append(locale) return supported def _initialize_localemap(self, ref, repo): if self.localemap: return # fallback to just en_US in case of errors self.localemap = { "en": ["en_US"] } # Let's only handle local embedded repos for now. Anyway, it'd probably # not be very common to only override ostreesetup through kickstart and # still want the interactive installer. Though to be nice, let's handle # that case. if not repo.startswith("file://"): log.info("ostree repo is not local; defaulting to en_US") return # convert to regular UNIX path repo = repo[len("file://"):] iutil.mkdirChain(os.path.join(repo, "tmp/usr/lib")) rc = iutil.execWithRedirect("/usr/bin/ostree", ["checkout", "--repo", repo, ref, "--subpath", "/usr/lib/locale/locale-archive", "install/ostree/tmp/usr/lib/locale"]) if rc != 0: log.error("failed to check out locale-archive; check program.log") return for line in iutil.execReadlines("/usr/bin/localedef", ["--prefix", os.path.join(repo, "tmp"), "--list-archive"]): line = self._strip_codeset_and_modifier(line) (lang, _) = line.split('_') if lang not in self.localemap: self.localemap[lang] = [line] else: self.localemap[lang].append(line) @staticmethod def _strip_codeset_and_modifier(locale): if '@' in locale: locale = locale[:locale.find('@')] if '.' in locale: locale = locale[:locale.find('.')] return locale