• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3# Copyright 2020 Google Inc. All rights reserved.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#     http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17# vm_shell.sh: utilities to interact with Microdroid VMs
18
19function print_help() {
20    echo "vm_shell.sh provides utilities to interact with Microdroid VMs"
21    echo ""
22    echo "Available commands:"
23    echo "    connect [cid] - establishes adb connection with the VM"
24    echo "      cid - cid of the VM to connect to. If not specified user will "
25    echo "            be promted to select one from the list of available cids"
26    echo ""
27    echo "    start-microdroid [--auto-connect] [-- extra_args]"
28    echo "        Starts a Microdroid VM. Args after the -- will be"
29    echo "        passed through to the invocation of the "
30    echo "        /apex/com.android.virt/bin/vm run-microdroid binary."
31    echo ""
32    echo "        E.g.:"
33    echo "            vm_shell start-microdroid -- --protected --debug full"
34    echo ""
35    echo "        --auto-connect - automatically connects to the started VMs"
36    echo ""
37    echo "    help - prints this help message"
38}
39
40function connect_vm() {
41    cid=$1
42    echo Connecting to CID ${cid}
43    adb disconnect localhost:8000 2>/dev/null
44    adb forward tcp:8000 vsock:${cid}:5555
45    adb connect localhost:8000
46    adb -s localhost:8000 root
47    adb -s localhost:8000 wait-for-device
48    adb -s localhost:8000 shell
49    exit 0
50}
51
52function list_cids() {
53    adb shell /apex/com.android.virt/bin/vm list | awk 'BEGIN { FS="[:,]" } /cid/ { print $2; }'
54}
55
56function handle_connect_cmd() {
57    selected_cid=$1
58
59    available_cids=($(list_cids))
60
61    if [ -z "${available_cids}" ]; then
62        echo No VM is available
63        exit 1
64    fi
65
66    if [ ! -n "${selected_cid}" ]; then
67        if [ ${#available_cids[@]} -eq 1 ]; then
68            selected_cid=${available_cids[0]}
69        else
70            PS3="Select CID of VM to adb-shell into: "
71            select cid in ${available_cids[@]}
72            do
73                selected_cid=${cid}
74                break
75            done
76        fi
77    fi
78
79    if [[ ! " ${available_cids[*]} " =~ " ${selected_cid} " ]]; then
80        echo VM of CID $selected_cid does not exist. Available CIDs: ${available_cids}
81        exit 1
82    fi
83
84    connect_vm ${selected_cid}
85}
86
87function handle_start_microdroid_cmd() {
88    while [[ "$#" -gt 0 ]]; do
89        case $1 in
90          --auto-connect) auto_connect=true; ;;
91          --) shift; passthrough_args="$@"; break ;;
92          *) echo "Unknown argument: $1"; exit 1 ;;
93        esac
94        shift
95    done
96    if [[ "${auto_connect}" == true ]]; then
97        adb shell /apex/com.android.virt/bin/vm run-microdroid "${passthrough_args}" &
98        trap "kill $!" EXIT
99        sleep 2
100        handle_connect_cmd
101    else
102        adb shell /apex/com.android.virt/bin/vm run-microdroid "${passthrough_args}"
103    fi
104}
105
106cmd=$1
107shift
108
109case $cmd in
110  connect) handle_connect_cmd "$@" ;;
111  start-microdroid) handle_start_microdroid_cmd "$@" ;;
112  help) print_help ;;
113  *) print_help; exit 1 ;;
114esac
115