#!/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 dut_control() { timeout 90 $PYTHON $HDCTOOLS/dut_control.py "$@" } remote() { local ssh_opts=( -n -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=$TMPHOSTS -i $TMPKEYS ) local servo=$1 shift timeout 45 ssh "${ssh_opts[@]}" root@$servo "$@" } 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 -s $SERVO -p $SERVO_PORT pwr_button 2>&1) then if [ "$BUTTON" != "pwr_button:release" ] then STATUS=("${STATUS[@]}" "pwr_button is '$BUTTON'") else echo -n "C" LID=$(dut_control -s $SERVO -p $SERVO_PORT lid_open 2>&1) 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