#!/usr/bin/env bash # Copyright (C) 2018 Luke Shumaker # Copyright (C) 2023 Umorpha Systems # SPDX-License-Identifier: AGPL-3.0-or-later declare -r NAME=osi-run declare -r VERSION=20231023 set -euE source "$(dirname -- "${BASH_SOURCE[0]}")/lib/osi.sh" main() { local arg_mode=main local arg_image= local arg_qemu=() local args if ! args="$(getopt -n "${0##*/}" -o hV -l help,version -- "$@")"; then arg_mode=error else eval "set -- $args" while true; do case "$1" in -V|--version) shift; arg_mode=version;; -h|--help) shift; arg_mode=usage;; --) shift; break;; *) error $EXIT_FAILURE 'Internal error. The programmer writing this tool screwed up.';; esac done case "$arg_mode" in main) if (( $# < 1 )); then error 0 "Expected at least 1 positional argument, got none" arg_mode=error else arg_image=$1 arg_qemu=("${@:2}") fi ;; esac fi case "$arg_mode" in error) print "Try '%q --help' for more information" "${0##*/}" >&2 return $EXIT_INVALIDARGUMENT ;; version) print "%s (osi-tools) %s" "$NAME" "$VERSION" return $EXIT_SUCCESS ;; usage) print 'Usage: %s [OPTIONS] FILENAME.img [-- QEMU_ARGS...] [< SCRIPT.sh]' "${0##*/}" print ' or: %s [OPTIONS] -- FILENAME.img [QEMU_ARGS...] [< SCRIPT.sh]' "${0##*/}" print 'Operating System Image: Interactive Shell' echo print 'OPTIONS:' print ' -h, --help display this help' print ' -V, --version output version information' return $EXIT_SUCCESS ;; main) tmp=$(mktemp -td -- "${0##*/}.XXXXXXXXXX") trap "rm -rf -- ${tmp@Q}" EXIT mkfifo -- "$tmp/sync" qemu-system-x86_64 \ -machine accel=kvm \ -m 512 \ -vnc unix:"$tmp/vnc.sock" \ -name "osi-shell $arg_image" \ -drive media=disk,format=raw,if=virtio,file="$arg_image" \ -serial stdio \ -serial file:"$tmp/exit" \ "${arg_qemu[@]}" \ < <(cat <"$tmp/sync" >/dev/null; cat; while sleep 0.1; do printf '\x04'; done) \ > >(read -r -N1 c; printf '%s' "$c"; :>"$tmp/sync"; exec cat) return "$(sed 's/\r$//' <"$tmp/exit")" ;; esac } main "$@"