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="" |
Daniel Verkamp | 2a76af0 | 2018-09-21 13:47:57 -0700 | [diff] [blame] | 35 | local arch="" |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 36 | |
| 37 | # The script will only work inside the chroot. |
| 38 | assert_inside_chroot |
| 39 | |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame^] | 40 | if [[ -n "${FLAGS_device_ip_addr}" ]]; then |
| 41 | # Remove '=' if the user typed -d=<ip> rather than -d <ip>. |
| 42 | FLAGS_device_ip_addr=$(echo "${FLAGS_device_ip_addr}" | sed "s/=//g") |
| 43 | |
| 44 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 45 | echo "Detecting device architecture..." >&2 |
| 46 | fi |
| 47 | uname_m=$(ssh "${SSH_OPTS[@]}" "root@${FLAGS_device_ip_addr}" "uname -m") |
| 48 | case "${uname_m}" in |
| 49 | x86_64) FLAGS_board='tatl' ;; |
| 50 | aarch64) FLAGS_board='tael' ;; |
| 51 | *) die "Unknown target uname -m ${uname_m}" ;; |
| 52 | esac |
| 53 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 54 | echo "Using board ${FLAGS_board} based on device architecture ${uname_m}." >&2 |
| 55 | fi |
| 56 | fi |
| 57 | |
Daniel Verkamp | 2a76af0 | 2018-09-21 13:47:57 -0700 | [diff] [blame] | 58 | case "${FLAGS_board}" in |
| 59 | tatl) arch='amd64' ;; |
| 60 | tael) arch='arm' ;; |
| 61 | *) die "Unknown board ${FLAGS_board}" ;; |
| 62 | esac |
| 63 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 64 | if [[ ${FLAGS_build_packages} -eq ${FLAGS_TRUE} ]]; then |
| 65 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 66 | echo "Building packages..." >&2 |
| 67 | fi |
| 68 | ./build_packages --board="${FLAGS_board}" --nowithautotest || |
| 69 | die "Failed to build packages." |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 70 | fi |
| 71 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 72 | if [[ ${FLAGS_build_image} -eq ${FLAGS_TRUE} ]]; then |
| 73 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 74 | echo "Building image..." >&2 |
| 75 | fi |
| 76 | ./build_image --board="${FLAGS_board}" test || |
| 77 | die "Failed to build image" |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 78 | fi |
| 79 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 80 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 81 | echo "Repacking the termina image..." >&2 |
| 82 | fi |
| 83 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 84 | out_dir="$(mktemp -d)/${FLAGS_board}" |
| 85 | image_dir="${GCLIENT_ROOT}/src/build/images/${FLAGS_board}/" |
| 86 | image="${image_dir}/latest/chromiumos_test_image.bin" |
Daniel Verkamp | 7c08b1b | 2019-04-24 12:52:53 -0700 | [diff] [blame] | 87 | ./termina_build_image --image "${image}" --output "${out_dir}" \ |
Daniel Verkamp | 2a76af0 | 2018-09-21 13:47:57 -0700 | [diff] [blame] | 88 | --arch "${arch}" |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 89 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 90 | if [[ -n "${FLAGS_device_ip_addr}" ]]; then |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 91 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 92 | echo "Copying image to device:" >&2 |
| 93 | fi |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame^] | 94 | rsync -a "${out_dir}" -e "ssh ${SSH_OPTS[*]}" \ |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 95 | "root@${FLAGS_device_ip_addr}:${STATEFUL_PARTITION}" \ |
| 96 | || die "Failed to copy to device." |
| 97 | rm -rf "${out_dir}" |
| 98 | |
| 99 | if [[ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]]; then |
| 100 | echo "Install image onto to device:" >&2 |
| 101 | fi |
| 102 | read -r -d '' install_script <<EOF |
| 103 | dbus-send --system --type=method_call --print-reply \ |
| 104 | --dest=org.chromium.ComponentUpdaterService \ |
| 105 | /org/chromium/ComponentUpdaterService \ |
| 106 | org.chromium.ComponentUpdaterService.LoadComponent \ |
| 107 | 'string:cros-termina' && |
| 108 | mkdir -p "${RUN_PATH}" && |
| 109 | mount --bind "${STATEFUL_PARTITION}/${FLAGS_board}" "${RUN_PATH}" && |
| 110 | restart vm_cicerone |
| 111 | restart vm_concierge |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 112 | EOF |
Daniel Verkamp | 6e062f7 | 2019-04-24 13:18:13 -0700 | [diff] [blame^] | 113 | ssh "${SSH_OPTS[@]}" "root@${FLAGS_device_ip_addr}" \ |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 114 | "${install_script}" \ |
| 115 | || die "Failed to deploy to device." |
| 116 | fi |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 117 | } |
| 118 | |
Josh Pratt | da1cebd | 2018-08-21 11:20:54 +1000 | [diff] [blame] | 119 | # Parse the command-line. |
| 120 | FLAGS "$@" || exit $? |
| 121 | eval set -- "${FLAGS_ARGV}" |
Josh Pratt | 01aae1f | 2018-08-06 11:19:21 +1000 | [diff] [blame] | 122 | main "$@" |