summaryrefslogtreecommitdiff
path: root/osi-shell
blob: 076fc84ba642a3d16c717af557f3b934e38f57a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env bash
# Copyright (C) 2018  Luke Shumaker
# SPDX-License-Identifier: AGPL-3.0-or-later
declare -r NAME=osi-run
declare -r VERSION=20180814

set -euE
source ./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 1 '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 2;;
		version)
			print "%s (notsystemd) %s" "$NAME" "$VERSION"
			return 0
			;;
		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 0
			;;
		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 "$@"