# # 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