67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
# Copyright 2014 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import os
|
|
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.common_lib import error
|
|
|
|
|
|
def get_install_path(filename, host=None):
|
|
"""
|
|
Checks if a file exists on a remote machine in one of several paths.
|
|
|
|
@param filename String name of the file to check for existence.
|
|
@param host Host object representing the remote machine.
|
|
@return String full path of installed file, or None if not found.
|
|
|
|
"""
|
|
run = utils.run
|
|
if host is not None:
|
|
run = host.run
|
|
PATHS = ['/bin',
|
|
'/sbin',
|
|
'/system/bin',
|
|
'/system/xbin',
|
|
'/usr/bin',
|
|
'/usr/sbin',
|
|
'/usr/local/bin',
|
|
'/usr/local/sbin']
|
|
glob_list = [os.path.join(path, filename) for path in PATHS]
|
|
# Some hosts have poor support for which. Sometimes none.
|
|
# Others have shells that can't perform advanced globbing.
|
|
result = host.run('ls %s 2> /dev/null' % ' '.join(glob_list),
|
|
ignore_status=True)
|
|
found_path = result.stdout.split('\n')[0].strip()
|
|
return found_path or None
|
|
|
|
|
|
def must_be_installed(cmd, host=None):
|
|
"""
|
|
Asserts that cmd is installed on a remote machine at some path and raises
|
|
an exception if this is not the case.
|
|
|
|
@param cmd String name of the command to check for existence.
|
|
@param host Host object representing the remote machine.
|
|
@return String full path of cmd on success. Error raised on failure.
|
|
|
|
"""
|
|
run = utils.run
|
|
if host is not None:
|
|
run = host.run
|
|
if run('ls %s >/dev/null 2>&1' % cmd,
|
|
ignore_status=True).exit_status == 0:
|
|
return cmd
|
|
|
|
# Hunt for the equivalent file in a bunch of places.
|
|
cmd_base = os.path.basename(cmd)
|
|
alternate_path = get_install_path(cmd_base, host=host)
|
|
if alternate_path:
|
|
return alternate_path
|
|
|
|
error_msg = 'Unable to find %s' % cmd
|
|
if host is not None:
|
|
error_msg += ' on %s' % host.hostname
|
|
raise error.TestError(error_msg)
|