You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
4.2 KiB
170 lines
4.2 KiB
#!/bin/bash
|
|
|
|
# Usage:
|
|
# servo-stat DUT ...
|
|
#
|
|
# Reports the status of the servo (if any) attached to the DUT.
|
|
# The DUT name is the host name without the .cros, or -servo.
|
|
# For each named DUT, reports a line something like this:
|
|
# DUT ...ABCDEFG is up BOARD=swanky CHROMEOS_RELEASE_VERSION=5995.0.0
|
|
#
|
|
# The letters are just arbitrary tags printed before any
|
|
# long-running operation that might time out. It allows you to see
|
|
# progress, and if things get hung up, you can see where.
|
|
|
|
|
|
# readlink -f $0, in case $0 is a symlink from somewhere else
|
|
REPO=$(dirname $(readlink -f $0))/../../../../..
|
|
REPO=$(readlink -f $REPO)
|
|
PYTHON=$(readlink -f $REPO/chroot/usr/bin/python2.7)
|
|
HDCTOOLS=$(readlink -f $REPO/chroot/usr/lib/python2.7/site-packages/servo)
|
|
KEYFILE=$REPO
|
|
KEYFILE=$KEYFILE/src/third_party/chromiumos-overlay
|
|
KEYFILE=$KEYFILE/chromeos-base/chromeos-ssh-testkeys/files/testing_rsa
|
|
|
|
# Need some temporary files to keep ssh happy:
|
|
# + Just setting StrictHostKeyChecking=no won't silence all
|
|
# possible errors about host keys, so we need a temporary file
|
|
# where host keys can be cached.
|
|
# + We don't want to require the user to edit or provide the
|
|
# standard test keys, so we use the keys from the repo. But...
|
|
# The file must be user-readable only, so we need a copy with
|
|
# the correct modes (mktemp is 600 by default).
|
|
|
|
TMPKEYS=$(mktemp)
|
|
TMPHOSTS=$(mktemp)
|
|
|
|
trap 'rm $TMPKEYS $TMPHOSTS' EXIT
|
|
cp $KEYFILE $TMPKEYS
|
|
|
|
_ssh() {
|
|
local ssh_opts=( -n -o BatchMode=yes -o StrictHostKeyChecking=no
|
|
-o UserKnownHostsFile=$TMPHOSTS -i $TMPKEYS )
|
|
local timeout=$1
|
|
local servo=$2
|
|
shift 2
|
|
timeout "${timeout}" ssh "${ssh_opts[@]}" "root@${servo}" "$@"
|
|
}
|
|
|
|
dut_control() {
|
|
local servo=$1
|
|
shift
|
|
_ssh 90 $servo dut-control "$@"
|
|
}
|
|
|
|
remote() {
|
|
_ssh 45 "$@"
|
|
}
|
|
|
|
get_afe_host_attr() {
|
|
local host=$1
|
|
local attr=$2
|
|
local default=$3
|
|
atest host stat $host | awk "/^$attr *: / {count++; print \$3}
|
|
END {if (count != 1) print \"$default\"}"
|
|
}
|
|
|
|
get_servo() {
|
|
local host=$1
|
|
|
|
# Get the servo host from the afe. If not present, infer it from the hostname.
|
|
local servo_host=$(get_afe_host_attr $host servo_host ${host}-servo)
|
|
echo ${servo_host}.cros
|
|
}
|
|
|
|
get_servo_port() {
|
|
local host=$1
|
|
|
|
# Get the servo port from the afe. If not present, default 9999.
|
|
get_afe_host_attr $host servo_port 9999
|
|
}
|
|
|
|
|
|
|
|
for H in "$@"
|
|
do
|
|
SERVO=$(get_servo $H)
|
|
SERVO_PORT=$(get_servo_port $H)
|
|
CONFIG=/var/lib/servod/config_$SERVO_PORT
|
|
echo -n "$H ..."
|
|
STATUS=()
|
|
|
|
HAVE_SERVOD=1
|
|
BOARD=
|
|
VERSION=
|
|
|
|
echo -n "A"
|
|
if ping -c1 -w2 $SERVO >/dev/null 2>&1
|
|
then
|
|
echo -n "B"
|
|
if BUTTON=$(dut_control $SERVO -p $SERVO_PORT pwr_button 2>/dev/null)
|
|
then
|
|
if [ "$BUTTON" != "pwr_button:release" ]
|
|
then
|
|
STATUS=("${STATUS[@]}" "pwr_button is '$BUTTON'")
|
|
else
|
|
echo -n "C"
|
|
LID=$(dut_control $SERVO -p $SERVO_PORT lid_open 2>/dev/null)
|
|
if [ "$LID" != "lid_open:yes" -a "$LID" != "lid_open:not_applicable" ]
|
|
then
|
|
STATUS=("${STATUS[@]}" "lid_open is '$LID'")
|
|
fi
|
|
fi
|
|
else
|
|
STATUS=("${STATUS[@]}" "not running servod")
|
|
HAVE_SERVOD=0
|
|
fi
|
|
|
|
echo -n "D"
|
|
if ! remote $SERVO true >/dev/null 2>&1
|
|
then
|
|
STATUS=("${STATUS[@]}" "ssh is down")
|
|
else
|
|
echo -n "E"
|
|
VERSION=$(
|
|
remote $SERVO grep CHROMEOS_RELEASE_VERSION /etc/lsb-release 2>&1)
|
|
if [ -z "$VERSION" ]
|
|
then
|
|
STATUS=("${STATUS[@]}" "not running chromeos")
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$VERSION" ]
|
|
then
|
|
echo -n "F"
|
|
if remote $SERVO test -f $CONFIG
|
|
then
|
|
echo -n "G"
|
|
BOARD=$(remote $SERVO grep BOARD= $CONFIG)
|
|
fi
|
|
if [ $HAVE_SERVOD -eq 0 ]
|
|
then
|
|
if [ -z "$BOARD" ]
|
|
then
|
|
STATUS=("servod not configured")
|
|
else
|
|
echo -n "H"
|
|
JOB=$(remote $SERVO status servod | sed 's/,.*//')
|
|
if [ "$JOB" = "servod start/running" ]
|
|
then
|
|
STATUS=("servod failed")
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
else
|
|
STATUS=("${STATUS[@]}" "is down")
|
|
fi
|
|
|
|
if [ "${#STATUS}" -eq 0 ]
|
|
then
|
|
STATUS=("is up")
|
|
fi
|
|
|
|
if [ -n "$VERSION" ]
|
|
then
|
|
STATUS=("${STATUS[@]}" $BOARD $VERSION)
|
|
fi
|
|
echo " ${STATUS[@]}"
|
|
done
|