You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
6.0 KiB

#
# 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 <http://www.gnu.org/licenses/>.
#
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