普通文本  |  68行  |  1.94 KB

#
# Copyright 2007 Google Inc. Released under the GPL v2

"""
This module defines the Bootloader class.

        Bootloader: a program to boot Kernels on a Host.
"""

import os, weakref
from autotest_lib.client.common_lib import error, boottool
from autotest_lib.server import utils

BOOTTOOL_SRC = '../client/tools/boottool'  # Get it from autotest client


class Bootloader(boottool.boottool):
    """
    This class gives access to a host's bootloader services.

    It can be used to add a kernel to the list of kernels that can be
    booted by a bootloader. It can also make sure that this kernel will
    be the one chosen at next reboot.
    """

    def __init__(self, host):
        super(Bootloader, self).__init__()
        self._host = weakref.ref(host)
        self._boottool_path = None


    def set_default(self, index):
        if self._host().job:
            self._host().job.last_boot_tag = None
        super(Bootloader, self).set_default(index)


    def boot_once(self, title):
        if self._host().job:
            self._host().job.last_boot_tag = title

        super(Bootloader, self).boot_once(title)


    def _install_boottool(self):
        if self._host() is None:
            raise error.AutoservError(
                "Host does not exist anymore")
        tmpdir = self._host().get_tmp_dir()
        self._host().send_file(os.path.abspath(os.path.join(
                utils.get_server_dir(), BOOTTOOL_SRC)), tmpdir)
        self._boottool_path= os.path.join(tmpdir,
                os.path.basename(BOOTTOOL_SRC))


    def _get_boottool_path(self):
        if not self._boottool_path:
            self._install_boottool()
        return self._boottool_path


    def _run_boottool(self, *options):
        cmd = self._get_boottool_path()
        # FIXME: add unsafe options strings sequence to host.run() parameters
        for option in options:
            cmd += ' "%s"' % utils.sh_escape(option)
        return self._host().run(cmd).stdout