Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | # |
| 6 | # Based on http://go/termina-care-and-feeding |
| 7 | # |
| 8 | # Pushes the lastest local build of tatl to your test device. |
| 9 | # Usage: ./deploy_termina.sh device_ip |
| 10 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 11 | # Loads script libraries. |
| 12 | CONTRIB_DIR=$(dirname "$(readlink -f "$0")") |
| 13 | . "${CONTRIB_DIR}/common.sh" || exit 1 |
| 14 | |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 15 | STATEFUL_PARTITION="/mnt/stateful_partition/" |
| 16 | RUN_PATH="/run/imageloader/cros-termina/99999.0.0" |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 17 | TEST_SSH_KEY="${GCLIENT_ROOT}/chromite/ssh_keys/testing_rsa" |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame] | 18 | SSH_OPTS=( |
| 19 | "-i" "${TEST_SSH_KEY}" |
| 20 | "-o" "ConnectTimeout=10" |
| 21 | "-o" "StrictHostKeyChecking=no" |
| 22 | "-o" "UserKnownHostsFile=/dev/null" |
| 23 | ) |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 24 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 25 | # Define flags. |
| 26 | DEFINE_string 'board' 'tatl' 'Specify the board to build for.' 'b' |
| 27 | DEFINE_boolean 'build_packages' false 'Builds packages.' 'p' |
| 28 | DEFINE_boolean 'build_image' false 'Builds the image.' 'i' |
| 29 | DEFINE_string 'device_ip_addr' '' 'The ip of the device to deploy to.' 'd' |
| 30 | DEFINE_boolean 'verbose' false 'Turns on verbose logging.' 'v' |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 31 | |
| 32 | main() { |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 33 | local install_script="" |
| 34 | local out_dir="" |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 35 | |
| 36 | # The script will only work inside the chroot. |
| 37 | assert_inside_chroot |
| 38 | |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame] | 39 | if [[ -n "${FLAGS_device_ip_addr}" ]]; then |
| 40 | # Remove '=' if the user typed -d=<ip> rather than -d <ip>. |
| 41 | FLAGS_device_ip_addr=$(echo "${FLAGS_device_ip_addr}" | sed "s/=//g") |
| 42 | |
| 43 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 44 | echo "Detecting device architecture..." >&2 |
| 45 | fi |
| 46 | uname_m=$(ssh "${SSH_OPTS[@]}" "root@${FLAGS_device_ip_addr}" "uname -m") |
| 47 | case "${uname_m}" in |
| 48 | x86_64) FLAGS_board='tatl' ;; |
| 49 | aarch64) FLAGS_board='tael' ;; |
| 50 | *) die "Unknown target uname -m ${uname_m}" ;; |
| 51 | esac |
| 52 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 53 | echo "Using board ${FLAGS_board} based on device architecture ${uname_m}." >&2 |
| 54 | fi |
| 55 | fi |
| 56 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 57 | if [[ ${FLAGS_build_packages} -eq ${FLAGS_TRUE} ]]; then |
| 58 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 59 | echo "Building packages..." >&2 |
| 60 | fi |
| 61 | ./build_packages --board="${FLAGS_board}" --nowithautotest || |
| 62 | die "Failed to build packages." |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 63 | fi |
| 64 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 65 | if [[ ${FLAGS_build_image} -eq ${FLAGS_TRUE} ]]; then |
| 66 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 67 | echo "Building image..." >&2 |
| 68 | fi |
| 69 | ./build_image --board="${FLAGS_board}" test || |
| 70 | die "Failed to build image" |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 71 | fi |
| 72 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 73 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 74 | echo "Repacking the termina image..." >&2 |
| 75 | fi |
| 76 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 77 | out_dir="$(mktemp -d)/${FLAGS_board}" |
| 78 | image_dir="${GCLIENT_ROOT}/src/build/images/${FLAGS_board}/" |
| 79 | image="${image_dir}/latest/chromiumos_test_image.bin" |
Daniel Verkamp | e933cfe | 2019-08-30 17:21:18 -0700 | [diff] [blame^] | 80 | termina_build_image="${GCLIENT_ROOT}/src/platform/container-guest-tools/termina/termina_build_image.py" |
| 81 | sudo "${termina_build_image}" "${image}" "${out_dir}" |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 82 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 83 | if [[ -n "${FLAGS_device_ip_addr}" ]]; then |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 84 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 85 | echo "Copying image to device:" >&2 |
| 86 | fi |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame] | 87 | rsync -a "${out_dir}" -e "ssh ${SSH_OPTS[*]}" \ |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 88 | "root@${FLAGS_device_ip_addr}:${STATEFUL_PARTITION}" \ |
| 89 | || die "Failed to copy to device." |
Daniel Verkamp | e933cfe | 2019-08-30 17:21:18 -0700 | [diff] [blame^] | 90 | sudo rm -rf "${out_dir}" |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 91 | |
| 92 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 93 | echo "Install image onto to device:" >&2 |
| 94 | fi |
| 95 | read -r -d '' install_script <<EOF |
| 96 | dbus-send --system --type=method_call --print-reply \ |
| 97 | --dest=org.chromium.ComponentUpdaterService \ |
| 98 | /org/chromium/ComponentUpdaterService \ |
| 99 | org.chromium.ComponentUpdaterService.LoadComponent \ |
| 100 | 'string:cros-termina' && |
| 101 | mkdir -p "${RUN_PATH}" && |
| 102 | mount --bind "${STATEFUL_PARTITION}/${FLAGS_board}" "${RUN_PATH}" && |
| 103 | restart vm_cicerone |
| 104 | restart vm_concierge |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 105 | EOF |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame] | 106 | ssh "${SSH_OPTS[@]}" "root@${FLAGS_device_ip_addr}" \ |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 107 | "${install_script}" \ |
| 108 | || die "Failed to deploy to device." |
| 109 | fi |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 110 | } |
| 111 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 112 | # Parse the command-line. |
| 113 | FLAGS "$@" || exit $? |
| 114 | eval set -- "${FLAGS_ARGV}" |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 115 | main "$@" |