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