blob: 7c1b30390e9fe4377e058186d30a21c4bbdfe2ab [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 \
David James985cd882011-08-21 10:02:30 -070019 -o UserKnownHostsFile=$TMP_KNOWN_HOSTS -o ConnectTimeout=120 \
20 -i $TMP_PRIVATE_KEY $1 root@$FLAGS_remote:$2)
Chris Sosaef964302010-04-27 13:21:08 -070021 return ${PIPESTATUS[0]}
22}
23
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070024# Copies a list of remote files specified in file $1 to local location
25# $2. Directory paths in $1 are collapsed into $2.
26function remote_rsync_from() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080027 rsync -e "ssh -p ${FLAGS_ssh_port} -o StrictHostKeyChecking=no \
David James985cd882011-08-21 10:02:30 -070028 -o UserKnownHostsFile=$TMP_KNOWN_HOSTS -o ConnectTimeout=120 \
29 -i $TMP_PRIVATE_KEY" \
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080030 --no-R --files-from=$1 root@${FLAGS_remote}:/ $2
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070031}
32
Ken Mixter689b9ee2010-01-07 18:23:52 -080033function remote_sh() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -080034 REMOTE_OUT=$(ssh -p ${FLAGS_ssh_port} -o StrictHostKeyChecking=no \
David James985cd882011-08-21 10:02:30 -070035 -o UserKnownHostsFile=$TMP_KNOWN_HOSTS -o ConnectTimeout=120 \
36 -i $TMP_PRIVATE_KEY root@$FLAGS_remote "$@")
Ken Mixter689b9ee2010-01-07 18:23:52 -080037 return ${PIPESTATUS[0]}
38}
39
40function remote_sh_allow_changed_host_key() {
41 rm -f $TMP_KNOWN_HOSTS
42 remote_sh "$@"
43}
44
45function set_up_remote_access() {
Ken Mixter689b9ee2010-01-07 18:23:52 -080046 cp $FLAGS_private_key $TMP_PRIVATE_KEY
47 chmod 0400 $TMP_PRIVATE_KEY
Ken Mixter689b9ee2010-01-07 18:23:52 -080048
49 # Verify the client is reachable before continuing
50 echo "Initiating first contact with remote host"
51 remote_sh "true"
52 echo "Connection OK"
53}
54
Ken Mixtercc4f1dd2010-08-31 12:07:11 -070055# Ask the target what board it is
56function learn_board() {
57 [ -n "${FLAGS_board}" ] && return
58 remote_sh grep CHROMEOS_RELEASE_BOARD /etc/lsb-release
59 FLAGS_board=$(echo "${REMOTE_OUT}" | cut -d '=' -f 2)
60 if [ -z "${FLAGS_board}" ]; then
61 error "Board required"
62 exit 1
63 fi
64 info "Target reports board is ${FLAGS_board}"
65}
66
Olof Johanssonf53fa0d2011-01-26 13:06:46 -080067function learn_arch() {
68 [ -n "${FLAGS_arch}" ] && return
69 remote_sh uname -m
Mandeep Singh Baines175422f2011-05-31 10:51:02 -070070 FLAGS_arch=$(echo "${REMOTE_OUT}" | sed -e s/armv7l/arm/ -e s/i686/x86/ )
Olof Johanssonf53fa0d2011-01-26 13:06:46 -080071 if [ -z "${FLAGS_arch}" ]; then
72 error "Arch required"
73 exit 1
74 fi
75 info "Target reports arch is ${FLAGS_arch}"
76}
77
Chris Sosa24da49e2011-02-01 17:06:12 -080078# Checks to see if pid $1 is running.
79function is_pid_running() {
80 ps -p ${1} 2>&1 > /dev/null
81}
Mandeep Singh Bainesa63cd2d2010-12-02 11:58:26 -080082
Chris Sosa24da49e2011-02-01 17:06:12 -080083# Wait function given an additional timeout argument.
84# $1 - pid to wait on.
85# $2 - timeout to wait for.
86function wait_with_timeout() {
87 local pid=$1
88 local timeout=$2
89 local -r TIMEOUT_INC=1
90 local current_timeout=0
91 while is_pid_running ${pid} && [ ${current_timeout} -lt ${timeout} ]; do
92 sleep ${TIMEOUT_INC}
93 current_timeout=$((current_timeout + TIMEOUT_INC))
94 done
95 ! is_pid_running ${pid}
96}
97
98# Checks to see if a machine has rebooted using the presence of a tmp file.
99function check_if_rebooted() {
100 local output_file="${TMP}/output"
Mandeep Singh Bainesa63cd2d2010-12-02 11:58:26 -0800101 while true; do
102 REMOTE_OUT=""
103 # This may fail while the machine is down so generate output and a
104 # boolean result to distinguish between down/timeout and real failure
105 ! remote_sh_allow_changed_host_key \
106 "echo 0; [ -e /tmp/awaiting_reboot ] && echo '1'; true"
107 echo "${REMOTE_OUT}" > "${output_file}"
108 if grep -q "0" "${output_file}"; then
109 if grep -q "1" "${output_file}"; then
110 info "Not yet rebooted"
Chris Sosa24da49e2011-02-01 17:06:12 -0800111 sleep .5
Mandeep Singh Bainesa63cd2d2010-12-02 11:58:26 -0800112 else
113 info "Rebooted and responding"
114 break
115 fi
116 fi
Chris Sosa24da49e2011-02-01 17:06:12 -0800117 done
118}
119
120function remote_reboot() {
121 info "Rebooting."
122 remote_sh "touch /tmp/awaiting_reboot; reboot"
123 while true; do
124 check_if_rebooted &
125 local pid=$!
126 wait_with_timeout ${pid} 30 && break
127 ! kill -9 ${pid} 2> /dev/null
Mandeep Singh Bainesa63cd2d2010-12-02 11:58:26 -0800128 done
129}
130
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -0800131# Called by clients before exiting.
132# Part of the remote_access.sh interface but now empty.
Sean O'Connor9969ce92010-02-01 17:10:03 -0800133function cleanup_remote_access() {
Mandeep Singh Bainesaef91ad2011-01-14 14:17:25 -0800134 true
Sean O'Connor9969ce92010-02-01 17:10:03 -0800135}
136
Ken Mixter689b9ee2010-01-07 18:23:52 -0800137function remote_access_init() {
138 TMP_PRIVATE_KEY=$TMP/private_key
139 TMP_KNOWN_HOSTS=$TMP/known_hosts
140 if [ -z "$FLAGS_remote" ]; then
141 echo "Please specify --remote=<IP-or-hostname> of the Chromium OS instance"
142 exit 1
143 fi
144 set_up_remote_access
145}