Source

vinstall / vinstall / controller / bootloader.py

Full commit
#-*- coding: utf-8 -*-

"""Bootloader options for the Vector installer

"""


from vinstall.core import Render, Controller, model
from vinstall.backend.media import Disk, Partition
from vinstall.backend import bootloader, utils, sp
from itertools import chain
import os


class Bootloader(Controller):
    """Select a bootloader

    """
    def init(self):
        """Find the disks available in the system.

        """
        self.disks = [ i for i in Disk.all() if not i.is_read_only() ]
        self.partitions = [ i for i in Partition.all() if i.query_filesystem()
                != "xfs" ]
        self.targets = self.disks + self.partitions
        self.bootloaders = [ u"Lilo", u"Grub2", u"None" ]

    def render(self):
        """Show bootloader options

        """
        title = u"Bootloader"
        intro = u"Select a bootloader to boot your system"

        bootloaders = model.DropdownOptionList()
        bootloaders.label = u"Select a bootloader"
        for i in self.bootloaders:
            bootloaders.add_option(i)

        location = model.DropdownOptionList()
        location.label = u"Install the bootloader in"
        for i in self.targets:
            location.add_option(unicode(i))

        return Render(title, intro, bootloaders, location)

    def next(self):
        """Return next step

        """
        return None

    def previous(self):
        """Return previous step

        """
        from vinstall.controller import usersetup
        return usersetup.UserSetup

    def command(self, bootloader, target):
        """Schedule command for later execution

        """
        yield self.set_bind_mounts, tuple(), "Mounting pseudo filesystems"
        yield self.install_bootloader, (bootloader, target), "Installing bootloader"
        yield self.clear_bind_mounts, tuple(), "Clearing bind mounts"

    def install_bootloader(self, bloader, target):
        """Install the bootloader

        """
        bloader = self.bootloaders[bloader]
        disk = self.targets[target]
        target = disk.path()

        if bloader.lower() == "lilo":
            bl = bootloader.Lilo(target)
            for system in bootloader.OperatingSystem.all():
                bl.add_os(system)
	    sequence = (bl.backup_config, bl.write_config, bl.install)
        elif bloader == "Grub2":
            bl = bootloader.Grub2(target)
	    sequence = (bl.backup_config, bl.install, bl.write_config)
        else:
            return

        with utils.Chroot("/mnt/TARGET"):
	    for meth in sequence:
		meth()
#            bl.backup_config()
#            bl.write_config()
#            bl.install()

    def set_bind_mounts(self):
        """Bind mount some paths into the target.
        Later steps will need this when we chroot there

        """
        for point in ("sys","proc","dev"):
            cmd = "mount -o bind /%s /mnt/TARGET/%s" % (point, point)
            sp.check_call(cmd.split())

    def clear_bind_mounts(self):
        """Clear the mountpoints that were mounted for the configuration

        """
        for mpoint in ("sys","proc","dev"):
            cmd = "umount -f /mnt/TARGET/%s" % mpoint
            sp.check_call(cmd.split())