xref: /aosp_15_r20/external/autotest/autotest_lib/contrib/servo-stat (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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