1*9c5db199SXin Li#!/bin/bash 2*9c5db199SXin Li 3*9c5db199SXin Li# Usage: 4*9c5db199SXin Li# servo-stat DUT ... 5*9c5db199SXin Li# 6*9c5db199SXin Li# Reports the status of the servo (if any) attached to the DUT. 7*9c5db199SXin Li# The DUT name is the host name without the .cros, or -servo. 8*9c5db199SXin Li# For each named DUT, reports a line something like this: 9*9c5db199SXin Li# DUT ...ABCDEFG is up BOARD=swanky CHROMEOS_RELEASE_VERSION=5995.0.0 10*9c5db199SXin Li# 11*9c5db199SXin Li# The letters are just arbitrary tags printed before any 12*9c5db199SXin Li# long-running operation that might time out. It allows you to see 13*9c5db199SXin Li# progress, and if things get hung up, you can see where. 14*9c5db199SXin Li 15*9c5db199SXin Li 16*9c5db199SXin Li# readlink -f $0, in case $0 is a symlink from somewhere else 17*9c5db199SXin LiREPO=$(dirname $(readlink -f $0))/../../../../.. 18*9c5db199SXin LiREPO=$(readlink -f $REPO) 19*9c5db199SXin LiPYTHON=$(readlink -f $REPO/chroot/usr/bin/python2.7) 20*9c5db199SXin LiHDCTOOLS=$(readlink -f $REPO/chroot/usr/lib/python2.7/site-packages/servo) 21*9c5db199SXin LiKEYFILE=$REPO 22*9c5db199SXin LiKEYFILE=$KEYFILE/src/third_party/chromiumos-overlay 23*9c5db199SXin LiKEYFILE=$KEYFILE/chromeos-base/chromeos-ssh-testkeys/files/testing_rsa 24*9c5db199SXin Li 25*9c5db199SXin Li# Need some temporary files to keep ssh happy: 26*9c5db199SXin Li# + Just setting StrictHostKeyChecking=no won't silence all 27*9c5db199SXin Li# possible errors about host keys, so we need a temporary file 28*9c5db199SXin Li# where host keys can be cached. 29*9c5db199SXin Li# + We don't want to require the user to edit or provide the 30*9c5db199SXin Li# standard test keys, so we use the keys from the repo. But... 31*9c5db199SXin Li# The file must be user-readable only, so we need a copy with 32*9c5db199SXin Li# the correct modes (mktemp is 600 by default). 33*9c5db199SXin Li 34*9c5db199SXin LiTMPKEYS=$(mktemp) 35*9c5db199SXin LiTMPHOSTS=$(mktemp) 36*9c5db199SXin Li 37*9c5db199SXin Litrap 'rm $TMPKEYS $TMPHOSTS' EXIT 38*9c5db199SXin Licp $KEYFILE $TMPKEYS 39*9c5db199SXin Li 40*9c5db199SXin Li_ssh() { 41*9c5db199SXin Li local ssh_opts=( -n -o BatchMode=yes -o StrictHostKeyChecking=no 42*9c5db199SXin Li -o UserKnownHostsFile=$TMPHOSTS -i $TMPKEYS ) 43*9c5db199SXin Li local timeout=$1 44*9c5db199SXin Li local servo=$2 45*9c5db199SXin Li shift 2 46*9c5db199SXin Li timeout "${timeout}" ssh "${ssh_opts[@]}" "root@${servo}" "$@" 47*9c5db199SXin Li} 48*9c5db199SXin Li 49*9c5db199SXin Lidut_control() { 50*9c5db199SXin Li local servo=$1 51*9c5db199SXin Li shift 52*9c5db199SXin Li _ssh 90 $servo dut-control "$@" 53*9c5db199SXin Li} 54*9c5db199SXin Li 55*9c5db199SXin Liremote() { 56*9c5db199SXin Li _ssh 45 "$@" 57*9c5db199SXin Li} 58*9c5db199SXin Li 59*9c5db199SXin Liget_afe_host_attr() { 60*9c5db199SXin Li local host=$1 61*9c5db199SXin Li local attr=$2 62*9c5db199SXin Li local default=$3 63*9c5db199SXin Li atest host stat $host | awk "/^$attr *: / {count++; print \$3} 64*9c5db199SXin Li END {if (count != 1) print \"$default\"}" 65*9c5db199SXin Li} 66*9c5db199SXin Li 67*9c5db199SXin Liget_servo() { 68*9c5db199SXin Li local host=$1 69*9c5db199SXin Li 70*9c5db199SXin Li # Get the servo host from the afe. If not present, infer it from the hostname. 71*9c5db199SXin Li local servo_host=$(get_afe_host_attr $host servo_host ${host}-servo) 72*9c5db199SXin Li echo ${servo_host}.cros 73*9c5db199SXin Li} 74*9c5db199SXin Li 75*9c5db199SXin Liget_servo_port() { 76*9c5db199SXin Li local host=$1 77*9c5db199SXin Li 78*9c5db199SXin Li # Get the servo port from the afe. If not present, default 9999. 79*9c5db199SXin Li get_afe_host_attr $host servo_port 9999 80*9c5db199SXin Li} 81*9c5db199SXin Li 82*9c5db199SXin Li 83*9c5db199SXin Li 84*9c5db199SXin Lifor H in "$@" 85*9c5db199SXin Lido 86*9c5db199SXin Li SERVO=$(get_servo $H) 87*9c5db199SXin Li SERVO_PORT=$(get_servo_port $H) 88*9c5db199SXin Li CONFIG=/var/lib/servod/config_$SERVO_PORT 89*9c5db199SXin Li echo -n "$H ..." 90*9c5db199SXin Li STATUS=() 91*9c5db199SXin Li 92*9c5db199SXin Li HAVE_SERVOD=1 93*9c5db199SXin Li BOARD= 94*9c5db199SXin Li VERSION= 95*9c5db199SXin Li 96*9c5db199SXin Li echo -n "A" 97*9c5db199SXin Li if ping -c1 -w2 $SERVO >/dev/null 2>&1 98*9c5db199SXin Li then 99*9c5db199SXin Li echo -n "B" 100*9c5db199SXin Li if BUTTON=$(dut_control $SERVO -p $SERVO_PORT pwr_button 2>/dev/null) 101*9c5db199SXin Li then 102*9c5db199SXin Li if [ "$BUTTON" != "pwr_button:release" ] 103*9c5db199SXin Li then 104*9c5db199SXin Li STATUS=("${STATUS[@]}" "pwr_button is '$BUTTON'") 105*9c5db199SXin Li else 106*9c5db199SXin Li echo -n "C" 107*9c5db199SXin Li LID=$(dut_control $SERVO -p $SERVO_PORT lid_open 2>/dev/null) 108*9c5db199SXin Li if [ "$LID" != "lid_open:yes" -a "$LID" != "lid_open:not_applicable" ] 109*9c5db199SXin Li then 110*9c5db199SXin Li STATUS=("${STATUS[@]}" "lid_open is '$LID'") 111*9c5db199SXin Li fi 112*9c5db199SXin Li fi 113*9c5db199SXin Li else 114*9c5db199SXin Li STATUS=("${STATUS[@]}" "not running servod") 115*9c5db199SXin Li HAVE_SERVOD=0 116*9c5db199SXin Li fi 117*9c5db199SXin Li 118*9c5db199SXin Li echo -n "D" 119*9c5db199SXin Li if ! remote $SERVO true >/dev/null 2>&1 120*9c5db199SXin Li then 121*9c5db199SXin Li STATUS=("${STATUS[@]}" "ssh is down") 122*9c5db199SXin Li else 123*9c5db199SXin Li echo -n "E" 124*9c5db199SXin Li VERSION=$( 125*9c5db199SXin Li remote $SERVO grep CHROMEOS_RELEASE_VERSION /etc/lsb-release 2>&1) 126*9c5db199SXin Li if [ -z "$VERSION" ] 127*9c5db199SXin Li then 128*9c5db199SXin Li STATUS=("${STATUS[@]}" "not running chromeos") 129*9c5db199SXin Li fi 130*9c5db199SXin Li fi 131*9c5db199SXin Li 132*9c5db199SXin Li if [ -n "$VERSION" ] 133*9c5db199SXin Li then 134*9c5db199SXin Li echo -n "F" 135*9c5db199SXin Li if remote $SERVO test -f $CONFIG 136*9c5db199SXin Li then 137*9c5db199SXin Li echo -n "G" 138*9c5db199SXin Li BOARD=$(remote $SERVO grep BOARD= $CONFIG) 139*9c5db199SXin Li fi 140*9c5db199SXin Li if [ $HAVE_SERVOD -eq 0 ] 141*9c5db199SXin Li then 142*9c5db199SXin Li if [ -z "$BOARD" ] 143*9c5db199SXin Li then 144*9c5db199SXin Li STATUS=("servod not configured") 145*9c5db199SXin Li else 146*9c5db199SXin Li echo -n "H" 147*9c5db199SXin Li JOB=$(remote $SERVO status servod | sed 's/,.*//') 148*9c5db199SXin Li if [ "$JOB" = "servod start/running" ] 149*9c5db199SXin Li then 150*9c5db199SXin Li STATUS=("servod failed") 151*9c5db199SXin Li fi 152*9c5db199SXin Li fi 153*9c5db199SXin Li fi 154*9c5db199SXin Li fi 155*9c5db199SXin Li else 156*9c5db199SXin Li STATUS=("${STATUS[@]}" "is down") 157*9c5db199SXin Li fi 158*9c5db199SXin Li 159*9c5db199SXin Li if [ "${#STATUS}" -eq 0 ] 160*9c5db199SXin Li then 161*9c5db199SXin Li STATUS=("is up") 162*9c5db199SXin Li fi 163*9c5db199SXin Li 164*9c5db199SXin Li if [ -n "$VERSION" ] 165*9c5db199SXin Li then 166*9c5db199SXin Li STATUS=("${STATUS[@]}" $BOARD $VERSION) 167*9c5db199SXin Li fi 168*9c5db199SXin Li echo " ${STATUS[@]}" 169*9c5db199SXin Lidone 170