blob: c7152cc832e5a6f3b3c05812dfe029ad631052dc [file] [log] [blame]
Ken Mixter689b9ee2010-01-07 18:23:52 -08001# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5# Library for setting up remote access and running remote commands.
6
Sean O'Connora6db82e2010-01-27 12:11:08 -08007DEFAULT_PRIVATE_KEY="${GCLIENT_ROOT}/src/scripts/mod_for_test_scripts/\
8ssh_keys/testing_rsa"
Ken Mixter689b9ee2010-01-07 18:23:52 -08009
10DEFINE_string remote "" "remote hostname/IP of running Chromium OS instance"
11DEFINE_string private_key "$DEFAULT_PRIVATE_KEY" \
12 "Private key of root account on remote host"
Zelidrag Hornung61d97682010-06-15 11:55:21 -070013DEFINE_integer ssh_port 22 \
14 "SSH port of the remote machine running Chromium OS instance"
Ken Mixter689b9ee2010-01-07 18:23:52 -080015
Chris Sosaef964302010-04-27 13:21:08 -070016# Copies $1 to $2 on remote host
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070017function remote_cp_to() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080018 REMOTE_OUT=$(scp -P ${FLAGS_ssh_port} -o StrictHostKeyChecking=no \
Chris Sosa637b5532011-01-24 14:48:02 -080019 -o ServerAliveInterval=60 -o UserKnownHostsFile=$TMP_KNOWN_HOSTS \
20 -i $TMP_PRIVATE_KEY $1 \
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080021 root@$FLAGS_remote:$2)
Chris Sosaef964302010-04-27 13:21:08 -070022 return ${PIPESTATUS[0]}
23}
24
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070025# Copies a list of remote files specified in file $1 to local location
26# $2. Directory paths in $1 are collapsed into $2.
27function remote_rsync_from() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080028 rsync -e "ssh -p ${FLAGS_ssh_port} -o StrictHostKeyChecking=no \
Chris Sosa637b5532011-01-24 14:48:02 -080029 -o ServerAliveInterval=60 -o UserKnownHostsFile=$TMP_KNOWN_HOSTS \
30 -i $TMP_PRIVATE_KEY" \
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080031 --no-R --files-from=$1 root@${FLAGS_remote}:/ $2
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070032}
33
Ken Mixter689b9ee2010-01-07 18:23:52 -080034function remote_sh() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080035 REMOTE_OUT=$(ssh -p ${FLAGS_ssh_port} -o StrictHostKeyChecking=no \
36 -o UserKnownHostsFile=$TMP_KNOWN_HOSTS -i $TMP_PRIVATE_KEY \
Chris Sosa637b5532011-01-24 14:48:02 -080037 -o ServerAliveInterval=60 \
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080038 root@$FLAGS_remote "$@")
Ken Mixter689b9ee2010-01-07 18:23:52 -080039 return ${PIPESTATUS[0]}
40}
41
42function remote_sh_allow_changed_host_key() {
43 rm -f $TMP_KNOWN_HOSTS
44 remote_sh "$@"
45}
46
47function set_up_remote_access() {
Ken Mixter689b9ee2010-01-07 18:23:52 -080048 cp $FLAGS_private_key $TMP_PRIVATE_KEY
49 chmod 0400 $TMP_PRIVATE_KEY
Ken Mixter689b9ee2010-01-07 18:23:52 -080050
51 # Verify the client is reachable before continuing
52 echo "Initiating first contact with remote host"
53 remote_sh "true"
54 echo "Connection OK"
55}
56
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070057# Ask the target what board it is
58function learn_board() {
59 [ -n "${FLAGS_board}" ] && return
60 remote_sh grep CHROMEOS_RELEASE_BOARD /etc/lsb-release
61 FLAGS_board=$(echo "${REMOTE_OUT}" | cut -d '=' -f 2)
62 if [ -z "${FLAGS_board}" ]; then
63 error "Board required"
64 exit 1
65 fi
66 info "Target reports board is ${FLAGS_board}"
67}
68
Olof Johanssonf53fa0d2011-01-26 13:06:46 -080069function learn_arch() {
70 [ -n "${FLAGS_arch}" ] && return
71 remote_sh uname -m
72 FLAGS_arch=$(echo "${REMOTE_OUT}" | sed s/armv7l/arm/g)
73 if [ -z "${FLAGS_arch}" ]; then
74 error "Arch required"
75 exit 1
76 fi
77 info "Target reports arch is ${FLAGS_arch}"
78}
79
Chris Sosa637b5532011-01-24 14:48:02 -080080function remote_reboot {
81 info "Rebooting."
82 remote_sh "touch /tmp/awaiting_reboot; reboot"
83 local output_file
84 output_file="${TMP}/output"
Mandeep Singh Bainesa63cd2d2010-12-02 11:58:26 -080085
86 while true; do
87 REMOTE_OUT=""
88 # This may fail while the machine is down so generate output and a
89 # boolean result to distinguish between down/timeout and real failure
90 ! remote_sh_allow_changed_host_key \
91 "echo 0; [ -e /tmp/awaiting_reboot ] && echo '1'; true"
92 echo "${REMOTE_OUT}" > "${output_file}"
93 if grep -q "0" "${output_file}"; then
94 if grep -q "1" "${output_file}"; then
95 info "Not yet rebooted"
96 else
97 info "Rebooted and responding"
98 break
99 fi
100 fi
Chris Sosa637b5532011-01-24 14:48:02 -0800101 sleep .5
Mandeep Singh Bainesa63cd2d2010-12-02 11:58:26 -0800102 done
103}
104
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -0800105# Called by clients before exiting.
106# Part of the remote_access.sh interface but now empty.
Sean O'Connor9969ce92010-02-01 17:10:03 -0800107function cleanup_remote_access() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -0800108 true
Sean O'Connor9969ce92010-02-01 17:10:03 -0800109}
110
Ken Mixter689b9ee2010-01-07 18:23:52 -0800111function remote_access_init() {
112 TMP_PRIVATE_KEY=$TMP/private_key
113 TMP_KNOWN_HOSTS=$TMP/known_hosts
114 if [ -z "$FLAGS_remote" ]; then
115 echo "Please specify --remote=<IP-or-hostname> of the Chromium OS instance"
116 exit 1
117 fi
118 set_up_remote_access
119}