Refactor vm_shell.sh to make it easier to add new commands

This change prepares vm_shell for the follow-up that will add a start
empty Microdroid command.

Bug: 254912288
Test: vm_shell
Test: vm_shell help
Test: vm_shell connect
Change-Id: I7777009709892268ad6450799b51e247bbde2b8e
diff --git a/vm/vm_shell.sh b/vm/vm_shell.sh
index c0dd38f..02ec98a 100755
--- a/vm/vm_shell.sh
+++ b/vm/vm_shell.sh
@@ -14,16 +14,23 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# vm_shell.sh shows the VMs running in the Android device and connects to it
-# Usage:
-# vm_shell [cid]
-#
-#   cid: CID of the VM to connect to. If omitted, the list of CIDs available are shown
+# vm_shell.sh: utilities to interact with Microdroid VMs
+
+function print_help() {
+    echo "vm_shell.sh provides utilities to interact with Microdroid VMs"
+    echo ""
+    echo "Available commands:"
+    echo "    connect [cid] - establishes adb connection with the VM"
+    echo "      cid - cid of the VM to connect to. If not specified user will "
+    echo "            be promted to select one from the list of available cids"
+    echo ""
+    echo "    help - prints this help message"
+}
 
 function connect_vm() {
     cid=$1
     echo Connecting to CID ${cid}
-    adb disconnect localhost:8000
+    adb disconnect localhost:8000 2>/dev/null
     adb forward tcp:8000 vsock:${cid}:5555
     adb connect localhost:8000
     adb -s localhost:8000 root
@@ -32,26 +39,44 @@
     exit 0
 }
 
-selected_cid=$1
-available_cids=$(adb shell /apex/com.android.virt/bin/vm list | awk 'BEGIN { FS="[:,]" } /cid/ { print $2; }')
+function list_cids() {
+    local selected_cid=$1
+    local available_cids=$(adb shell /apex/com.android.virt/bin/vm list | awk 'BEGIN { FS="[:,]" } /cid/ { print $2; }')
+    echo "${available_cids}"
+}
 
-if [ -z "${available_cids}" ]; then
-    echo No VM is available
-    exit 1
-fi
+function handle_connect_cmd() {
+    selected_cid=$1
 
-if [ ! -n "${selected_cid}" ]; then
-    PS3="Select CID of VM to adb-shell into: "
-    select cid in ${available_cids}
-    do
-        selected_cid=${cid}
-        break
-    done
-fi
+    available_cids=$(list_cids)
 
-if [[ ! " ${available_cids[*]} " =~ " ${selected_cid} " ]]; then
-    echo VM of CID $selected_cid does not exist. Available CIDs: ${available_cids}
-    exit 1
-fi
+    if [ -z "${available_cids}" ]; then
+        echo No VM is available
+        exit 1
+    fi
 
-connect_vm ${selected_cid}
+    if [ ! -n "${selected_cid}" ]; then
+        PS3="Select CID of VM to adb-shell into: "
+        select cid in ${available_cids}
+        do
+            selected_cid=${cid}
+            break
+        done
+    fi
+
+    if [[ ! " ${available_cids[*]} " =~ " ${selected_cid} " ]]; then
+        echo VM of CID $selected_cid does not exist. Available CIDs: ${available_cids}
+        exit 1
+    fi
+
+    connect_vm ${selected_cid}
+}
+
+cmd=$1
+shift
+
+case $cmd in
+  connect) handle_connect_cmd "$@" ;;
+  help) print_help ;;
+  *) print_help; exit 1 ;;
+esac