blob: d4326453c070a08630b5c5f5fb8af90c02caeb65 [file] [log] [blame]
#!/bin/sh
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This script is run at postinstall phase of Chrome OS installation process.
# It checks if the currently running cr50 image is ready to accept a
# background update and if the resident trunks_send utility is capable of
# updating the H1. If any of the checks fails, the script exits, otherwise it
# tries updating the H1 with the new cr50 image.
script_name="$(basename "$0")"
script_dir="$(dirname "$0")"
pid="$$"
. "${script_dir}/cr50-get-name.sh"
# The mount point of the new image is passed in as the first parameter.
root="$1"
logit() {
# TODO(vbendeb): use proper logger invocation once logger is fixed.
logger -t "${script_name}" --id="${pid}" -- "$@"
}
logit "Starting"
GSCTOOL="/usr/sbin/gsctool"
# Let's determine the best way to communicate with the Cr50.
if "${GSCTOOL}" -f > /dev/null 2>&1; then
logit "Will use USB interface"
UPDATER="${GSCTOOL}"
elif "${GSCTOOL}" -f -s > /dev/null 2>&1; then
logit "Will use /dev/tpm0"
UPDATER="${GSCTOOL} -s"
elif "${GSCTOOL}" -f -t > /dev/null 2>&1; then
logit "Will use trunks_send"
UPDATER="${GSCTOOL} -t"
else
logit "Could not communicate with Cr50"
exit 1
fi
CR50_IMAGE="$(cr50_get_name "${UPDATER}")"
if [ ! -f "${CR50_IMAGE}" ]; then
logit "${CR50_IMAGE} not found, quitting."
exit 1
fi
retries=0
while true; do
output="$(${UPDATER} -u "${CR50_IMAGE}" 2>&1)"
exit_status="$?"
if [ "${exit_status}" -le 2 ]; then
# Exit status values 2 or below indicate successful update, nonzero
# values mean that reboot is required for the new version to kick in.
logit "success (${exit_status})"
# Callers of this script do not care about the details and consider any
# non-zero value an error.
exit_status=0
break
fi
: $(( retries += 1 ))
logit "${UPDATER} attempt ${retries} error ${exit_status}"
# Log output text one line at a time, otherwise they are all concatenated
# into a single long entry with messed up line breaks.
echo "${output}" | while read -r line; do
logit "${line}"
done
if [ "${retries}" -gt 2 ]; then
break
fi
# Need to sleep for at least a minute to get around cr50 update throttling:
# it rejects repeat update attempts happening sooner than 60 seconds after
# the previous one.
sleep 70
done
exit "${exit_status}"