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
17REPO=$(dirname $(readlink -f $0))/../../../../..
18REPO=$(readlink -f $REPO)
19PYTHON=$(readlink -f $REPO/chroot/usr/bin/python2.7)
20HDCTOOLS=$(readlink -f $REPO/chroot/usr/lib/python2.7/site-packages/servo)
21KEYFILE=$REPO
22KEYFILE=$KEYFILE/src/third_party/chromiumos-overlay
23KEYFILE=$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
34TMPKEYS=$(mktemp)
35TMPHOSTS=$(mktemp)
36
37trap 'rm $TMPKEYS $TMPHOSTS' EXIT
38cp $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
49dut_control() {
50  local servo=$1
51  shift
52  _ssh 90 $servo dut-control "$@"
53}
54
55remote() {
56  _ssh 45 "$@"
57}
58
59get_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
67get_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
75get_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
84for H in "$@"
85do
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[@]}"
169done
170