|  | #!/usr/bin/env bash | 
|  | # | 
|  | # Copyright (c) 2015 Google Inc. | 
|  | # Kevin Klues <klueska@cs.berkeley.edu> | 
|  | # See LICENSE for details. | 
|  |  | 
|  | sleep_cmd="sleep 0xda39a3ee5e6b4b0d3255bfef95601890afd80709" | 
|  | welcome_cmd="echo -ne \"Welcome to the qemu monitor!\nPress 'Ctrl-a d' to detach and return to your shell.\n\"" | 
|  |  | 
|  | function short_description() { | 
|  | echo "Launch a qemu monitor to attach to a qemu instance" | 
|  | } | 
|  |  | 
|  | function usage() { | 
|  | echo "Usage:" | 
|  | echo "    ${cmd} -h | --help" | 
|  | echo "    ${cmd} [ --print-tty-only ]" | 
|  | echo "" | 
|  | echo "Options:" | 
|  | echo "    -h --help         Display this screen and exit" | 
|  | echo "    --print-tty-only  Launch the monitor, print its tty and exit." | 
|  | echo "                      Dont actually enter the monitor." | 
|  | } | 
|  |  | 
|  | function get_qemu_monitor_tty() { | 
|  | while [ "${tty_dev}" = "" ]; do | 
|  | local ps_cmd="ps -a -o tty=TTY -o args | grep \"${sleep_cmd}\" | grep -v grep" | 
|  | local ps_info="$(eval "${ps_cmd}")" | 
|  | local tty_dev="$(echo ${ps_info} | cut -d" " -f 1)" | 
|  | done | 
|  | echo "/dev/${tty_dev}" | 
|  | } | 
|  |  | 
|  | function main() { | 
|  | # Create the monitor if there isn't one yet | 
|  | local name="ak-qemu-monitor" | 
|  | local list="$(screen -list | grep ${name})" | 
|  | if [ "${list}" == "" ]; then | 
|  | screen -d -m -S ${name} /bin/bash -c "${welcome_cmd};${sleep_cmd}" | 
|  | fi | 
|  |  | 
|  | # If ${print_tty_only} is set, print the tty and exit | 
|  | if [ "${print_tty_only}" = "true" ]; then | 
|  | get_qemu_monitor_tty | 
|  | exit 0 | 
|  | fi | 
|  |  | 
|  | # Otherwise... | 
|  | # Print some info about using the monitor | 
|  | echo "" | 
|  | echo "You are about to enter the qemu monitor for Akaros!" | 
|  | echo "We use 'screen' to create a tty device to host the monitor." | 
|  | echo "Once attached, you can detach from the monitor at anytime" | 
|  | echo "using the normal screen command:" | 
|  | echo "" | 
|  | echo "    Ctrl-a d" | 
|  | echo "" | 
|  | echo "To reattach from a shell, simply rerun this script:" | 
|  | echo "" | 
|  | echo "    ak launch-qemu-monitor" | 
|  | echo "" | 
|  | echo "While in the monitor, you should be able to run all of" | 
|  | echo "the normal qemu monitor commands. See the following link" | 
|  | echo "for more information:" | 
|  | echo "" | 
|  | echo "    https://en.wikibooks.org/wiki/QEMU/Monitor" | 
|  | echo "" | 
|  |  | 
|  | # Wait for any key to be pressed | 
|  | echo "Press any key to continue..." | 
|  | (tty_state="$(stty -g)" | 
|  | stty -icanon | 
|  | LC_ALL=C dd bs=1 count=1 > /dev/null 2>&1 | 
|  | stty "$tty_state" | 
|  | ) < /dev/tty | 
|  |  | 
|  | # Attach the monitor | 
|  | screen -d -r ${name} | 
|  | } | 
|  |  |