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