blob: 7ad940d4381a2e4deec85791a0456d8bdd361067 [file] [log] [blame] [edit]
#!/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}
}