165 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# https://github.com/kraxel/imagefish
 | 
						|
 | 
						|
######################################################################
 | 
						|
# defaults
 | 
						|
 | 
						|
iso=""
 | 
						|
img=""
 | 
						|
cfg=""
 | 
						|
 | 
						|
######################################################################
 | 
						|
# create work dir
 | 
						|
 | 
						|
function msg() {
 | 
						|
	local txt="$1"
 | 
						|
	local bold="\x1b[1m"
 | 
						|
	local normal="\x1b[0m"
 | 
						|
	echo -e "${bold}### ${txt}${normal}"
 | 
						|
}
 | 
						|
 | 
						|
function do_cleanup() {
 | 
						|
	msg "cleaning up ..."
 | 
						|
	if test "$GUESTFISH_PID" != ""; then
 | 
						|
		guestfish --remote -- exit >/dev/null 2>&1 || true
 | 
						|
	fi
 | 
						|
	sudo rm -rf "$WORK"
 | 
						|
}
 | 
						|
 | 
						|
WORK="${TMPDIR-/var/tmp}/${0##*/}-$$"
 | 
						|
mkdir "$WORK" || exit 1
 | 
						|
trap 'do_cleanup' EXIT
 | 
						|
 | 
						|
BASE="$(dirname $0)"
 | 
						|
 | 
						|
######################################################################
 | 
						|
# parse args
 | 
						|
 | 
						|
function print_help() {
 | 
						|
cat <<EOF
 | 
						|
usage: $0 [ options ]
 | 
						|
options:
 | 
						|
    --iso <iso-image>
 | 
						|
    --img <disk-image>
 | 
						|
    --cfg <clover-config>
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
while test "$1" != ""; do
 | 
						|
	case "$1" in
 | 
						|
	--iso)
 | 
						|
		iso="$2"
 | 
						|
		shift; shift
 | 
						|
		;;
 | 
						|
	--img)
 | 
						|
		img="$2"
 | 
						|
		shift; shift
 | 
						|
		;;
 | 
						|
	--cfg)
 | 
						|
		cfg="$2"
 | 
						|
		shift; shift
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
######################################################################
 | 
						|
# guestfish script helpers
 | 
						|
 | 
						|
function fish() {
 | 
						|
	echo "#" "$@"
 | 
						|
	guestfish --remote -- "$@"		|| exit 1
 | 
						|
}
 | 
						|
 | 
						|
function fish_init() {
 | 
						|
	local format
 | 
						|
 | 
						|
	case "$img" in
 | 
						|
	*.raw)	format="raw" ;;
 | 
						|
	*)	format="qcow2";;
 | 
						|
	esac
 | 
						|
 | 
						|
	msg "creating and adding disk image"
 | 
						|
	fish disk-create $img $format 384M
 | 
						|
	fish add $img
 | 
						|
	fish run
 | 
						|
}
 | 
						|
 | 
						|
function fish_fini() {
 | 
						|
	fish umount-all
 | 
						|
}
 | 
						|
 | 
						|
# disabled by @sickcodes to allow unattended image overwrites
 | 
						|
######################################################################
 | 
						|
# sanity checks
 | 
						|
 | 
						|
# if test ! -f "$cfg"; then
 | 
						|
# 	echo "ERROR: cfg not found: $cfg"
 | 
						|
# 	exit 1
 | 
						|
# fi
 | 
						|
# if test -f "$img"; then
 | 
						|
# 	if test "$allow_override" = "yes"; then
 | 
						|
# 		rm -f "$img"
 | 
						|
# 	else
 | 
						|
# 		echo "ERROR: image exists: $img"
 | 
						|
# 		exit 1
 | 
						|
# 	fi
 | 
						|
# fi
 | 
						|
 | 
						|
######################################################################
 | 
						|
# go!
 | 
						|
 | 
						|
msg "copy files from local folder"
 | 
						|
BASE="$(dirname $0)"
 | 
						|
cp -a $BASE/EFI $WORK
 | 
						|
find "$WORK"
 | 
						|
 | 
						|
#msg "[debug] list drivers in EFI/OC"
 | 
						|
#(cd $WORK/EFI/OC; find driver* -print)
 | 
						|
 | 
						|
export LIBGUESTFS_BACKEND=direct
 | 
						|
eval $(guestfish --listen)
 | 
						|
if test "$GUESTFISH_PID" = ""; then
 | 
						|
	echo "ERROR: starting guestfish failed"
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
fish_init
 | 
						|
 | 
						|
msg "partition disk image"
 | 
						|
fish part-init /dev/sda gpt
 | 
						|
fish part-add /dev/sda p 2048 300000
 | 
						|
fish part-add /dev/sda p 302048 -2048
 | 
						|
fish part-set-gpt-type /dev/sda 1 C12A7328-F81F-11D2-BA4B-00A0C93EC93B
 | 
						|
fish part-set-bootable /dev/sda 1 true
 | 
						|
fish mkfs vfat /dev/sda1 label:EFI
 | 
						|
fish mkfs vfat /dev/sda2 label:OpenCore
 | 
						|
fish mount /dev/sda2 /
 | 
						|
fish mkdir /ESP
 | 
						|
fish mount /dev/sda1 /ESP
 | 
						|
 | 
						|
msg "copy files to disk image"
 | 
						|
cp -v "$cfg" $WORK/config.plist
 | 
						|
fish mkdir /ESP/EFI
 | 
						|
fish mkdir /ESP/EFI/OC
 | 
						|
fish mkdir /ESP/EFI/OC/Kexts
 | 
						|
fish mkdir /ESP/EFI/OC/ACPI
 | 
						|
fish mkdir /ESP/EFI/OC/Resources
 | 
						|
fish mkdir /ESP/EFI/OC/Tools
 | 
						|
fish copy-in $WORK/EFI/BOOT /ESP/EFI
 | 
						|
fish copy-in $WORK/EFI/OC/OpenCore.efi /ESP/EFI/OC
 | 
						|
fish copy-in $WORK/EFI/OC/Drivers /ESP/EFI/OC/
 | 
						|
fish copy-in $WORK/EFI/OC/Kexts /ESP/EFI/OC/
 | 
						|
fish copy-in $WORK/EFI/OC/ACPI /ESP/EFI/OC/
 | 
						|
fish copy-in $BASE/resources/OcBinaryData/Resources /ESP/EFI/OC/
 | 
						|
fish copy-in $WORK/EFI/OC/Tools /ESP/EFI/OC/
 | 
						|
 | 
						|
# Note
 | 
						|
fish copy-in startup.nsh /
 | 
						|
 | 
						|
BASE="$(dirname $0)"
 | 
						|
fish copy-in "$WORK/config.plist"               /ESP/EFI/OC/
 | 
						|
 | 
						|
fish find /ESP/
 | 
						|
fish_fini
 |