From c527fd1f14c27855a37f2e8ac5346ce8d940ced2 Mon Sep 17 00:00:00 2001 From: Tudor Florea Date: Thu, 16 Oct 2014 03:05:19 +0200 Subject: initial commit for Enea Linux 4.0-140929 Migrated from the internal git server on the daisy-enea-point-release branch Signed-off-by: Tudor Florea --- .../lib/mic/kickstart/custom_commands/__init__.py | 17 + .../lib/mic/kickstart/custom_commands/desktop.py | 95 ++++ .../mic/kickstart/custom_commands/installerfw.py | 63 +++ .../lib/mic/kickstart/custom_commands/micboot.py | 49 +++ .../mic/kickstart/custom_commands/micpartition.py | 57 +++ .../lib/mic/kickstart/custom_commands/micrepo.py | 127 ++++++ .../lib/mic/kickstart/custom_commands/partition.py | 482 +++++++++++++++++++++ .../lib/mic/kickstart/custom_commands/wicboot.py | 57 +++ 8 files changed, 947 insertions(+) create mode 100644 scripts/lib/mic/kickstart/custom_commands/__init__.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/desktop.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/installerfw.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/micboot.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/micpartition.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/micrepo.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/partition.py create mode 100644 scripts/lib/mic/kickstart/custom_commands/wicboot.py (limited to 'scripts/lib/mic/kickstart/custom_commands') diff --git a/scripts/lib/mic/kickstart/custom_commands/__init__.py b/scripts/lib/mic/kickstart/custom_commands/__init__.py new file mode 100644 index 0000000000..6aed0ff6fa --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/__init__.py @@ -0,0 +1,17 @@ +from desktop import Mic_Desktop +from micrepo import Mic_Repo, Mic_RepoData +from micpartition import Mic_Partition +from micpartition import Mic_PartData +from installerfw import Mic_installerfw +from partition import Wic_Partition + +__all__ = ( + "Mic_Desktop", + "Mic_Repo", + "Mic_RepoData", + "Mic_Partition", + "Mic_PartData", + "Mic_installerfw", + "Wic_Partition", + "Wic_PartData", +) diff --git a/scripts/lib/mic/kickstart/custom_commands/desktop.py b/scripts/lib/mic/kickstart/custom_commands/desktop.py new file mode 100644 index 0000000000..c8bd647ae3 --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/desktop.py @@ -0,0 +1,95 @@ +#!/usr/bin/python -tt +# +# Copyright (c) 2008, 2009, 2010 Intel, Inc. +# +# Yi Yang +# +# 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; version 2 of the License +# +# 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, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from pykickstart.base import * +from pykickstart.errors import * +from pykickstart.options import * + +class Mic_Desktop(KickstartCommand): + def __init__(self, writePriority=0, + defaultdesktop=None, + defaultdm=None, + autologinuser=None, + session=None): + + KickstartCommand.__init__(self, writePriority) + + self.__new_version = False + self.op = self._getParser() + + self.defaultdesktop = defaultdesktop + self.autologinuser = autologinuser + self.defaultdm = defaultdm + self.session = session + + def __str__(self): + retval = "" + + if self.defaultdesktop != None: + retval += " --defaultdesktop=%s" % self.defaultdesktop + if self.session != None: + retval += " --session=\"%s\"" % self.session + if self.autologinuser != None: + retval += " --autologinuser=%s" % self.autologinuser + if self.defaultdm != None: + retval += " --defaultdm=%s" % self.defaultdm + + if retval != "": + retval = "# Default Desktop Settings\ndesktop %s\n" % retval + + return retval + + def _getParser(self): + try: + op = KSOptionParser(lineno=self.lineno) + except TypeError: + # the latest version has not lineno argument + op = KSOptionParser() + self.__new_version = True + + op.add_option("--defaultdesktop", dest="defaultdesktop", + action="store", + type="string", + nargs=1) + op.add_option("--autologinuser", dest="autologinuser", + action="store", + type="string", + nargs=1) + op.add_option("--defaultdm", dest="defaultdm", + action="store", + type="string", + nargs=1) + op.add_option("--session", dest="session", + action="store", + type="string", + nargs=1) + return op + + def parse(self, args): + if self.__new_version: + (opts, extra) = self.op.parse_args(args=args, lineno=self.lineno) + else: + (opts, extra) = self.op.parse_args(args=args) + + if extra: + m = _("Unexpected arguments to %(command)s command: %(options)s") \ + % {"command": "desktop", "options": extra} + raise KickstartValueError, formatErrorMsg(self.lineno, msg=m) + + self._setToSelf(self.op, opts) diff --git a/scripts/lib/mic/kickstart/custom_commands/installerfw.py b/scripts/lib/mic/kickstart/custom_commands/installerfw.py new file mode 100644 index 0000000000..2466f1dc07 --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/installerfw.py @@ -0,0 +1,63 @@ +#!/usr/bin/python -tt +# +# Copyright (c) 2013 Intel, Inc. +# +# 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; version 2 of the License +# +# 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, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from pykickstart.base import * +from pykickstart.options import * + +class Mic_installerfw(KickstartCommand): + """ This class implements the "installerfw" KS option. The argument + of the option is a comman-separated list of MIC features which have to be + disabled and instead, will be done in the installer. For example, + "installerfw=extlinux" disables all the MIC code which installs extlinux to + the target images, and instead, the extlinux or whatever boot-loader will + be installed by the installer instead. + + The installer is a tool which is external to MIC, it comes from the + installation repositories and can be executed by MIC in order to perform + various configuration actions. The main point here is to make sure MIC has + no hard-wired knoledge about the target OS configuration. """ + + removedKeywords = KickstartCommand.removedKeywords + removedAttrs = KickstartCommand.removedAttrs + + def __init__(self, *args, **kwargs): + KickstartCommand.__init__(self, *args, **kwargs) + self.op = self._getParser() + self.features = kwargs.get("installerfw", None) + + def __str__(self): + retval = KickstartCommand.__str__(self) + + if self.features: + retval += "# Enable installer framework features\ninstallerfw\n" + + return retval + + def _getParser(self): + op = KSOptionParser() + return op + + def parse(self, args): + (_, extra) = self.op.parse_args(args=args, lineno=self.lineno) + + if len(extra) != 1: + msg = "Kickstart command \"installerfw\" requires one " \ + "argumet - a list of legacy features to disable" + raise KickstartValueError, formatErrorMsg(self.lineno, msg = msg) + + self.features = extra[0].split(",") + return self diff --git a/scripts/lib/mic/kickstart/custom_commands/micboot.py b/scripts/lib/mic/kickstart/custom_commands/micboot.py new file mode 100644 index 0000000000..66d1678aa7 --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/micboot.py @@ -0,0 +1,49 @@ +#!/usr/bin/python -tt +# +# Copyright (c) 2008, 2009, 2010 Intel, Inc. +# +# Anas Nashif +# +# 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; version 2 of the License +# +# 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, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from pykickstart.base import * +from pykickstart.errors import * +from pykickstart.options import * +from pykickstart.commands.bootloader import * + +class Mic_Bootloader(F8_Bootloader): + def __init__(self, writePriority=10, appendLine="", driveorder=None, + forceLBA=False, location="", md5pass="", password="", + upgrade=False, menus=""): + F8_Bootloader.__init__(self, writePriority, appendLine, driveorder, + forceLBA, location, md5pass, password, upgrade) + + self.menus = "" + self.ptable = "msdos" + + def _getArgsAsStr(self): + ret = F8_Bootloader._getArgsAsStr(self) + + if self.menus == "": + ret += " --menus=%s" %(self.menus,) + if self.ptable: + ret += " --ptable=\"%s\"" %(self.ptable,) + return ret + + def _getParser(self): + op = F8_Bootloader._getParser(self) + op.add_option("--menus", dest="menus") + op.add_option("--ptable", dest="ptable", type="string") + return op + diff --git a/scripts/lib/mic/kickstart/custom_commands/micpartition.py b/scripts/lib/mic/kickstart/custom_commands/micpartition.py new file mode 100644 index 0000000000..59a87fb486 --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/micpartition.py @@ -0,0 +1,57 @@ +#!/usr/bin/python -tt +# +# Marko Saukko +# +# Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +# +# This copyrighted material is made available to anyone wishing to use, modify, +# copy, or redistribute it subject to the terms and conditions of the GNU +# General Public License v.2. This program is distributed in the hope that it +# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the +# implied warranties 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, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from pykickstart.commands.partition import * + +class Mic_PartData(FC4_PartData): + removedKeywords = FC4_PartData.removedKeywords + removedAttrs = FC4_PartData.removedAttrs + + def __init__(self, *args, **kwargs): + FC4_PartData.__init__(self, *args, **kwargs) + self.deleteRemovedAttrs() + self.align = kwargs.get("align", None) + self.extopts = kwargs.get("extopts", None) + self.part_type = kwargs.get("part_type", None) + + def _getArgsAsStr(self): + retval = FC4_PartData._getArgsAsStr(self) + + if self.align: + retval += " --align" + if self.extopts: + retval += " --extoptions=%s" % self.extopts + if self.part_type: + retval += " --part-type=%s" % self.part_type + + return retval + +class Mic_Partition(FC4_Partition): + removedKeywords = FC4_Partition.removedKeywords + removedAttrs = FC4_Partition.removedAttrs + + def _getParser(self): + op = FC4_Partition._getParser(self) + # The alignment value is given in kBytes. e.g., value 8 means that + # the partition is aligned to start from 8096 byte boundary. + op.add_option("--align", type="int", action="store", dest="align", + default=None) + op.add_option("--extoptions", type="string", action="store", dest="extopts", + default=None) + op.add_option("--part-type", type="string", action="store", dest="part_type", + default=None) + return op diff --git a/scripts/lib/mic/kickstart/custom_commands/micrepo.py b/scripts/lib/mic/kickstart/custom_commands/micrepo.py new file mode 100644 index 0000000000..b31576e400 --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/micrepo.py @@ -0,0 +1,127 @@ +#!/usr/bin/python -tt +# +# Copyright (c) 2008, 2009, 2010 Intel, Inc. +# +# Yi Yang +# +# 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; version 2 of the License +# +# 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, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from pykickstart.base import * +from pykickstart.errors import * +from pykickstart.options import * +from pykickstart.commands.repo import * + +class Mic_RepoData(F8_RepoData): + + def __init__(self, baseurl="", mirrorlist=None, name="", priority=None, + includepkgs=(), excludepkgs=(), save=False, proxy=None, + proxy_username=None, proxy_password=None, debuginfo=False, + source=False, gpgkey=None, disable=False, ssl_verify="yes", + nocache=False): + kw = {} + # F8_RepoData keywords + if includepkgs: + kw['includepkgs'] = includepkgs + if excludepkgs: + kw['excludepkgs'] = excludepkgs + + #FC6_RepoData keywords + if baseurl: + kw['baseurl'] = baseurl + if mirrorlist: + kw['mirrorlist'] = mirrorlist + if name: + kw['name'] = name + + F8_RepoData.__init__(self, **kw) + self.save = save + self.proxy = proxy + self.proxy_username = proxy_username + self.proxy_password = proxy_password + self.debuginfo = debuginfo + self.disable = disable + self.source = source + self.gpgkey = gpgkey + self.ssl_verify = ssl_verify.lower() + self.priority = priority + self.nocache = nocache + + def _getArgsAsStr(self): + retval = F8_RepoData._getArgsAsStr(self) + + if self.save: + retval += " --save" + if self.proxy: + retval += " --proxy=%s" % self.proxy + if self.proxy_username: + retval += " --proxyuser=%s" % self.proxy_username + if self.proxy_password: + retval += " --proxypasswd=%s" % self.proxy_password + if self.debuginfo: + retval += " --debuginfo" + if self.source: + retval += " --source" + if self.gpgkey: + retval += " --gpgkey=%s" % self.gpgkey + if self.disable: + retval += " --disable" + if self.ssl_verify: + retval += " --ssl_verify=%s" % self.ssl_verify + if self.priority: + retval += " --priority=%s" % self.priority + if self.nocache: + retval += " --nocache" + + return retval + +class Mic_Repo(F8_Repo): + def __init__(self, writePriority=0, repoList=None): + F8_Repo.__init__(self, writePriority, repoList) + + def __str__(self): + retval = "" + for repo in self.repoList: + retval += repo.__str__() + + return retval + + def _getParser(self): + def list_cb (option, opt_str, value, parser): + for d in value.split(','): + parser.values.ensure_value(option.dest, []).append(d) + + op = F8_Repo._getParser(self) + op.add_option("--save", action="store_true", dest="save", + default=False) + op.add_option("--proxy", type="string", action="store", dest="proxy", + default=None, nargs=1) + op.add_option("--proxyuser", type="string", action="store", + dest="proxy_username", default=None, nargs=1) + op.add_option("--proxypasswd", type="string", action="store", + dest="proxy_password", default=None, nargs=1) + op.add_option("--debuginfo", action="store_true", dest="debuginfo", + default=False) + op.add_option("--source", action="store_true", dest="source", + default=False) + op.add_option("--disable", action="store_true", dest="disable", + default=False) + op.add_option("--gpgkey", type="string", action="store", dest="gpgkey", + default=None, nargs=1) + op.add_option("--ssl_verify", type="string", action="store", + dest="ssl_verify", default="yes") + op.add_option("--priority", type="int", action="store", dest="priority", + default=None) + op.add_option("--nocache", action="store_true", dest="nocache", + default=False) + return op diff --git a/scripts/lib/mic/kickstart/custom_commands/partition.py b/scripts/lib/mic/kickstart/custom_commands/partition.py new file mode 100644 index 0000000000..450d2d492d --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/partition.py @@ -0,0 +1,482 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Copyright (c) 2013, Intel Corporation. +# 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 version 2 as +# published by the Free Software Foundation. +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# DESCRIPTION +# This module provides the OpenEmbedded partition object definitions. +# +# AUTHORS +# Tom Zanussi +# + +import shutil + +from pykickstart.commands.partition import * +from mic.utils.oe.misc import * +from mic.kickstart.custom_commands import * +from mic.plugin import pluginmgr + +import os +from mic.utils.oe.package_manager import * + +partition_methods = { + "do_install_pkgs":None, + "do_stage_partition":None, + "do_prepare_partition":None, + "do_configure_partition":None, +} + +class Wic_PartData(Mic_PartData): + removedKeywords = Mic_PartData.removedKeywords + removedAttrs = Mic_PartData.removedAttrs + + def __init__(self, *args, **kwargs): + Mic_PartData.__init__(self, *args, **kwargs) + self.deleteRemovedAttrs() + self.source = kwargs.get("source", None) + self.rootfs = kwargs.get("rootfs-dir", None) + self.source_file = "" + self.size = 0 + + def _getArgsAsStr(self): + retval = Mic_PartData._getArgsAsStr(self) + + if self.source: + retval += " --source=%s" % self.source + if self.rootfs: + retval += " --rootfs-dir=%s" % self.rootfs + + return retval + + def get_rootfs(self): + """ + Acessor for rootfs dir + """ + return self.rootfs + + def set_rootfs(self, rootfs): + """ + Acessor for actual rootfs dir, which must be set by source + plugins. + """ + self.rootfs = rootfs + + def get_size(self): + """ + Accessor for partition size, 0 or --size before set_size(). + """ + return self.size + + def set_size(self, size): + """ + Accessor for actual partition size, which must be set by source + plugins. + """ + self.size = size + + def set_source_file(self, source_file): + """ + Accessor for source_file, the location of the generated partition + image, which must be set by source plugins. + """ + self.source_file = source_file + + def get_extra_block_count(self, current_blocks): + """ + The --size param is reflected in self.size (in MB), and we already + have current_blocks (1k) blocks, calculate and return the + number of (1k) blocks we need to add to get to --size, 0 if + we're already there or beyond. + """ + msger.debug("Requested partition size for %s: %d" % \ + (self.mountpoint, self.size)) + + if not self.size: + return 0 + + requested_blocks = self.size * 1024 + + msger.debug("Requested blocks %d, current_blocks %d" % \ + (requested_blocks, current_blocks)) + + if requested_blocks > current_blocks: + return requested_blocks - current_blocks + else: + return 0 + + def install_pkgs(self, creator, cr_workdir, oe_builddir, rootfs_dir, + bootimg_dir, kernel_dir, native_sysroot): + """ + Prepare content for individual partitions, installing packages. + """ + + if not self.source: + return + + self._source_methods = pluginmgr.get_source_plugin_methods(self.source, partition_methods) + self._source_methods["do_install_pkgs"](self, creator, + cr_workdir, + oe_builddir, + rootfs_dir, + bootimg_dir, + kernel_dir, + native_sysroot) + + def install_pkgs_ipk(self, cr_workdir, oe_builddir, rootfs_dir, + native_sysroot, packages, repourl): + """ + Install packages specified into wks file using opkg package manager. + This method is dependend on bb module. + """ + + gVar = {} + gVar["DEPLOY_DIR_IPK"] = os.path.join(oe_builddir, "tmp/deploy/ipk") + + # Run postinstall scripts even in offline mode + # Use the arch priority package rather than higher version one if more than one candidate is found. + #d.setVar("OPKG_ARGS", "--force_postinstall --prefer-arch-to-version") + gVar["OPKG_ARGS"] = "--force_postinstall" + + # OPKG path relative to /output_path + gVar["OPKGLIBDIR"] = "var/lib" + + source_url = repourl.split() + + # Generate feed uri's names, it doesn't seem to matter what name they have + feed_uris = "" + cnt = 0 + archs = "" + for url in source_url: + feed_uris += "cl_def_feed%d##%s\n" % (cnt, url) + cnt += 1 + head, tail = os.path.split(url) + archs += " " + tail + + # IPK_FEED_URIS with special formating defines the URI's used as source for packages + gVar['IPK_FEED_URIS'] = feed_uris + + gVar['BUILD_IMAGES_FROM_FEEDS'] = "1" + + # We need to provide sysroot for utilities + gVar['STAGING_DIR_NATIVE'] = native_sysroot + + # Set WORKDIR for output + gVar['WORKDIR'] = cr_workdir + + # Set TMPDIR for output + gVar['TMPDIR'] = os.path.join(cr_workdir, "tmp") + + if 'ROOTFS_DIR' in rootfs_dir: + target_dir = rootfs_dir['ROOTFS_DIR'] + elif os.path.isdir(rootfs_dir): + target_dir = rootfs_dir + else: + msg = "Couldn't find --rootfs-dir=%s connection" + msg += " or it is not a valid path, exiting" + msger.error(msg % rootfs_dir) + + # Need native sysroot /usr/bin/ for opkg-cl + # chnage PATH var to avoid issues with host tools + defpath = os.environ['PATH'] + os.environ['PATH'] = native_sysroot + "/usr/bin/" + ":/bin:/usr/bin:" + + pseudo = "export PSEUDO_PREFIX=%s/usr;" % native_sysroot + pseudo += "export PSEUDO_LOCALSTATEDIR=%s/../pseudo;" % target_dir + pseudo += "export PSEUDO_PASSWD=%s;" % target_dir + pseudo += "export PSEUDO_NOSYMLINKEXP=1;" + pseudo += "%s/usr/bin/pseudo " % native_sysroot + + pm = WicOpkgPM(gVar, + target_dir, + 'opkg.conf', + archs, + pseudo, + native_sysroot) + + pm.update() + + pm.install(packages) + + os.environ['PATH'] += defpath + ":" + native_sysroot + "/usr/bin/" + + + def prepare(self, cr, cr_workdir, oe_builddir, rootfs_dir, bootimg_dir, + kernel_dir, native_sysroot): + """ + Prepare content for individual partitions, depending on + partition command parameters. + """ + if not self.source: + if self.fstype and self.fstype == "swap": + self.prepare_swap_partition(cr_workdir, oe_builddir, + native_sysroot) + elif self.fstype: + self.prepare_empty_partition(cr_workdir, oe_builddir, + native_sysroot) + return + + self._source_methods = pluginmgr.get_source_plugin_methods(self.source, partition_methods) + self._source_methods["do_configure_partition"](self, cr, cr_workdir, + oe_builddir, + bootimg_dir, + kernel_dir, + native_sysroot) + self._source_methods["do_stage_partition"](self, cr, cr_workdir, + oe_builddir, + bootimg_dir, kernel_dir, + native_sysroot) + self._source_methods["do_prepare_partition"](self, cr, cr_workdir, + oe_builddir, + bootimg_dir, kernel_dir, rootfs_dir, + native_sysroot) + + def prepare_rootfs_from_fs_image(self, cr_workdir, oe_builddir, + rootfs_dir): + """ + Handle an already-created partition e.g. xxx.ext3 + """ + rootfs = oe_builddir + du_cmd = "du -Lbms %s" % rootfs + rc, out = exec_cmd(du_cmd) + rootfs_size = out.split()[0] + + self.size = rootfs_size + self.source_file = rootfs + + def prepare_rootfs(self, cr_workdir, oe_builddir, rootfs_dir, + native_sysroot): + """ + Prepare content for a rootfs partition i.e. create a partition + and fill it from a /rootfs dir. + + Currently handles ext2/3/4 and btrfs. + """ + pseudo = "export PSEUDO_PREFIX=%s/usr;" % native_sysroot + pseudo += "export PSEUDO_LOCALSTATEDIR=%s/../pseudo;" % rootfs_dir + pseudo += "export PSEUDO_PASSWD=%s;" % rootfs_dir + pseudo += "export PSEUDO_NOSYMLINKEXP=1;" + pseudo += "%s/usr/bin/pseudo " % native_sysroot + + if self.fstype.startswith("ext"): + return self.prepare_rootfs_ext(cr_workdir, oe_builddir, + rootfs_dir, native_sysroot, + pseudo) + elif self.fstype.startswith("btrfs"): + return self.prepare_rootfs_btrfs(cr_workdir, oe_builddir, + rootfs_dir, native_sysroot, + pseudo) + + def prepare_rootfs_ext(self, cr_workdir, oe_builddir, rootfs_dir, + native_sysroot, pseudo): + """ + Prepare content for an ext2/3/4 rootfs partition. + """ + + image_rootfs = rootfs_dir + rootfs = "%s/rootfs_%s.%s" % (cr_workdir, self.label ,self.fstype) + + du_cmd = "du -ks %s" % image_rootfs + rc, out = exec_cmd(du_cmd) + actual_rootfs_size = int(out.split()[0]) + + extra_blocks = self.get_extra_block_count(actual_rootfs_size) + + if extra_blocks < IMAGE_EXTRA_SPACE: + extra_blocks = IMAGE_EXTRA_SPACE + + rootfs_size = actual_rootfs_size + extra_blocks + + msger.debug("Added %d extra blocks to %s to get to %d total blocks" % \ + (extra_blocks, self.mountpoint, rootfs_size)) + + dd_cmd = "dd if=/dev/zero of=%s bs=1024 seek=%d count=0 bs=1k" % \ + (rootfs, rootfs_size) + rc, out = exec_cmd(dd_cmd) + + extra_imagecmd = "-i 8192" + + mkfs_cmd = "mkfs.%s -F %s %s -d %s" % \ + (self.fstype, extra_imagecmd, rootfs, image_rootfs) + rc, out = exec_native_cmd(pseudo + mkfs_cmd, native_sysroot) + + + # get the rootfs size in the right units for kickstart (Mb) + du_cmd = "du -Lbms %s" % rootfs + rc, out = exec_cmd(du_cmd) + rootfs_size = out.split()[0] + + self.size = rootfs_size + self.source_file = rootfs + + return 0 + + def prepare_for_uboot(self, arch, cr_workdir, oe_builddir, rootfs_dir, + native_sysroot): + """ + Generates u-boot image from source_file( ext2/3/4 ) + + """ + pseudo = "export PSEUDO_PREFIX=%s/usr;" % native_sysroot + pseudo += "export PSEUDO_LOCALSTATEDIR=%s/../pseudo;" % rootfs_dir + pseudo += "export PSEUDO_PASSWD=%s;" % rootfs_dir + pseudo += "export PSEUDO_NOSYMLINKEXP=1;" + pseudo += "%s/usr/bin/pseudo " % native_sysroot + + # 1) compress image + rootfs = self.source_file + rootfs_gzip = "%s.gz" % rootfs + gzip_cmd = "gzip -f -9 -c %s > %s" % (rootfs, rootfs_gzip) + rc, out = exec_native_cmd(pseudo + gzip_cmd, native_sysroot) + + # 2) image for U-Boot + rootfs_uboot = "%s.u-boot" % rootfs_gzip + mkimage_cmd = "mkimage -A %s -O linux -T ramdisk -C gzip -n %s -d %s %s" % \ + (arch, self.label, rootfs_gzip, rootfs_uboot) + rc, out = exec_native_cmd(pseudo + mkimage_cmd, native_sysroot) + + msger.info("\n\n\tThe new U-Boot ramdisk image can be found here:\n\t\t%s\n\n" % rootfs_uboot) + + return 0 + + def prepare_rootfs_btrfs(self, cr_workdir, oe_builddir, rootfs_dir, + native_sysroot, pseudo): + """ + Prepare content for a btrfs rootfs partition. + + Currently handles ext2/3/4 and btrfs. + """ + image_rootfs = rootfs_dir + rootfs = "%s/rootfs_%s.%s" % (cr_workdir, self.label, self.fstype) + + du_cmd = "du -ks %s" % image_rootfs + rc, out = exec_cmd(du_cmd) + actual_rootfs_size = int(out.split()[0]) + + extra_blocks = self.get_extra_block_count(actual_rootfs_size) + + if extra_blocks < IMAGE_EXTRA_SPACE: + extra_blocks = IMAGE_EXTRA_SPACE + + rootfs_size = actual_rootfs_size + extra_blocks + + msger.debug("Added %d extra blocks to %s to get to %d total blocks" % \ + (extra_blocks, self.mountpoint, rootfs_size)) + + dd_cmd = "dd if=/dev/zero of=%s bs=1024 seek=%d count=0 bs=1k" % \ + (rootfs, rootfs_size) + rc, out = exec_cmd(dd_cmd) + + mkfs_cmd = "mkfs.%s -b %d -r %s %s" % \ + (self.fstype, rootfs_size * 1024, image_rootfs, rootfs) + rc, out = exec_native_cmd(pseudo + mkfs_cmd, native_sysroot) + + # get the rootfs size in the right units for kickstart (Mb) + du_cmd = "du -Lbms %s" % rootfs + rc, out = exec_cmd(du_cmd) + rootfs_size = out.split()[0] + + self.size = rootfs_size + self.source_file = rootfs + + def prepare_empty_partition(self, cr_workdir, oe_builddir, native_sysroot): + """ + Prepare an empty partition. + """ + if self.fstype.startswith("ext"): + return self.prepare_empty_partition_ext(cr_workdir, oe_builddir, + native_sysroot) + elif self.fstype.startswith("btrfs"): + return self.prepare_empty_partition_btrfs(cr_workdir, oe_builddir, + native_sysroot) + + def prepare_empty_partition_ext(self, cr_workdir, oe_builddir, + native_sysroot): + """ + Prepare an empty ext2/3/4 partition. + """ + fs = "%s/fs.%s" % (cr_workdir, self.fstype) + + dd_cmd = "dd if=/dev/zero of=%s bs=1M seek=%d count=0" % \ + (fs, self.size) + rc, out = exec_cmd(dd_cmd) + + extra_imagecmd = "-i 8192" + + mkfs_cmd = "mkfs.%s -F %s %s" % (self.fstype, extra_imagecmd, fs) + rc, out = exec_native_cmd(mkfs_cmd, native_sysroot) + + self.source_file = fs + + return 0 + + def prepare_empty_partition_btrfs(self, cr_workdir, oe_builddir, + native_sysroot): + """ + Prepare an empty btrfs partition. + """ + fs = "%s/fs.%s" % (cr_workdir, self.fstype) + + dd_cmd = "dd if=/dev/zero of=%s bs=1M seek=%d count=0" % \ + (fs, self.size) + rc, out = exec_cmd(dd_cmd) + + mkfs_cmd = "mkfs.%s -b %d %s" % (self.fstype, self.size * 1024, rootfs) + rc, out = exec_native_cmd(mkfs_cmd, native_sysroot) + + mkfs_cmd = "mkfs.%s -F %s %s" % (self.fstype, extra_imagecmd, fs) + rc, out = exec_native_cmd(mkfs_cmd, native_sysroot) + + self.source_file = fs + + return 0 + + def prepare_swap_partition(self, cr_workdir, oe_builddir, native_sysroot): + """ + Prepare a swap partition. + """ + fs = "%s/fs.%s" % (cr_workdir, self.fstype) + + dd_cmd = "dd if=/dev/zero of=%s bs=1M seek=%d count=0" % \ + (fs, self.size) + rc, out = exec_cmd(dd_cmd) + + import uuid + label_str = "" + if self.label: + label_str = "-L %s" % self.label + mkswap_cmd = "mkswap %s -U %s %s" % (label_str, str(uuid.uuid1()), fs) + rc, out = exec_native_cmd(mkswap_cmd, native_sysroot) + + self.source_file = fs + + return 0 + +class Wic_Partition(Mic_Partition): + removedKeywords = Mic_Partition.removedKeywords + removedAttrs = Mic_Partition.removedAttrs + + def _getParser(self): + op = Mic_Partition._getParser(self) + # use specified source file to fill the partition + # and calculate partition size + op.add_option("--source", type="string", action="store", + dest="source", default=None) + # use specified rootfs path to fill the partition + op.add_option("--rootfs-dir", type="string", action="store", + dest="rootfs", default=None) + return op diff --git a/scripts/lib/mic/kickstart/custom_commands/wicboot.py b/scripts/lib/mic/kickstart/custom_commands/wicboot.py new file mode 100644 index 0000000000..ab8871de4e --- /dev/null +++ b/scripts/lib/mic/kickstart/custom_commands/wicboot.py @@ -0,0 +1,57 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Copyright (c) 2014, Intel Corporation. +# 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 version 2 as +# published by the Free Software Foundation. +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# DESCRIPTION +# This module provides the OpenEmbedded bootloader object definitions. +# +# AUTHORS +# Tom Zanussi +# + +from pykickstart.base import * +from pykickstart.errors import * +from pykickstart.options import * +from pykickstart.commands.bootloader import * + +from mic.kickstart.custom_commands.micboot import * + +class Wic_Bootloader(Mic_Bootloader): + def __init__(self, writePriority=10, appendLine="", driveorder=None, + forceLBA=False, location="", md5pass="", password="", + upgrade=False, menus=""): + Mic_Bootloader.__init__(self, writePriority, appendLine, driveorder, + forceLBA, location, md5pass, password, upgrade) + + self.source = "" + + def _getArgsAsStr(self): + retval = Mic_Bootloader._getArgsAsStr(self) + + if self.source: + retval += " --source=%s" % self.source + + return retval + + def _getParser(self): + op = Mic_Bootloader._getParser(self) + # use specified source plugin to implement bootloader-specific methods + op.add_option("--source", type="string", action="store", + dest="source", default=None) + return op + -- cgit v1.2.3-54-g00ecf