170 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/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
 |