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