blob: 35e1d1b802dd801ce25da4434595368c700ddde3 [file] [log] [blame] [edit]
#!/bin/bash
# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Replaces the existing btpeerd version on the btpeer(s) with the current
# local state of this repository to allow for quick testing of changes to
# btpeerd.
#
# The btpeers' ImageUUID in its build info is updated with a `-needs-reinstall`
# suffix so that auto-repair re-images it, undoing these changes.
#
# For development purposes only. Normal deployments should still be bundled
# within images.
#
# Specify a dut hostname to update all of its btpeers or btpeer hostname(s).
# Assumes anything ending in "-host\d+" to be a dut hostname, and its btpeers to
# be <dut_hostname>-btpeerN for N [1,4]. Attempts to ssh each host before
# any updates to validate access and hostname resolution, any hosts that failed
# are skipped. Fails if btpeerd does not exist already on the host.
#
# Usage:
# ./update_btpeers.sh <dut_or_btpeer_host1> [...<dut_or_btpeer_host1>]
set -e
SCRIPT_DIR="$(dirname "$(realpath -e "${BASH_SOURCE[0]}")")"
PROJECT_DIR="$(realpath -e "${SCRIPT_DIR}/..")"
BTPEER_PATH_TO_BTPEERD_DIR="/etc/chromiumos/src/platform/btpeerd/"
BTPEER_PATH_TO_BUILD_INFO_FILE="/etc/chromiumos/raspios_cros_btpeer_build_info.json"
DIRTY_IMAGE_UUID_SUFFIX="-needs-reinstall"
CHROMIUMOS_CONFIG_SRC_LOCAL_DIR="${PROJECT_DIR}/../../config/go"
CHROMIUMOS_CONFIG_SRC_BTPEER_DIR="/etc/chromiumos/src/config/go"
# Collect hosts from script args.
HOSTS_TO_CHECK=()
for HOST in "$@"; do
# Remove crossk prefix.
HOST="${HOST#crossk-}"
if [[ "${HOST}" =~ host[0-9]+$ ]]; then
# Likely a DUT host, so add all btpeers.
echo "Assuming host '${HOST}' is a dut hostname, will try to update its 4 btpeers"
HOSTS_TO_CHECK+=(
"${HOST}-btpeer1"
"${HOST}-btpeer2"
"${HOST}-btpeer3"
"${HOST}-btpeer4"
)
else
HOSTS_TO_CHECK+=("${HOST}")
fi
done
if [ "${#HOSTS_TO_CHECK[@]}" -eq 0 ]; then
echo "ERROR: At least one dut or btpeer hostname is required"
exit 1
fi
echo "Got ${#HOSTS_TO_CHECK[@]} btpeer hostnames from CLI args"
# Validate hosts as btpeers.
BTPEER_HOSTS_TO_UPDATE=()
for HOST in "${HOSTS_TO_CHECK[@]}"; do
echo "Checking if host '${HOST}' is a valid host to update"
set +e
ssh -q "${HOST}" "test -d ${BTPEER_PATH_TO_BTPEERD_DIR}"
SSH_RET_CODE=$?
set -e
if [ "${SSH_RET_CODE}" -eq 255 ]; then
echo "WARNING: Failed to connect to host '${HOST}', assuming host does not exist and will not update it"
elif [ "${SSH_RET_CODE}" -eq 1 ]; then
echo "ERROR: Invalid host '${HOST}': missing btpeerd install dir ${BTPEER_PATH_TO_BTPEERD_DIR}"
exit 1
elif [ "${SSH_RET_CODE}" -ne 0 ]; then
echo "ERROR: Failed to verify host '${HOST}' has btpeerd install dir ${BTPEER_PATH_TO_BTPEERD_DIR}"
exit 2
else
echo "Successfully verified host '${HOST}' as a valid btpeer, will update it"
BTPEER_HOSTS_TO_UPDATE+=("${HOST}")
fi
done
if [ "${#BTPEER_HOSTS_TO_UPDATE[@]}" -eq 0 ]; then
echo "ERROR: No valid btpeer hosts to update"
exit 1
fi
echo "Successfully identified ${#BTPEER_HOSTS_TO_UPDATE[@]} btpeer hosts to update"
# Update btpeerd on btpeers.
LOG_DIVIDER="=============================================================================="
for HOST in "${BTPEER_HOSTS_TO_UPDATE[@]}"; do
echo -e "\n${LOG_DIVIDER}"
echo "Updating btpeerd on host '${HOST}'"
echo "Marking btpeer image as dirty"
BUILD_INFO_JSON=$(ssh -q "${HOST}" "cat '${BTPEER_PATH_TO_BUILD_INFO_FILE}'")
IMAGE_UUID=$(jq -r ."image_uuid" <<< "${BUILD_INFO_JSON}")
if [ "${#IMAGE_UUID}" -ne 36 ]; then
echo "Btpeer image already marked as dirty with image UUID '${IMAGE_UUID}', skipping step"
else
IMAGE_UUID="${IMAGE_UUID}${DIRTY_IMAGE_UUID_SUFFIX}"
BUILD_INFO_JSON=$(jq '."image_uuid" = $val' --arg val "${IMAGE_UUID}" <<< "${BUILD_INFO_JSON}")
echo "${BUILD_INFO_JSON}" | ssh -q "${HOST}" "cat - > '${BTPEER_PATH_TO_BUILD_INFO_FILE}'"
echo "Successfully marked btpeer image as dirty with image UUID '${IMAGE_UUID}'"
fi
echo "Stopping btpeerd service"
ssh -q "${HOST}" "systemctl stop btpeerd.service"
echo "Copying source files to btpeer"
ssh -q "${HOST}" "mkdir -p '${CHROMIUMOS_CONFIG_SRC_BTPEER_DIR}'"
rsync -a "${CHROMIUMOS_CONFIG_SRC_LOCAL_DIR}"/* \
"${HOST}:${CHROMIUMOS_CONFIG_SRC_BTPEER_DIR}"
rsync -av "${PROJECT_DIR}/" "${HOST}:${BTPEER_PATH_TO_BTPEERD_DIR}/" \
--exclude .git --exclude .idea --exclude .vscode \
--exclude go/bin --exclude go/pkg
echo "Building btpeerd on btpeer"
ssh "${HOST}" "${BTPEER_PATH_TO_BTPEERD_DIR}/scripts/build.sh"
echo "Starting btpeerd service"
ssh -q "${HOST}" "systemctl start btpeerd.service"
echo "Successfully updated btpeerd on host '${HOST}'"
done
# Print summary.
echo -e "\n${LOG_DIVIDER}\n${LOG_DIVIDER}"
echo "Successfully updated btpeerd on ${#BTPEER_HOSTS_TO_UPDATE[@]} hosts:"
for HOST in "${BTPEER_HOSTS_TO_UPDATE[@]}"; do
echo "${HOST}"
done