| #!/bin/bash |
| # Copyright 2018 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. |
| # |
| # Based on http://go/termina-care-and-feeding |
| # |
| # Pushes the lastest local build of tatl to your test device. |
| # Usage: ./deploy_termina.sh device_ip |
| |
| # Loads script libraries. |
| CONTRIB_DIR=$(dirname "$(readlink -f "$0")") |
| . "${CONTRIB_DIR}/common.sh" || exit 1 |
| |
| STATEFUL_PARTITION="/mnt/stateful_partition/" |
| RUN_PATH="/run/imageloader/cros-termina/99999.0.0" |
| TEST_SSH_KEY="${GCLIENT_ROOT}/chromite/ssh_keys/testing_rsa" |
| SSH_OPTS=( |
| "-i" "${TEST_SSH_KEY}" |
| "-o" "ConnectTimeout=10" |
| "-o" "StrictHostKeyChecking=no" |
| "-o" "UserKnownHostsFile=/dev/null" |
| ) |
| |
| # Define flags. |
| DEFINE_string 'board' 'tatl' 'Specify the board to build for.' 'b' |
| DEFINE_boolean 'build_packages' false 'Builds packages.' 'p' |
| DEFINE_boolean 'build_image' false 'Builds the image.' 'i' |
| DEFINE_boolean 'test_image' true 'Use a testing termina image instead of a base image.' 't' |
| DEFINE_string 'device_ip_addr' '' 'The ip of the device to deploy to.' 'd' |
| DEFINE_boolean 'verbose' false 'Turns on verbose logging.' 'v' |
| |
| main() { |
| local install_script="" |
| local out_dir="" |
| |
| # The script will only work inside the chroot. |
| assert_inside_chroot |
| |
| if [[ -n "${FLAGS_device_ip_addr}" ]]; then |
| # Remove '=' if the user typed -d=<ip> rather than -d <ip>. |
| FLAGS_device_ip_addr=$(echo "${FLAGS_device_ip_addr}" | sed "s/=//g") |
| |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Detecting device architecture..." >&2 |
| fi |
| uname_m=$(ssh "${SSH_OPTS[@]}" "root@${FLAGS_device_ip_addr}" "uname -m") |
| case "${uname_m}" in |
| x86_64) FLAGS_board='tatl' ;; |
| aarch64) FLAGS_board='tael' ;; |
| *) die "Unknown target uname -m ${uname_m}" ;; |
| esac |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Using board ${FLAGS_board} based on device architecture ${uname_m}." >&2 |
| fi |
| fi |
| |
| if [[ ${FLAGS_build_packages} -eq ${FLAGS_TRUE} ]]; then |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Building packages..." >&2 |
| fi |
| ./build_packages --board="${FLAGS_board}" --nowithautotest || |
| die "Failed to build packages." |
| fi |
| |
| if [[ ${FLAGS_build_image} -eq ${FLAGS_TRUE} ]]; then |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Building image..." >&2 |
| fi |
| ./build_image --board="${FLAGS_board}" test || |
| die "Failed to build image" |
| fi |
| |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Repacking the termina image..." >&2 |
| fi |
| |
| out_dir="$(mktemp -d)/${FLAGS_board}" |
| image_dir="${GCLIENT_ROOT}/src/build/images/${FLAGS_board}/" |
| if [[ ${FLAGS_test_image} -eq ${FLAGS_TRUE} ]]; then |
| image="${image_dir}/latest/chromiumos_test_image.bin" |
| else |
| image="${image_dir}/latest/chromiumos_base_image.bin" |
| fi |
| termina_build_image="${GCLIENT_ROOT}/src/platform/container-guest-tools/termina/termina_build_image.py" |
| sudo "${termina_build_image}" "${image}" "${out_dir}" |
| |
| if [[ -n "${FLAGS_device_ip_addr}" ]]; then |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Copying image to device:" >&2 |
| fi |
| rsync -a "${out_dir}" -e "ssh ${SSH_OPTS[*]}" \ |
| "root@${FLAGS_device_ip_addr}:${STATEFUL_PARTITION}" \ |
| || die "Failed to copy to device." |
| sudo rm -rf "${out_dir}" |
| |
| if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| echo "Install image onto to device:" >&2 |
| fi |
| read -r -d '' install_script <<EOF |
| dbus-send --system --type=method_call --print-reply \ |
| --dest=org.chromium.ComponentUpdaterService \ |
| /org/chromium/ComponentUpdaterService \ |
| org.chromium.ComponentUpdaterService.LoadComponent \ |
| 'string:cros-termina' && |
| mkdir -p "${RUN_PATH}" && |
| mount --bind "${STATEFUL_PARTITION}/${FLAGS_board}" "${RUN_PATH}" && |
| restart vm_cicerone |
| restart vm_concierge |
| EOF |
| ssh "${SSH_OPTS[@]}" "root@${FLAGS_device_ip_addr}" \ |
| "${install_script}" \ |
| || die "Failed to deploy to device." |
| fi |
| } |
| |
| # Parse the command-line. |
| FLAGS "$@" || exit $? |
| eval set -- "${FLAGS_ARGV}" |
| main "$@" |