Docker-OSX/custom/generate-specific-bootdisk.sh

185 lines
5.2 KiB
Bash
Executable file

#!/bin/bash
# ____ __ ____ ______ __
# / __ \____ _____/ /_____ _____/ __ \/ ___/ |/ /
# / / / / __ \/ ___/ //_/ _ \/ ___/ / / /\__ \| /
# / /_/ / /_/ / /__/ ,< / __/ / / /_/ /___/ / |
# /_____/\____/\___/_/|_|\___/_/ \____//____/_/|_| GEN BOOT DISK
#
# Repo: https://github.com/sickcodes/Docker-OSX/
# Title: Mac on Docker (Docker-OSX)
# Author: Sick.Codes https://sick.codes/
# Version: 3.1
# License: GPLv3+
help_text="Usage: generate-specific-bootdisk.sh
General options:
--model <string> Device model, e.g. 'iMacPro1,1'
--serial <filename> Device Serial number.
--board-serial <filename> Board Serial number.
--uuid <filename> SmUUID.
--mac-address <string> Used to set the ROM value; lowercased and without a colon.
--output-bootdisk <filename> Optionally change the bootdisk output filename.
--custom-plist <filename> Optionally change the input plist.
--help, -h, help Display this help and exit
Example:
./generate-specific-bootdisk.sh \
--model iMacPro1,1 \
--serial C02TW0WAHX87 \
--board-serial C027251024NJG36UE \
--uuid 5CCB366D-9118-4C61-A00A-E5BAF3BED451 \
--mac-address A8:5C:2C:9A:46:2F \
--output-bootdisk OpenCore-nopicker.qcow2
Author: Sick.Codes https://sick.codes/
Project: https://github.com/sickcodes/Docker-OSX/
"
PLIST_MASTER=config-nopicker-custom.plist
# gather arguments
while (( "$#" )); do
case "${1}" in
--help | -h | h | help )
echo "${help_text}" && exit 0
;;
--model=* | -m=* )
export DEVICE_MODEL="${1#*=}"
shift
;;
--model* | -m* )
export DEVICE_MODEL="${2}"
shift
shift
;;
--serial=* )
export SERIAL="${1#*=}"
shift
;;
--serial* )
export SERIAL="${2}"
shift
shift
;;
--board-serial=* )
export BOARD_SERIAL="${1#*=}"
shift
;;
--board-serial* )
export BOARD_SERIAL="${2}"
shift
shift
;;
--uuid=* )
export UUID="${1#*=}"
shift
;;
--uuid* )
export UUID="${2}"
shift
shift
;;
--mac-address=* )
export MAC_ADDRESS="${1#*=}"
shift
;;
--mac-address* )
export MAC_ADDRESS="${2}"
shift
shift
;;
--output-bootdisk=* )
export OUTPUT_QCOW="${1#*=}"
shift
;;
--output-bootdisk* )
export OUTPUT_QCOW="${2}"
shift
shift
;;
--custom-plist=* )
export INPUT_PLIST="${1#*=}"
shift
;;
--custom-plist* )
export INPUT_PLIST="${2}"
shift
shift
;;
*)
echo "Invalid option. Running with default values..."
shift
;;
esac
done
download_qcow_efi_folder () {
git clone --depth 1 https://github.com/kholia/OSX-KVM.git
cp -ra ./OSX-KVM/OpenCore-Catalina/EFI .
mkdir -p ./EFI/OC/Resources
# clone some Apple drivers
git clone --depth 1 https://github.com/acidanthera/OcBinaryData.git
# copy said drivers into EFI/OC/Resources
cp -a ./OcBinaryData/Resources/* ./EFI/OC/Resources
# EFI Shell commands
touch startup.nsh && echo 'fs0:\EFI\BOOT\BOOTx64.efi' > startup.nsh
}
generate_bootdisk () {
[[ -e ./config-nopicker-custom.plist ]] || wget https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
[[ -e ./opencore-image-ng.sh ]] || wget https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/opencore-image-ng.sh && chmod +x opencore-image-ng.sh
# plist required for bootdisks, so create anyway.
if [[ "${DEVICE_MODEL}" ]] \
&& [[ "${SERIAL}" ]] \
&& [[ "${BOARD_SERIAL}" ]] \
&& [[ "${UUID}" ]] \
&& [[ "${MAC_ADDRESS}" ]]; then
ROM="${MAC_ADDRESS//\:/}"
ROM="${ROM,,}"
sed -e s/{{DEVICE_MODEL}}/"${DEVICE_MODEL}"/g \
-e s/{{SERIAL}}/"${SERIAL}"/g \
-e s/{{BOARD_SERIAL}}/"${BOARD_SERIAL}"/g \
-e s/{{UUID}}/"${UUID}"/g \
-e s/{{ROM}}/"${ROM}"/g \
"${PLIST_MASTER}" > ./tmp.config.plist || exit 1
else
cat <<EOF
Error: one of the following values is missing:
--model "${DEVICE_MODEL:-MISSING}"
--serial "${SERIAL:-MISSING}"
--board-serial "${BOARD_SERIAL:-MISSING}"
--uuid "${UUID:-MISSING}"
--mac-address "${MAC_ADDRESS:-MISSING}"
EOF
exit 1
fi
./opencore-image-ng.sh \
--cfg "${INPUT_PLIST:-./tmp.config.plist}" \
--img "${OUTPUT_QCOW:-./${SERIAL}.OpenCore-nopicker.qcow2}" || exit 1
rm ./tmp.config.plist
}
main () {
download_qcow_efi_folder
generate_bootdisk
}
main