1#!/bin/sh
2
3# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7# What this script does:
8# ----------------------
9# (1) run machine_replay.sh on the remote machine to replay the gestures
10#     and to generate new logs,
11# (2) remove the old logs in tests/logs/ for every board on the host, and
12# (3) scp the new logs from the machine into the proper board on the host.
13#
14# Note: this script needs to be invoked in the firmware_TouchMTB home directory:
15#       .../autotest/files/client/site_tests/firmware_TouchMTB
16#       inside chroot on the host.
17#
18# Usage:
19#   (cr) .../firmware_TouchMTB $ tools/host_replay.sh -m $MACHINE_IP -s
20# Example:
21#   (cr) .../firmware_TouchMTB $ tools/host_replay.sh -m 172.30.210.110 -s
22
23
24# Confirm that current working directory is firmware_TouchMTB.
25PROG=$0
26BASE_PROJ="firmware_TouchMTB"
27if [ `basename $(realpath .)` != "$BASE_PROJ" ]; then
28  echo "You need to execute $PROG under $BASE_PROJ on the host."
29  exit 1
30fi
31
32# Source the local common script.
33. "$(dirname "$PROG")/firmware_common.sh" || exit 1
34
35# Source the cros common script and assert that this is inside chroot.
36source_cros_common_script
37assert_inside_chroot
38
39
40# Read command flags
41. /usr/share/misc/shflags
42DEFINE_string machine_ip "" "the machine ip address" "m"
43
44FLAGS_HELP="USAGE: $PROG [flags]"
45
46FLAGS "$@" || exit 1
47eval set -- "${FLAGS_ARGV}"
48set -e
49
50# Check if the machine ip has been specified.
51if [ -z $FLAGS_machine_ip ]; then
52  echo You need to specify the machine ip with the option '"-m"'. E.g.;
53  echo -e "(cr) $ tools/host_replay.sh -m 10.20.30.40\n"
54  exit 1
55fi
56
57
58MACHINE_PROJ_DIR="/usr/local/autotest/tests/$BASE_PROJ"
59MACHINE_LOG_ROOT="/tmp/touch_firmware_test"
60MACHINE_REPLAY="tools/machine_replay.sh"
61HOST_TMP_LOG_DIR="/tmp/touch_firmware_logs"
62
63
64# Invoke the machine replay script.
65run_remote_machine_replay() {
66  echo Replaying on the machine_ip: $FLAGS_machine_ip
67  ssh root@$FLAGS_machine_ip "${MACHINE_PROJ_DIR}/${MACHINE_REPLAY} -b $board"
68}
69
70
71# Remove the old log files on the host.
72# There usually exist multiple sub-directories for multiple rounds
73# (generated by the robot or manually) for every board.
74# We allow only a log file in every round. Since the new log files are
75# to be generated in next step, we need to remove the old log ones here.
76# Otherwise, it becomes a bit difficult to determine which one is
77# the old log file in every round sub-directory to remove manually.
78# These new logs are supposed to be checked in to gerrit so that the
79# unit tests can be run correctly.
80remove_old_logs_on_host() {
81  log_files=$(find ${board} -name "*.log" -type f 2>/dev/null)
82  # Since there are multiple filenames in $log_files, note that
83  # there should be no double quotes around $log_files after git rm.
84  [ -n "$log_files" ] && git rm $log_files
85}
86
87
88# Scp the new logs from the machine to the host.
89scp_logs_from_machine_to_host() {
90  # Get the new log files generated on the machine side.
91  LOG_PATHNAMES=`ssh root@$FLAGS_machine_ip "ls ${MACHINE_LOG_ROOT}/*/*.log"`
92
93  make_empty_dir "$HOST_TMP_LOG_DIR"
94  scp root@$FLAGS_machine_ip:"${MACHINE_LOG_ROOT}"/*/*.log "$HOST_TMP_LOG_DIR"
95  for file in $LOG_PATHNAMES; do
96    # Read the log base directories and the log filenames so that we know
97    # how to copy the files into the proper paths on the host.
98    read log_dir log_file <<< `echo $file | awk -F/ 'BEGIN{OFS=" ";} \
99                                                     {print $(NF-1), $NF;}'`
100    cp "${HOST_TMP_LOG_DIR}/${log_file}" "${board}/${log_dir}/${log_file}"
101  done
102  rm -fr "$HOST_TMP_LOG_DIR"
103}
104
105
106boards=`find tests/logs/* -maxdepth 0 -type d`
107for board in $boards; do
108  run_remote_machine_replay
109  remove_old_logs_on_host
110  scp_logs_from_machine_to_host
111done
112