286 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			286 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/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
 | |
|     --input-plist-url <url>         Specify an alternative master plist, via URL
 | |
|     --master-plist-url <url>        Same as above.
 | |
|     --custom-plist <filename>       Optionally change the input plist.
 | |
|     --master-plist <filename>       Same as above.
 | |
|     --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=* | --input-plist-url=* | --custom-plist-url=* )
 | |
|                 export MASTER_PLIST_URL="${1#*=}"
 | |
|                 shift
 | |
|             ;;
 | |
| 
 | |
|     --master-plist-url* | --input-plist-url* | --custom-plist-url* )
 | |
|                 export MASTER_PLIST_URL="${2}"
 | |
|                 shift
 | |
|                 shift
 | |
|             ;;
 | |
| 
 | |
|     --master-plist=* | --input-plist=* | --custom-plist=* )
 | |
|                 export MASTER_PLIST="${1#*=}"
 | |
|                 shift
 | |
|             ;;
 | |
| 
 | |
|     --master-plist* | --input-plist* | --custom-plist* )
 | |
|                 export MASTER_PLIST="${2}"
 | |
|                 shift
 | |
|                 shift
 | |
|             ;;
 | |
| 
 | |
|     *)
 | |
|                 echo "Invalid option ${1}. Running with default values..."
 | |
|                 shift
 | |
|             ;;
 | |
|     esac
 | |
| done
 | |
| 
 | |
| 
 | |
| download_qcow_efi_folder () {
 | |
| 
 | |
|     export EFI_FOLDER=./OpenCore-Catalina/EFI
 | |
|     export RESOURCES_FOLDER=./resources/OcBinaryData/Resources
 | |
| 
 | |
|     # check if we are inside OSX-KVM already
 | |
|     # if not, download OSX-KVM locally
 | |
|     [ -d ./OpenCore-Catalina/EFI/ ] || {
 | |
|         [ -d ./OSX-KVM/ ] || git clone --recurse-submodules --depth 1 https://github.com/kholia/OSX-KVM.git
 | |
|         export EFI_FOLDER="./OSX-KVM/${EFI_FOLDER}"
 | |
|     }
 | |
|     
 | |
|     [ -d ./resources/OcBinaryData/Resources/ ] || {
 | |
|         export RESOURCES_FOLDER="./OSX-KVM/${RESOURCES_FOLDER}"
 | |
|     }
 | |
| 
 | |
|     # EFI Shell commands
 | |
|     touch startup.nsh && echo 'fs0:\EFI\BOOT\BOOTx64.efi' > startup.nsh
 | |
| 
 | |
|     cp -ra "${EFI_FOLDER}" .
 | |
| 
 | |
|     mkdir -p ./EFI/OC/Resources
 | |
| 
 | |
|     # copy Apple drivers into EFI/OC/Resources
 | |
|     cp -a "${RESOURCES_FOLDER}"/* ./EFI/OC/Resources
 | |
| }
 | |
| 
 | |
| 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
 | |
| 
 |