mirror of
https://github.com/sickcodes/osx-serial-generator.git
synced 2024-11-23 12:39:41 +00:00
271 lines
7.9 KiB
Bash
271 lines
7.9 KiB
Bash
|
#!/bin/bash
|
||
|
# ___ _____ __ ___ _ _ ___ _
|
||
|
# / _ \/ __\ \/ / / __| ___ _ _(_)__ _| | / __|___ _ _ ___ _ _ __ _| |_ ___ _ _
|
||
|
# | (_) \__ \> < \__ \/ -_) '_| / _` | | | (_ / -_) ' \/ -_) '_/ _` | _/ _ \ '_|
|
||
|
# \___/|___/_/\_\ |___/\___|_| |_\__,_|_| \___\___|_||_\___|_| \__,_|\__\___/_|
|
||
|
#
|
||
|
# Repo: https://github.com/sickcodes/osx-serial-generator/
|
||
|
# Title: OSX Serial Generator
|
||
|
# Author: Sick.Codes https://sick.codes/
|
||
|
# Version: 3.1
|
||
|
# License: GPLv3+
|
||
|
|
||
|
set -e
|
||
|
|
||
|
help_text="Usage: ./generate-specific-bootdisk.sh
|
||
|
|
||
|
Required options:
|
||
|
--model <string> Device model, e.g. 'iMacPro1,1'
|
||
|
--serial <string> Device Serial number
|
||
|
--board-serial <string> Main Logic Board Serial number (MLB)
|
||
|
--uuid <string> SMBIOS UUID (SmUUID)
|
||
|
--mac-address <string> Used for both the MAC address and to set ROM
|
||
|
ROM is lowercased sans any colons
|
||
|
Optional options:
|
||
|
--width <integer> Resolution x axis length in px, default 1920
|
||
|
--height <integer> Resolution y axis length in px, default 1080
|
||
|
--master-plist-url <url> Specify an alternative master plist, via URL
|
||
|
--custom-plist <filename>
|
||
|
|| --master-plist <filename> Optionally change the input plist.
|
||
|
--output-bootdisk <filename> Optionally change the bootdisk filename
|
||
|
--output-plist <filename> Optionally change the output plist filename
|
||
|
--help, -h, help Display this help and exit
|
||
|
|
||
|
Placeholders: {{DEVICE_MODEL}}, {{SERIAL}}, {{BOARD_SERIAL}}, {{UUID}},
|
||
|
{{ROM}}, {{WIDTH}}, {{HEIGHT}}
|
||
|
|
||
|
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 \\
|
||
|
--width 1920 \\
|
||
|
--height 1080
|
||
|
|
||
|
Author: Sick.Codes https://sick.codes/
|
||
|
Project: https://github.com/sickcodes/osx-serial-generator/
|
||
|
License: GPLv3+
|
||
|
"
|
||
|
|
||
|
OPENCORE_IMAGE_MAKER_URL='https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/opencore-image-ng.sh'
|
||
|
MASTER_PLIST_URL='https://raw.githubusercontent.com/sickcodes/osx-serial-generator/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
|
||
|
;;
|
||
|
|
||
|
--width=* )
|
||
|
export WIDTH="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
--width* )
|
||
|
export WIDTH="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--height=* )
|
||
|
export HEIGHT="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
--height* )
|
||
|
export HEIGHT="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--output-bootdisk=* )
|
||
|
export OUTPUT_QCOW="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
--output-bootdisk* )
|
||
|
export OUTPUT_QCOW="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--output-plist=* )
|
||
|
export OUTPUT_PLIST="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
--output-plist* )
|
||
|
export OUTPUT_PLIST="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--master-plist-url=* )
|
||
|
export MASTER_PLIST_URL="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--master-plist-url* )
|
||
|
export MASTER_PLIST_URL="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--master-plist=* )
|
||
|
export MASTER_PLIST="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
--master-plist* )
|
||
|
export MASTER_PLIST="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
--custom-plist=* )
|
||
|
export MASTER_PLIST="${1#*=}"
|
||
|
shift
|
||
|
;;
|
||
|
--custom-plist* )
|
||
|
export MASTER_PLIST="${2}"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
|
||
|
*)
|
||
|
echo "Invalid option ${1}. Running with default values..."
|
||
|
shift
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
|
||
|
download_qcow_efi_folder () {
|
||
|
[ -d ./OSX-KVM ] || 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
|
||
|
[ -d ./OcBinaryData ] || 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 () {
|
||
|
|
||
|
# need a config.plist
|
||
|
if [ "${MASTER_PLIST}" ]; then
|
||
|
[ -e "${MASTER_PLIST}" ] || echo "Could not find: ${MASTER_PLIST}"
|
||
|
elif [ "${MASTER_PLIST}" ] && [ "${MASTER_PLIST_URL}" ]; then
|
||
|
echo 'You specified both a custom plist FILE & custom plist URL.'
|
||
|
echo 'Use only one of those options.'
|
||
|
elif [ "${MASTER_PLIST_URL}" ]; then
|
||
|
wget -O "${MASTER_PLIST:=./config-custom.plist}" "${MASTER_PLIST_URL}"
|
||
|
else
|
||
|
# default is config-nopicker-custom.plist from OSX-KVM with placeholders used in Docker-OSX
|
||
|
wget -O "${MASTER_PLIST:=./config-nopicker-custom.plist}" "${MASTER_PLIST_URL}"
|
||
|
fi
|
||
|
|
||
|
[ -e ./opencore-image-ng.sh ] \
|
||
|
|| { wget "${OPENCORE_IMAGE_MAKER_URL}" \
|
||
|
&& 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 \
|
||
|
-e s/\{\{WIDTH\}\}/"${WIDTH:-1920}"/g \
|
||
|
-e s/\{\{HEIGHT\}\}/"${HEIGHT:-1080}"/g \
|
||
|
"${MASTER_PLIST}" > ./tmp.config.plist || exit 1
|
||
|
else
|
||
|
cat <<EOF && exit 1
|
||
|
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}"
|
||
|
|
||
|
--width "${WIDTH:-1920}"
|
||
|
--height "${HEIGHT:-1080}"
|
||
|
|
||
|
EOF
|
||
|
fi
|
||
|
|
||
|
./opencore-image-ng.sh \
|
||
|
--cfg "./tmp.config.plist" \
|
||
|
--img "${OUTPUT_QCOW:-./${SERIAL}.OpenCore-nopicker.qcow2}" || exit 1
|
||
|
rm ./tmp.config.plist
|
||
|
|
||
|
}
|
||
|
|
||
|
main () {
|
||
|
download_qcow_efi_folder
|
||
|
generate_bootdisk
|
||
|
}
|
||
|
|
||
|
main
|
||
|
|