blob: 9e44cfb76bbe70b99a4da96285f32590c5a8c700 [file] [log] [blame]
#!/bin/bash
#
# 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.
#
# script to automate the setup steps for 1.6.8 Key increment testing test case
#
# Sample content of conf file
cat <<EOF > /dev/null
# name of the board
BOARD="veyron_jerry"
# Directory where you run cros_sdk
CHROMIUMOS_DIR="/disk2/chromiumos3/"
# location of chromiumos image
IMAGE="/u/dchan/Downloads/jerry/chromiumos_test_image.bin"
# location of the BIOS bin image
BIOS="/u/dchan/Downloads/jerry/image.bin"
LOGS="/u/dchan/Downloads/"
# DUT ip address
DUT_IP="100.96.48.138"
# get_payload uses different name for board.
# BOARD_PAYLOAD="veyron-jerry"
# If you want to bypass the default get_payloads.par
# GETPAYLOAD="/google/data/ro/teams/chromeos-testing/get_payloads.par"
# If you want to bypass the auto generated version string from cros image.
# IMAGE_VER=6812.42.0
# IMAGE_VER_NOSUFFIX=6812.42
# If you want to use a different channel
# CHANNEL=dev
EOF
log()
{
echo -e $(date '+[%H%M%S-%m%d]') "$*"
}
generate_payload()
{
#
# Generate payload in /tmp/key_increment_working_folder
#
log
log ========== generate_payload ==========
log Copy image $IMAGE to chroot...
cp $IMAGE $CHROMIUMOS_DIR/chroot/tmp/chromiumos_test_image.bin || exit 1
log Copy bios $BIOS to chroot...
cp $BIOS $CHROMIUMOS_DIR/chroot/tmp/image.bin || exit 1
# Create script to run inside chroot
log Create /tmp/prepbin.sh inside chroot.
cat <<EOF > $CHROMIUMOS_DIR/chroot/tmp/prepbin.sh
#!/bin/bash
BOARD=$BOARD
IMAGE=/tmp/chromiumos_test_image.bin
BIOS=/tmp/image.bin
BIOS_STR=$BIOS_STR
BIOS_VER=$BIOS_VER
cd ~/trunk/src/platform/dev/
git log fm_and_key_version_test_prep.sh \
| grep b681c97226e4e485823e391413208eaa61563291 > /dev/null
if [ \$? -ne 0 ]; then
echo =======================================================
echo Your fm_and_key_version_test_prep.sh does not contain the
echo latest change to work in this script. Please try Tot.
echo =======================================================
exit 1
fi
echo Running from chroot \$(pwd)
cmd="./fm_and_key_version_test_prep.sh -b $BOARD_PAYLOAD -i /tmp/chromiumos_test_image.bin -f $BIOS_VER -s /tmp/image.bin -v $BIOS_STR"
\$cmd > /tmp/fm_and_key.out 2>&1
PAYLOAD_BIN="/tmp/key_increment_working_folder/bios/${BOARD_PAYLOAD}_${BIOS_VER}.1_signed.bin"
CK_VER_STR=\$(strings \$PAYLOAD_BIN | grep -m1 '^Google_')
if [ "\$CK_VER_STR" != "\${BIOS_STR}.test1" ]; then
echo resulting test perp version mismatch
echo \$PAYLOAD_BIN version is \$CK_VER_STR, expects \${BIOS_STR}.test1
echo Please investigate.
exit 1
fi
EOF
chmod ugo+x $CHROMIUMOS_DIR/chroot/tmp/prepbin.sh
if [ -d $CHROMIUMOS_DIR/chroot/tmp/key_increment_working_folder ]; then
rm -rf $CHROMIUMOS_DIR/chroot/tmp/key_increment_working_folder
fi
log Launching cros_sdk /tmp/prepbin.sh, this will take 9-10 minutes.
log For progress: tail -f $CHROMIUMOS_DIR/chroot/tmp/fm_and_key.out
(
date
cd $CHROMIUMOS_DIR
cros_sdk -- bash /tmp/prepbin.sh < /dev/null
date
)
log "****************************"
log "Please check the output for error"
log "$CHROMIUMOS_DIR/chroot/tmp/fm_and_key.out"
log "****************************"
for i in $CHROMIUMOS_DIR/chroot/tmp/key_increment_working_folder/payloads/*.signed
do
log "Renaming testimage $i to $CHANNEL"
mv $i $(echo $i|sed 's/_testimage-/_'$CHANNEL'-/g')
done
log "Resulting payloads:"
ls -l $CHROMIUMOS_DIR/chroot/tmp/key_increment_working_folder/payloads/*.signed
}
upload_payload()
{
#
# Upload the payload generated by generate_payload
#
log
log ========== upload_payload ==========
gsutil_location="gsutil"
log Looking for gsutil
while true; do
which gsutil
if [ $? -eq 0 ]; then
break
fi
log Failed to locate $gsutil_location.
log Please enter the full path of gsutil:
read gsutil_location
if $gsutil_location -v; then
break
fi
done
log Found gsutil $gsutil_location
cmd="gsutil update"
log "Run $cmd to fetch the latest gsutil, answer y if prompted."
$cmd
# upload
cmd="$gsutil_location -m cp -R $CHROMIUMOS_DIR/chroot/tmp/key_increment_working_folder/payloads/* gs://chromeos-throw-away-bucket/CrOSPayloads/$STORE_DIR/"
log "Uploading payload $cmd"
$cmd
log
log Your files has been uploaded to https://pantheon.corp.google.com/storage/browser/chromeos-throw-away-bucket/CrOSPayloads/$STORE_DIR/
log
# enable shared publicly
cmd="$gsutil_location -m acl ch -u AllUsers:R gs://chromeos-throw-away-bucket/CrOSPayloads/$STORE_DIR/*"
log "Make file shared publicly $cmd"
$cmd
# check shared publicly
err=0
log Check perm is set correctly
for f in $CHROMIUMOS_DIR/chroot/tmp/key_increment_working_folder/payloads/*; do
cmd="$gsutil_location acl get gs://chromeos-throw-away-bucket/CrOSPayloads/$STORE_DIR/$(basename $f)"
$cmd | grep allUsers > /dev/null
if [ $? -ne 0 ] ; then
log Failed to enable Shared Publicly for $f
err=$((err+1))
fi
done
if [ $err -gt 0 ]; then
log There appear to be some problem with setting the Shared Publicly flag, please check error above.
log Press enter when ready to continue...
read ans
fi
}
generate_config()
{
#
# Generate the configuration for omaha dev server
#
log
log ========== generate_config ==========
if [ -z "$GETPAYLOAD" ]; then
NONCONF="/home/build/nonconf/google3/"
GET_PAYLOAD="/google/data/ro/teams/chromeos-testing/qa_au.par"
else
GET_PAYLOAD=${GETPAYLOAD}
fi
# TODO: we assume cros bin ends with .0 and the continue value is 1-5
# if you OS ends with other digit,
# make sure the suffix is of increasing value.
# remove the old one otherwise payloads.py will genreate duplicate Rules.
rm $FINAL_CONFIG 2> /dev/null
rm autoupdate-ascii-chromeos-*-${IMAGE_VER_NOSUFFIX}.[1-5].config \
2> /dev/null
log Done with cleanup, your current directory listing:
ls
COMMON_DATA="commondatastorage.googleapis.com"
COMMON_PATH="/chromeos-throw-away-bucket/CrOSPayloads/$STORE_DIR"
PAYLOAD_FOLDER=/tmp/key_increment_working_folder/payloads
for i in {1..5}; do
set -x
$GET_PAYLOAD \
-p $BOARD_PAYLOAD \
-b ${IMAGE_VER_NOSUFFIX}.$i \
-c $CHANNEL-channel \
-u "https://${COMMON_DATA}${COMMON_PATH}" \
--keyinctest \
--folder "${CHROMIUMOS_DIR}/chroot${PAYLOAD_FOLDER}" \
--board test \
$GETPAYLOAD_ARGS
set +x
done > /tmp/get_payloads.out 2>&1
log If there are problem, check /tmp/get_payloads.out
# generate a single config
(
pat='^AppId|^ConfigName|^IsPublic|^EnableTargetVersionCheck';
egrep "$pat" \
autoupdate-ascii-chromeos-${BOARD_PAYLOAD}-${IMAGE_VER_NOSUFFIX}.1.config
egrep -hv "$pat" \
autoupdate-ascii-chromeos-${BOARD_PAYLOAD}-${IMAGE_VER_NOSUFFIX}.[1-5].config \
| awk '{ n=match($0, "-[0-9]+\\.[0-9]+\\.[0-9])");
if(n) {lstv=v; v=substr($0,n+1,RLENGTH-2);}
}
{ if(lstv) {
if(match($0, "0[\\.0]+\\.0-")){
sub("0[.0]+.0", lstv, $0); lstv="";
}
}
print
}'
) > $FINAL_CONFIG
# Copy autoconfig to google data for easy copy and paste
(cd $GOOGLEDATA) # to automount /google/data
cp $FINAL_CONFIG $GOOGLEDATA || log Failed to copy $FINAL_CONFIG $GOOGLEDATA
log Version updated:
grep ' Version:' $FINAL_CONFIG
log Check the content of $FINAL_CONFIG
log Press ENTER when done...
read ans
}
upload_config()
{
#
# Upload the config from genreate_config() to omaha dev server
#
log
log ========== upload_config ==========
if [ -z "$DUT_IP" ]; then
ans="s"
else
cat <<EOF
Running upload_config
1 Device in normal mode
2 Connected to corp network with IP $DUT_IP
3 chromeOS version is $IMAGE_VER
4 Enable hardware and software write protect
Press ENTER when done (s to skip)...
EOF
read ans
fi
> ~/.ssh/known_hosts
s="CHROMEOS_AUSERVER=https://omaha.sandbox.google.com/service/update2"
if [ "$ans" == "s" ]; then
log Skip DUI setup.
log You will need to execute the following on DUT:
log "echo $s > /mnt/stateful_partition/etc/lsb-release"
log
else
set -x
ssh root@$DUT_IP "echo $s > /mnt/stateful_partition/etc/lsb-release" \
|| exit 1
fi
set +x
# In case copy to x20 failed, tell user to copy from local file.
if [ -f "$GOOGLEDATA/FINAL_CONFIG" ]; then
final_config="https://x20web.corp.google.com/~$USER/$FINAL_CONFIG"
else
final_config=$FINAL_CONFIG
fi
cat <<EOF
Detail in http://omahauploadconfig. Steps are:
1. Send email (cc wireless-hw-testing@ for storm)
To: chromeos-test@google.com
Subject: Key increment test for ${BOARD}
Content:
Starting ${BOARD} Key Increment testing and we are using
{Insert https://omahaconsole-dev.corp.google.com/ config URL}
Reply to this thread if you need to reconfigure or update.
Thank you.
2. Open https://omahaconsole-dev.corp.google.com/
3. Click on the row for your board.
4. Click "Create New" button in the Proposed Version box
5. Paste content from $final_config
6. Click Create button.
7. Click VERIFY CONFIG and check that the web page returns OK.
8. Check email that no one object on omaha update.
9. Click "Push to Live" button in Proposed Version box.
Press ENTER when done ...
EOF
read ans
}
exit_on_error()
{
echo $(date '+[%H%M%S-%m%d]') ERROR:- "$*"
exit 1
}
get_logs()
{
#
# Get the logs from DUT on each auto update sucess/failure.
#
scp root@$DUT_IP:\{/var/log/\{update_engine.log,debug_vboot_noisy.log\},/etc/lsb-release\} $(pwd)/key_increment_test/AU$1/
if [ $? -ne 0 ]; then
exit_on_error "Check network and DUT status"
fi
echo $2
}
debug_log_verification()
{
#
# GPT_INDEX and PART_NUM verification from /var/log/debug_vboot_noisy.log file
#
GPT_INDEX=$(ssh root@$DUT_IP grep -m1 "GPT\ index" /var/log/debug_vboot_noisy.log)
GPT_INDEX=$(cut -d= -f2- <<<$GPT_INDEX)
PART_NUM=$(ssh root@$DUT_IP grep -m1 "KERN-B" /var/log/debug_vboot_noisy.log)
PART_NUM=$(cut -d" " -f 3 <<<$PART_NUM)
if [ $GPT_INDEX -ne 4 ] || [ $PART_NUM -ne 4 ]; then
get_logs 1 "debug_log_verification failed on AU1"
exit_on_error "GPT_INDEX= $GPT_INDEX, PART_NUM= $PART_NUM"
fi
}
crossystem_verification()
{
#
# CHROMEOS_RELEASE_VERSION update verification from /etc/lsb-release
# FWB_TRIES and FWID parameters verification from crossystem
#
log ----inside crossystem_verification $1
# local au_iteration=$1
CHROMEOS_RELEASE_VERSION=$(ssh root@$DUT_IP grep "CHROMEOS_RELEASE_VERSION" /etc/lsb-release)
CHROMEOS_RELEASE_VERSION=$(cut -d= -f2- <<<$CHROMEOS_RELEASE_VERSION)
if [ "$CHROMEOS_RELEASE_VERSION" != "${IMAGE_VER_NOSUFFIX}.$1" ]; then
get_logs $auto_update "CHROMEOS_RELEASE_VERSION match Failed on AU$1"
exit_on_error "CHROMEOS_RELEASE_VERSION=$CHROMEOS_RELEASE_VERSION"
fi
FWB_TRIES=$(ssh root@$DUT_IP crossystem fwb_tries)
if [ $FWB_TRIES -eq 0 ]; then
get_logs $auto_update " FWB_TRIES is '0' on AU$1"
exit_on_error "FWB_TRIES=$FWB_TRIES"
fi
FWID=$(ssh root@$DUT_IP crossystem fwid)
if [ "$FWID" != "${BIOS_STR}.test$1" ]; then
get_logs $auto_update " FWID match Failed on AU$1"
exit_on_error "FWID=$FWID"
fi
}
verify_keyincrement()
{
#
# Verify key increment test on each auto update.
#
mkdir -p $(pwd)/key_increment_test/AU{1..5}
for auto_update in {1..5}; do
log ----inside verify_keyincrement $auto_update
ssh root@$DUT_IP update_engine_client --omaha_url="https://omaha.sandbox.google.com/service/update2" --check_for_update --block_until_reboot_is_needed
#ssh root@$DUT_IP update_engine_client --check_for_update --block_until_reboot_is_needed
if [ $? -ne 0 ]; then
get_logs $auto_update "update_engine_client Failed on AU$auto_update"
exit 1
fi
ssh root@$DUT_IP reboot
sleep 45
crossystem_verification $auto_update
sleep 60
ssh root@$DUT_IP "grep completed /var/log/update_engine.log"
if [ $? -ne 0 ]; then
log Autoupdate Verification Failed on AU$auto_update after reboot
exit 1
fi
if [ $auto_update -eq 1 ]; then
debug_log_verification
fi
ssh root@$DUT_IP "reboot"
sleep 90
get_logs $auto_update "Autoupdate $auto_update completed"
done
# Final verification
# tpm_fwver and tpm_kernver verification.
TPM_FWVER=$(ssh root@$DUT_IP crossystem tpm_fwver)
echo "TPM_FWVER=$TPM_FWVER"
TPM_KERNVER=$(ssh root@$DUT_IP crossystem tpm_kernver)
echo "TPM_KERNVER=$TPM_KERNVER"
if [ "$TPM_FWVER" != "0x00030003" ] || [ "$TPM_KERNVER" != "0x00030003" ]; then
get_logs 0 "TPM_FWVER=$TPM_FWVER and TPM_KERNVER=$TPM_KERNVER"
exit_on_error "TPM_FWVER=$TPM_FWVER and TPM_KERNVER=$TPM_KERNVER"
fi
log "Key Increment Test PASS\n\n"
tar -zcf key_increment_test.tar.gz key_increment_test
rm -rf key_increment_test
}
recover_device()
{
cd $CHROMIUMOS_DIR
log "Copy firmware to DUT\n\n"
scp $CHROMIUMOS_DIR/chroot/tmp/image.bin root@$DUT_IP:/tmp/
log "Flashing firmware\n\n"
ssh root@$DUT_IP flashrom -p host -w /tmp/image.bin -i RW_SECTION_A -i RW_SECTION_B
sleep 20
log "Flashing testimage\n\n"
cros flash $DUT_IP $IMAGE
ssh root@$DUT_IP reboot
log "Clear TPM\n\n"
}
#----------------------------------------------------------------------
# MAIN
#----------------------------------------------------------------------
CONFIG=$1
FUNC=$2
if [ "$CONFIG" = "" ]; then
log You must specify config file
exit 1
fi
if [ "$FUNC" = "" ]; then
cat <<EOF
You must provide a method to execute.
Available functions:
generate_payload
upload_payload
generate_config
upload_config
verify_keyincrement
recover_device
EOF
exit 1
fi
. $CONFIG
if [ -z "$CHANNEL" ]; then
CHANNEL=dev
fi
#-----------------------------------------------------------
# Let's get the sudo and prodaccess password out of the way
#-----------------------------------------------------------
log type in sudo password if prompt
sudo pwd
log prod access if prompt
prodcertstatus > /dev/null || prodaccess
#-----------------------------------------------------------
# Generated values
#-----------------------------------------------------------
# Get firmware version
BIOS_STR=$(strings $BIOS | grep -m1 '^Google_')
BIOS_VER=$(cut -d. -f2- <<<$BIOS_STR)
log BIOS version: $BIOS_VER
# Get OS version from chromiumos_test_image.bin
if [ -z "$IMAGE_VER" ]; then
log Extract chromeOS version and set IMAGE_VER
s='^CHROMEOS_RELEASE_VERSION='
IMAGE_VER=$(strings $IMAGE|grep -m1 "$s"|cut -d= -f2)
else
log Use user defined IMAGE_VER
fi
# IMAGER_VER should looks Ex: 7179.0.0
log Chrome version: $IMAGE_VER
if [ -z "$IMAGE_VER_NOSUFFIX" ]; then
# Remove the last digit Ex: 7179.0
log Set chromeOS version prefix and set IMAGE_VER_NOSUFFIX
s='^CHROMEOS_RELEASE_VERSION='
IMAGE_VER_NOSUFFIX=$(awk -F. 'sub(FS $NF"$", x)' <<<$IMAGE_VER)
else
log Use user defined IMAGE_VER_NOSUFFIX
fi
log Chrome version without suffix: $IMAGE_VER_NOSUFFIX
if [ -z "$BOARD_PAYLOAD" ]; then
BOARD_PAYLOAD="$BOARD"
fi
log Board name: $BOARD
log Board prepartion name: $BOARD_PAYLOAD
log Will use chroot: $CHROMIUMOS_DIR
# directory name in storage
STORE_DIR=${BOARD}_keyinc_fw$(sed 's/\./_/g' <<<$BIOS_VER)_$USER
FINAL_CONFIG="autoupdate-ascii-chromeos-$BOARD.config"
GOOGLEDATA="/google/data/rw/users/$(cut -c1-2 <<<$USER)/$USER/www"
if [ "$FUNC" = "ALL" ]; then
generate_payload
upload_payload
generate_config
upload_config
verify_keyincrement
recover_device
exit 0
fi
$FUNC
exit 0