78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env bash
 | 
						|
# 2018 Luke Shumaker
 | 
						|
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 "$@"
 |