summaryrefslogtreecommitdiffstats
path: root/build_tools/larch7/larch0/cli/live_part.py
diff options
context:
space:
mode:
Diffstat (limited to 'build_tools/larch7/larch0/cli/live_part.py')
-rwxr-xr-xbuild_tools/larch7/larch0/cli/live_part.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/build_tools/larch7/larch0/cli/live_part.py b/build_tools/larch7/larch0/cli/live_part.py
new file mode 100755
index 0000000..22af5d3
--- /dev/null
+++ b/build_tools/larch7/larch0/cli/live_part.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+#
+# live_part.py
+#
+# (c) Copyright 2009 - 2010 Michael Towers (larch42 at googlemail dot com)
+#
+# This file is part of the larch project.
+#
+# larch 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.
+#
+# larch 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 larch; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#----------------------------------------------------------------------------
+# 2010.07.18
+
+# This is a command line script to prepare a larch live medium from an
+# already larchified Arch Linux installation, or another larch medium.
+# Parameters are passed as options and arguments.
+
+import os
+from config import *
+from backend import *
+from media_common import *
+
+
+def build_partition(options, devicename):
+ """Install the larchified system to the partition specified by the
+ options.
+ 'devicename' is the name (e.g. 'sdb1', without '/dev/') of the
+ partition to receive the larch image
+ """
+ medium = Medium(options)
+ ipath = medium.chrootpath
+ build = medium.build
+
+ # Check and format device
+ device = '/dev/' + devicename
+ if not os.path.exists(device):
+ errout(_("Invalid device: %s") % device)
+ if options.format:
+ # label
+ if options.syslinux:
+ labellength = 11
+ opt = 'n'
+ else:
+ labellength = 16
+ opt = 'L'
+ l = ('-%s "%s"' % (opt, check_label(options.label, labellength))
+ if options.label else '')
+ # set partition type, reload partition table, and format
+ if not (chroot(ipath, 'bash -c "echo -e \',,%s,*\\n\' |'
+ ' sfdisk --no-reread %s -N%s"' %
+ ('0c' if options.syslinux else 'L',
+ device[:8], device[8:]), ['dev'])
+ and chroot(ipath, 'partprobe %s' % device[:8], ['dev'])
+ and chroot(ipath, 'mkfs.%s %s %s' %
+ ('vfat' if options.syslinux else 'ext2', l, device),
+ ['dev'])):
+
+ errout(_("Couldn't format %s") % device)
+
+ # Need to get the label - if not formatting (an option for experts)
+ # it is probably not a good idea to change the volume label, so
+ # use the old one.
+ label = medium.get_device_label(device)
+
+ # Check device format
+ ok, lines = runcmd('blkid -c /dev/null -o value -s TYPE %s' % device)
+ if not ok:
+ errout(_("Couldn't get format information for %s") % device)
+ fstype = lines[0]
+ if options.syslinux:
+ if fstype != 'vfat':
+ errout(_("syslinux is only supported on vfat"))
+ elif not fstype.startswith('ext'):
+ errout(_("GRUB is at present only supported on extN"))
+
+ # Rename the syslinux boot directory if necessary
+ if os.path.isdir(build + '/boot/isolinux'):
+ runcmd('mv %s/boot/isolinux %s/boot/syslinux' % (build, build))
+ # Write bootloader configuration file
+ bootconfig(build, options.syslinux, label, device, options.detection)
+
+ # Mount partition and remove larch and boot dirs
+ runcmd('rm -rf %s' % MP)
+ runcmd('mkdir -p %s' % MP)
+ if not mount(device, MP):
+ errout(_("Couldn't mount larch partition, %s") % device)
+ runcmd('rm -rf %s/larch' % MP)
+ runcmd('rm -rf %s/boot' % MP)
+
+ # Copy files to device
+ runcmd('cp -r %s/larch %s' % (medium.medium_dir, MP))
+ runcmd('cp -r %s/boot %s' % (build, MP))
+ medium.unmount()
+
+ # To boot in 'search' mode the file larch/larchboot must be present
+ # (though at present this is only relevant for partitions, CDs will
+ # be booted even without this file).
+ # To enable session saving the file larch/save must be present
+ # (only relevant if not building an iso).
+ runcmd('bash -c "rm -f %s/larch/{larchboot,save}"' % MP)
+ if options.larchboot:
+ add_larchboot(MP)
+
+ if options.nosave:
+ if options.save:
+ errout(_("Option '-a' conflicts with option '-A'"))
+ ssave = False
+ else:
+ ssave = not os.path.isfile(MP + '/larch/nosave')
+
+ if options.save or ssave:
+ writefile("The presence of the file 'larch/save'"
+ " enables session saving.\n", MP + '/larch/save')
+
+ # Unmount partition
+ unmount(MP)
+
+ # Now set up bootloader in MBR
+ if options.mbr:
+ if options.syslinux:
+ runcmd('dd if=%s/boot/syslinux/mbr.bin of=%s'
+ % (build, device[:8]))
+ chroot(ipath, 'syslinux %s' % device, ('dev', 'proc'))
+ else:
+ script('larch-mbr-grub %s %s' % (ipath if ipath else '/', device))
+ runcmd('rm -rf %s' % build)
+ comment(" *** %s ***" % (_("%s was successfully written") % device))
+
+
+
+if __name__ == '__main__':
+ start_translator()
+
+ from optparse import OptionParser, OptionGroup
+ parser = OptionParser(usage=_("usage: %prog [options] partition"
+ " (e.g. sdb1)"))
+
+ parser.add_option("-p", "--profile", action="store", type="string",
+ default="", dest="profile",
+ help=_("Profile: 'user:profile-name' or path to profile directory"
+ " (conflicts with -S)"))
+ parser.add_option("-S", "--source", action="store", type="string",
+ default="", dest="source",
+ help=_("Source: path to larch medium image (conflicts with -p)."
+ " It can also be a device ('/dev/...') or an 'iso' file."))
+ parser.add_option("-i", "--installation-dir", action="store", type="string",
+ default="", dest="idir",
+ help=_("Path to larchified directory (default %s)") % INSTALLATION)
+ parser.add_option("-s", "--slave", action="store_true", dest="slave",
+ default=False, help=_("Run as a slave from a controlling program"
+ " (e.g. from a gui)"))
+ parser.add_option("-q", "--quiet", action="store_true", dest="quiet",
+ default=False, help=_("Suppress output messages, except errors"
+ " (no effect if -s specified)"))
+
+ parser.add_option("-f", "--force", action="store_true", dest="force",
+ default=False, help=_("Don't ask for confirmation"))
+
+ parser.add_option("-d", "--detect", action="store", type="string",
+ default="label", dest="detection",
+ help=(_("Method for boot partition detection: %s (default: label)")
+ % detection_methods))
+ parser.add_option("-b", "--syslinux", action="store_true", dest="syslinux",
+ default=False, help=_("Use the syslinux bootloader"
+ " (the default is GRUB)"))
+ parser.add_option("-l", "--label", action="store", type="string",
+ default=LABEL, dest="label",
+ help=_("Volume label for boot partition (default %s)")
+ % LABEL)
+ parser.add_option("-n", "--nosearchboot", action="store_false",
+ dest="larchboot", default=True,
+ help=_("Don't generate 'larch/larchboot' file"))
+ parser.add_option("-a", "--save", action="store_true",
+ dest="save", default=False,
+ help=_("Override profile larch/nosave"
+ " (force enable session saving) - conflicts with '-A'"))
+ parser.add_option("-A", "--nosave", action="store_true",
+ dest="nosave", default=False,
+ help=_("Force disabling of session saving - conflicts with '-a'"))
+ parser.add_option("-x", "--noformat", action="store_false",
+ dest="format", default=True,
+ help=_("Don't format partition (only for experts!)"))
+ parser.add_option("-m", "--noboot", action="store_false",
+ dest="mbr", default=True,
+ help=_("Don't install the bootloader (to the MBR)"))
+ parser.add_option("-C", "--chroot", action="store_true",
+ dest="chroot", default=False,
+ help=_("Use chroot for build (default when -S not specified)"))
+ parser.add_option("-c", "--nochroot", action="store_true",
+ dest="nochroot", default=False,
+ help=_("Don't use chroot for build (default when -S specified)"))
+
+ (options, args) = parser.parse_args()
+
+ # To avoid error messages
+ options.testmedium = False
+ options.setdir = ''
+
+ if not args:
+ print _("You must specify the partition to receive larch\n")
+ parser.print_help()
+ sys.exit(1)
+
+ if os.getuid() != 0:
+ print _("This application must be run as root")
+ sys.exit(1)
+
+ init('live_part', options)
+ build_partition(options, devicename=args[0])