diff --git a/custom/generate-unique-machine-values.sh b/custom/generate-unique-machine-values.sh index c97db87..a93aab6 100755 --- a/custom/generate-unique-machine-values.sh +++ b/custom/generate-unique-machine-values.sh @@ -21,7 +21,10 @@ General options: --model, -m Device model, e.g. "iMacPro1,1" --csv Optionally change the CSV output filename. --output-dir Optionally change the script output location. + --help, -h, help Display this help and exit + --plists Create corresponding config.plists for each serial set. + --qcows [SLOW] Create corresponding boot disk images for each serial set. Notes: - Default is 1 serial for "iMacPro1,1" in the current working directory. @@ -29,12 +32,14 @@ Notes: - If you do not set a CSV filename, the output will be sent to the output-dir. - If you do not set an output-dir, the current directory will be the output directory. - Sourcable environment variable shell files will be written to a folder, "envs". + - config.plist files will be written to a folder, "plists". Author: Sick.Codes https://sick.codes/ Project: https://github.com/sickcodes/Docker-OSX/ " MACINFOPKG_VERSION=2.1.2 +PLIST_MASTER=config-nopicker-custom.plist # gather arguments while (( "$#" )); do @@ -84,6 +89,15 @@ while (( "$#" )); do shift ;; + --plists ) + export CREATE_PLISTS=1 + shift + ;; + --qcows ) + export CREATE_QCOWS=1 + shift + ;; + *) echo "Invalid option. Running with default values..." shift @@ -112,6 +126,21 @@ download_vendor_mac_addresses () { [[ -e "${MAC_ADDRESSES_FILE:=vendor_macs.tsv}" ]] || wget -O "${MAC_ADDRESSES_FILE}" https://gitlab.com/wireshark/wireshark/-/raw/master/manuf } +download_qcow_efi_folder () { + git clone 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 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_serial_sets () { mkdir -p "${OUTPUT_DIRECTORY}/envs" export DATE_NOW="$(date +%F-%T)" @@ -149,7 +178,25 @@ export BoardSerial=${BoardSerial} export SmUUID=${SmUUID} export MacAddress=${MacAddress} EOF - done + + if [[ "${CREATE_PLISTS}" ]] || [[ "${CREATE_QCOWS}" ]]; then + mkdir -p "${OUTPUT_DIRECTORY}/plists" + sed -e s/{{DEVICE_MODEL}}/"${Type}"/g \ + -e s/{{SERIAL_OLD}}/"${Serial}"/g \ + -e s/{{BOARD_SERIAL_OLD}}/"${BoardSerial}"/g \ + -e s/{{SYSTEM_UUID_OLD}}/"${SmUUID}"/g \ + -e s/{{ROM_OLD}}/"${ROM_VALUE}"/g \ + "${PLIST_MASTER}" > "${OUTPUT_DIRECTORY}/plists/${Serial}.config.plist" || exit 1 + fi + + if [[ "${CREATE_QCOWS}" ]]; then + mkdir -p "${OUTPUT_DIRECTORY}/qcows" + ./opencore-image-ng.sh \ + --cfg "${OUTPUT_DIRECTORY}/plists/${Serial}.config.plist" \ + --img "${OUTPUT_DIRECTORY}/qcows/${Serial}.OpenCore-nopicker.qcow2" || exit 1 + fi + + done cat <(echo "Type,Serial,BoardSerial,SmUUID,MacAddress") "${SERIAL_SETS_FILE}" } @@ -167,6 +214,7 @@ EOF [[ -d "${OUTPUT_DIRECTORY}" ]] || mkdir -p "${OUTPUT_DIRECTORY}" [[ -e ./macserial ]] || build_mac_serial download_vendor_mac_addresses + download_qcow_efi_folder generate_serial_sets echo "${SERIAL_SETS_FILE}" } diff --git a/custom/opencore-image-ng.sh b/custom/opencore-image-ng.sh new file mode 100755 index 0000000..6cbfe5b --- /dev/null +++ b/custom/opencore-image-ng.sh @@ -0,0 +1,163 @@ +#!/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 < + --img + --cfg +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 +} + +###################################################################### +# 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:OpenCoreBoo +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 $WORK/EFI/OC/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