quickemu/actions/macos

152 lines
6.7 KiB
Plaintext

# Template file for 'macos'
OSNAME="macos"
PRETTY="MacOS"
BASEDOF="-"
HOMEPAGE="https://www.apple.com/macos"
DESCRIPTION="Work and play on your Mac are even more powerful. Elevate your presence on video calls. Access information in all-new ways. Boost gaming performance."
CREDENTIALS="-"
RELEASES="mojave catalina big-sur monterey ventura sonoma"
GUEST="macos"
IMAGE_TYPE="img"
function releases_() {
echo mojave catalina big-sur monterey ventura sonoma
}
function generate_id() {
local macRecoveryID=""
local TYPE="${1}"
local valid_chars=("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F")
for ((i=0; i<TYPE; i++)); do
macRecoveryID+="${valid_chars[$((RANDOM % 16))]}"
done
echo "${macRecoveryID}"
}
function get_() {
local appleSession=""
local info=""
local downloadLink=""
local downloadSession=""
local chunkListLink=""
local chunkListSession=""
local BOARD_ID=""
local CWD=""
local CHECK=""
local CHUNKCHECK=""
local MLB="00000000000000000"
local OS_TYPE="default"
case ${RELEASE} in
lion|10.7)
BOARD_ID="Mac-2E6FAB96566FE58C"
MLB="00000000000F25Y00";;
mountainlion|10.8)
BOARD_ID="Mac-7DF2A3B5E5D671ED"
MLB="00000000000F65100";;
mavericks|10.9)
BOARD_ID="Mac-F60DEB81FF30ACF6"
MLB="00000000000FNN100";;
yosemite|10.10)
BOARD_ID="Mac-E43C1C25D4880AD6"
MLB="00000000000GDVW00";;
elcapitan|10.11)
BOARD_ID="Mac-FFE5EF870D7BA81A"
MLB="00000000000GQRX00";;
sierra|10.12)
BOARD_ID="Mac-77F17D7DA9285301"
MLB="00000000000J0DX00";;
high-sierra|10.13)
BOARD_ID="Mac-BE088AF8C5EB4FA2"
MLB="00000000000J80300";;
mojave|10.14)
BOARD_ID="Mac-7BA5B2DFE22DDD8C"
MLB="00000000000KXPG00";;
catalina|10.15)
BOARD_ID="Mac-00BE6ED71E35EB86";;
big-sur|11)
BOARD_ID="Mac-42FD25EABCABB274";;
monterey|12)
BOARD_ID="Mac-E43C1C25D4880AD6";;
ventura|13)
BOARD_ID="Mac-BE088AF8C5EB4FA2";;
sonoma|14)
BOARD_ID="Mac-53FDB3D8DB8CA971";;
*) echo "ERROR! Unknown release: ${RELEASE}"
releases_macos
exit 1;;
esac
CWD="$(dirname "${0}")"
if [ -x "${CWD}/chunkcheck" ]; then
CHUNKCHECK="${CWD}/chunkcheck"
elif [ -x "$(command -v chunkcheck)" ]; then
CHUNKCHECK="$(command -v chunkcheck)"
fi
appleSession=$(curl --disable -v -H "Host: osrecovery.apple.com" \
-H "Connection: close" \
-A "InternetRecovery/1.0" https://osrecovery.apple.com/ 2>&1 | tr ';' '\n' | awk -F'session=|;' '{print $2}' | grep 1)
info=$(curl --disable -s -X POST -H "Host: osrecovery.apple.com" \
-H "Connection: close" \
-A "InternetRecovery/1.0" \
-b "session=\"${appleSession}\"" \
-H "Content-Type: text/plain" \
-d $'cid='"$(generate_id 16)"$'\nsn='${MLB}$'\nbid='${BOARD_ID}$'\nk='"$(generate_id 64)"$'\nfg='"$(generate_id 64)"$'\nos='${OS_TYPE} \
https://osrecovery.apple.com/InstallationPayload/RecoveryImage | tr ' ' '\n')
downloadLink=$(echo "$info" | grep 'oscdn' | grep 'dmg')
downloadSession=$(echo "$info" | grep 'expires' | grep 'dmg')
chunkListLink=$(echo "$info" | grep 'oscdn' | grep 'chunklist')
chunkListSession=$(echo "$info" | grep 'expires' | grep 'chunklist')
if [ "${OPERATION}" == "show" ]; then
test_result "${OS}" "${RELEASE}" "" "${downloadLink}" | tee -a "public/tmp_${OS}"
exit 0
elif [ "${OPERATION}" == "test" ]; then
CHECK=$(web_check "${downloadLink}" --header "Host: oscdn.apple.com" --header "Connection: close" --header "User-Agent: InternetRecovery/1.0" --header "Cookie: AssetToken=${downloadSession}" && echo "PASS" || echo "FAIL")
test_result "${OS}" "${RELEASE}" "" "${downloadLink}" "${CHECK}" | tee -a "public/tmp_${OS}"
exit 0
elif [ "${OPERATION}" == "download" ]; then
echo "Downloading macOS (${RELEASE^}) RecoveryImage"
echo " - URL: ${downloadLink}"
web_get "${downloadLink}" "${VM_PATH}" RecoveryImage.dmg --header "Host: oscdn.apple.com" --header "Connection: close" --header "User-Agent: InternetRecovery/1.0" --header "Cookie: AssetToken=${downloadSession}"
web_get "${chunkListLink}" "${VM_PATH}" RecoveryImage.chunklist --header "Host: oscdn.apple.com" --header "Connection: close" --header "User-Agent: InternetRecovery/1.0" --header "Cookie: AssetToken=${chunkListSession}"
VM_PATH="$(pwd)"
else
if [ ! -e "${VM_PATH}/RecoveryImage.chunklist" ]; then
echo "Downloading macOS (${RELEASE^}) RecoveryImage"
echo " - URL: ${downloadLink}"
web_get "${downloadLink}" "${VM_PATH}" RecoveryImage.dmg --header "Host: oscdn.apple.com" --header "Connection: close" --header "User-Agent: InternetRecovery/1.0" --header "Cookie: AssetToken=${downloadSession}"
web_get "${chunkListLink}" "${VM_PATH}" RecoveryImage.chunklist --header "Host: oscdn.apple.com" --header "Connection: close" --header "User-Agent: InternetRecovery/1.0" --header "Cookie: AssetToken=${chunkListSession}"
if ! "${CHUNKCHECK}" "${VM_PATH}" 2> /dev/null; then
echo " - WARNING! Verification failed, continuing anyway"
else
echo " - Verification passed"
fi
if [ -e "${VM_PATH}/RecoveryImage.dmg" ] && [ ! -e "${VM_PATH}/RecoveryImage.img" ]; then
echo " - Converting RecoveryImage.dmg"
${QEMU_IMG} convert "${VM_PATH}/RecoveryImage.dmg" -O raw "${VM_PATH}/RecoveryImage.img" 2>/dev/null
fi
rm "${VM_PATH}/RecoveryImage.dmg" "${VM_PATH}/RecoveryImage.chunklist"
echo " - RecoveryImage.img is ready."
fi
echo "Downloading OpenCore & UEFI firmware"
web_get "https://github.com/kholia/OSX-KVM/raw/master/OpenCore/OpenCore.qcow2" "${VM_PATH}"
web_get "https://github.com/kholia/OSX-KVM/raw/master/OVMF_CODE.fd" "${VM_PATH}"
if [ ! -e "${VM_PATH}/OVMF_VARS-1920x1080.fd" ]; then
web_get "https://github.com/kholia/OSX-KVM/raw/master/OVMF_VARS-1920x1080.fd" "${VM_PATH}"
fi
fi
make_vm_config RecoveryImage.img
}
function specific_tweaks() {
echo "disk_size=\"128G\"" >> "${CONF_FILE}"
echo "macos_release=\"${RELEASE}\"" >> "${CONF_FILE}"
# https://github.com/quickemu-project/quickemu/issues/438
if [ "${RELEASE}" == "monterey" ]; then
echo "cpu_cores=2" >> "${CONF_FILE}"
fi
}