-
-
Save 1Conan/c1e55b0df3b62390f7cab01a72dd6da5 to your computer and use it in GitHub Desktop.
newstyle OTA
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/zsh | |
set -e; | |
dir="$(mktemp -d)"; | |
echo "$dir" >&2; | |
iOS_device=(); | |
iOS_model=(); | |
ios() # device model | |
{ | |
iOS_device+=("$1"); | |
iOS_model+=("$2"); | |
} | |
ios 'iPhone6,1' 'N51AP' # iPhone 5s | |
ios 'iPhone6,2' 'N53AP' # iPhone 5s | |
ios 'iPhone7,1' 'N56AP' # iPhone 6+ | |
ios 'iPhone7,2' 'N61AP' # iPhone 6 | |
ios 'iPhone8,1' 'N71AP' # iPhone 6s | |
ios 'iPhone8,1' 'N71mAP' # iPhone 6s | |
ios 'iPhone8,2' 'N66AP' # iPhone 6s+ | |
ios 'iPhone8,2' 'N66mAP' # iPhone 6s+ | |
ios 'iPhone8,4' 'N69AP' # iPhone SE | |
ios 'iPhone8,4' 'N69uAP' # iPhone SE | |
ios 'iPhone9,1' 'D10AP' # iPhone 7 | |
ios 'iPhone9,2' 'D11AP' # iPhone 7+ | |
ios 'iPhone9,3' 'D101AP' # iPhone 7 | |
ios 'iPhone9,4' 'D111AP' # iPhone 7+ | |
ios 'iPhone10,1' 'D20AP' # iPhone 8 | |
ios 'iPhone10,1' 'D20AAP' # iPhone 8 | |
ios 'iPhone10,2' 'D21AP' # iPhone 8+ | |
ios 'iPhone10,2' 'D21AAP' # iPhone 8+ | |
ios 'iPhone10,3' 'D22AP' # iPhone X | |
ios 'iPhone10,4' 'D201AP' # iPhone 8 | |
ios 'iPhone10,4' 'D201AAP' # iPhone 8 | |
ios 'iPhone10,5' 'D211AP' # iPhone 8+ | |
ios 'iPhone10,5' 'D211AAP' # iPhone 8+ | |
ios 'iPhone10,6' 'D221AP' # iPhone X | |
ios 'iPhone11,2' 'D321AP' # iPhone XS | |
ios 'iPhone11,4' 'D331AP' # iPhone XS Max | |
ios 'iPhone11,6' 'D331pAP' # iPhone XS Max | |
ios 'iPhone11,8' 'N841AP' # iPhone XR | |
ios 'iPhone12,1' 'N104AP' # iPhone 11 | |
ios 'iPhone12,3' 'D421AP' # iPhone 11 Pro | |
ios 'iPhone12,5' 'D431AP' # iPhone 11 Pro Max | |
ios 'iPhone12,8' 'D79AP' # iPhone SE 2 | |
ios 'iPod7,1' 'N102AP' # iPod touch 6 | |
ios 'iPod9,1' 'N112AP' # iPod touch 7 | |
ios 'iPad6,11' 'J71sAP' # iPad 5 | |
ios 'iPad6,11' 'J71tAP' # iPad 5 | |
ios 'iPad6,12' 'J72sAP' # iPad 5 | |
ios 'iPad6,12' 'J72tAP' # iPad 5 | |
ios 'iPad7,5' 'J71bAP' # iPad 6 | |
ios 'iPad7,6' 'J72bAP' # iPad 6 | |
ios 'iPad7,11' 'J171AP' # iPad 7 | |
ios 'iPad7,12' 'J172AP' # iPad 7 | |
ios 'iPad4,1' 'J71AP' # iPad Air 1 | |
ios 'iPad4,2' 'J72AP' # iPad Air 1 | |
ios 'iPad4,3' 'J73AP' # iPad Air 1 | |
ios 'iPad5,3' 'J81AP' # iPad Air 2 | |
ios 'iPad5,4' 'J82AP' # iPad Air 2 | |
ios 'iPad11,3' 'J217AP' # iPad Air 3 | |
ios 'iPad11,4' 'J218AP' # iPad Air 3 | |
ios 'iPad4,4' 'J85AP' # iPad mini 2 | |
ios 'iPad4,5' 'J86AP' # iPad mini 2 | |
ios 'iPad4,6' 'J87AP' # iPad mini 2 | |
ios 'iPad4,7' 'J85mAP' # iPad mini 3 | |
ios 'iPad4,8' 'J86mAP' # iPad mini 3 | |
ios 'iPad4,9' 'J87mAP' # iPad mini 3 | |
ios 'iPad5,1' 'J96AP' # iPad mini 4 | |
ios 'iPad5,2' 'J97AP' # iPad mini 4 | |
ios 'iPad11,1' 'J210AP' # iPad mini 5 | |
ios 'iPad11,2' 'J211AP' # iPad mini 5 | |
ios 'iPad6,3' 'J127AP' # iPad Pro 1 (9.7") | |
ios 'iPad6,4' 'J128AP' # iPad Pro 1 (9.7") | |
ios 'iPad6,7' 'J98aAP' # iPad Pro 1 (12.9") | |
ios 'iPad6,8' 'J99aAP' # iPad Pro 1 (12.9") | |
ios 'iPad7,1' 'J120AP' # iPad Pro 2 (12.9") | |
ios 'iPad7,2' 'J121AP' # iPad Pro 2 (12.9") | |
ios 'iPad7,3' 'J207AP' # iPad Pro 2 (10.5") | |
ios 'iPad7,4' 'J208AP' # iPad Pro 2 (10.5") | |
ios 'iPad8,1' 'J317AP' # iPad Pro 3 (11.0") | |
ios 'iPad8,2' 'J317xAP' # iPad Pro 3 (11.0") | |
ios 'iPad8,3' 'J318AP' # iPad Pro 3 (11.0") | |
ios 'iPad8,4' 'J318xAP' # iPad Pro 3 (11.0") | |
ios 'iPad8,5' 'J320AP' # iPad Pro 3 (12.9") | |
ios 'iPad8,6' 'J320xAP' # iPad Pro 3 (12.9") | |
ios 'iPad8,7' 'J321AP' # iPad Pro 3 (12.9") | |
ios 'iPad8,8' 'J321xAP' # iPad Pro 3 (12.9") | |
ios 'iPad8,9' 'J417AP' # iPad Pro 4 (11.0") | |
ios 'iPad8,10' 'J418AP' # iPad Pro 4 (11.0") | |
ios 'iPad8,11' 'J420AP' # iPad Pro 4 (12.9") | |
ios 'iPad8,12' 'J421AP' # iPad Pro 4 (12.9") | |
tvOS_device=(); | |
tvOS_model=(); | |
tvos() # device model | |
{ | |
tvOS_device+=("$1"); | |
tvOS_model+=("$2"); | |
} | |
tvos 'AppleTV5,3' 'J42dAP' # AppleTV 4 | |
tvos 'AppleTV6,2' 'J105aAP' # AppleTV 4k | |
watchOS_device=(); | |
watchOS_model=(); | |
watchos() # device model | |
{ | |
watchOS_device+=("$1"); | |
watchOS_model+=("$2"); | |
} | |
watchos 'Watch1,1' 'N27aAP' # Apple Watch | |
watchos 'Watch1,2' 'N28aAP' # Apple Watch | |
watchos 'Watch2,6' 'N27dAP' # Apple Watch Series 1 | |
watchos 'Watch2,7' 'N28dAP' # Apple Watch Series 1 | |
watchos 'Watch2,3' 'N74AP' # Apple Watch Series 2 | |
watchos 'Watch2,4' 'N75AP' # Apple Watch Series 2 | |
watchos 'Watch3,1' 'N111sAP' # Apple Watch Series 3 | |
watchos 'Watch3,2' 'N111bAP' # Apple Watch Series 3 | |
watchos 'Watch3,3' 'N121sAP' # Apple Watch Series 3 | |
watchos 'Watch3,4' 'N121bAP' # Apple Watch Series 3 | |
watchos 'Watch4,1' 'N131sAP' # Apple Watch Series 4 | |
watchos 'Watch4,2' 'N131bAP' # Apple Watch Series 4 | |
watchos 'Watch4,3' 'N141sAP' # Apple Watch Series 4 | |
watchos 'Watch4,4' 'N141bAP' # Apple Watch Series 4 | |
watchos 'Watch5,1' 'N144sAP' # Apple Watch Series 5 | |
watchos 'Watch5,2' 'N144bAP' # Apple Watch Series 5 | |
watchos 'Watch5,3' 'N146sAP' # Apple Watch Series 5 | |
watchos 'Watch5,4' 'N146bAP' # Apple Watch Series 5 | |
audioOS_device=(); | |
audioOS_model=(); | |
audioos() # device model | |
{ | |
audioOS_device+=("$1"); | |
audioOS_model+=("$2"); | |
} | |
audioos 'AudioAccessory1,1' 'B238aAP' | |
audioos 'AudioAccessory1,2' 'B238AP' | |
# AssetAudiences: | |
# 01c1d682-6e8f-4908-b724-5501fe3f5e5c iOS release | |
# ce9c2203-903b-4fb3-9f03-040dc2202694 iOS internal (not publicly accessible) | |
# b7580fda-59d3-43ae-9488-a81b825e3c73 iOS 11 beta | |
# ef473147-b8e7-4004-988e-0ae20e2532ef iOS 12 beta | |
# d8ab8a45-ee39-4229-891e-9d3ca78a87ca iOS 13 beta | |
# 84da8706-e267-4554-8207-865ae0c3a120 iOS 14 beta | |
# 356d9da0-eee4-4c6c-bbe5-99b60eadddf0 tvOS release | |
# ebd90ea1-6216-4a7c-920e-666faccb2d50 tvOS 11 beta (returns 404) | |
# 5b220c65-fe50-460b-bac5-b6774b2ff475 tvOS 12 beta | |
# 975af5cb-019b-42db-9543-20327280f1b2 tvOS 13 beta | |
# 65254ac3-f331-4c19-8559-cbe22f5bc1a6 tvOS 14 beta | |
# b82fcf9c-c284-41c9-8eb2-e69bf5a5269f watchOS release | |
# f659e06d-86a2-4bab-bcbb-61b7c60969ce watchOS 4 beta (returns 404) | |
# e841259b-ad2e-4046-b80f-ca96bc2e17f3 watchOS 5 beta | |
# d08cfd47-4a4a-4825-91b5-3353dfff194f watchOS 6 beta | |
# ff6df985-3cbe-4d54-ba5f-50d02428d2a3 watchOS 7 beta | |
# 0322d49d-d558-4ddf-bdff-c0443d0e6fac audioOS release | |
# b05ddb59-b26d-4c89-9d09-5fda15e99207 audioOS 14 beta | |
dl() # audience device model version | |
{ | |
if ! a="$(curl -s -S -f -H 'Content-Type: application/json' -H 'Accept: application/json' 'https://gdmf.apple.com/v2/assets' --data '{"AssetAudience":"'"$1"'", "ClientVersion":2, "AssetType":"com.apple.MobileAsset.SoftwareUpdate", "ProductType":"'"$2"'", "HWModelStr":"'"$3"'", "BuildVersion":"'"$4"'"}')"; then | |
echo "Failed to fetch: $1 $2 $3 $4" >&2; | |
return 1; | |
fi; | |
a=("${(@s/./)a}"); | |
a="$(tr '_' '/' <<<"${a[2]}" | tr '-' '+')"; | |
while [ $((${#a} % 4)) -ne 0 ]; do | |
a="${a}="; | |
done; | |
a="$(base64 -D <<<"$a")"; | |
jq '.Assets' <<<"$a" >"$dir/$2-$3-$(jq -r '.PallasNonce' <<<"$a").json"; | |
} | |
n=0; | |
all="$((5*${#iOS_device[@]} + 4*${#tvOS_device[@]} + 4*${#watchOS_device[@]} + 2*${#audioOS_device[@]}))"; | |
printf '\r%d/%d' "$n" "$all" >&2; | |
for ((i = 1; i <= ${#iOS_device[@]}; i++)); do | |
dl '01c1d682-6e8f-4908-b724-5501fe3f5e5c' "${iOS_device[$i]}" "${iOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'b7580fda-59d3-43ae-9488-a81b825e3c73' "${iOS_device[$i]}" "${iOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'ef473147-b8e7-4004-988e-0ae20e2532ef' "${iOS_device[$i]}" "${iOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'd8ab8a45-ee39-4229-891e-9d3ca78a87ca' "${iOS_device[$i]}" "${iOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl '84da8706-e267-4554-8207-865ae0c3a120' "${iOS_device[$i]}" "${iOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
done; | |
for ((i = 1; i <= ${#tvOS_device[@]}; i++)); do | |
dl '356d9da0-eee4-4c6c-bbe5-99b60eadddf0' "${tvOS_device[$i]}" "${tvOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl '5b220c65-fe50-460b-bac5-b6774b2ff475' "${tvOS_device[$i]}" "${tvOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl '975af5cb-019b-42db-9543-20327280f1b2' "${tvOS_device[$i]}" "${tvOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl '65254ac3-f331-4c19-8559-cbe22f5bc1a6' "${tvOS_device[$i]}" "${tvOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
done; | |
for ((i = 1; i <= ${#watchOS_device[@]}; i++)); do | |
dl 'b82fcf9c-c284-41c9-8eb2-e69bf5a5269f' "${watchOS_device[$i]}" "${watchOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'e841259b-ad2e-4046-b80f-ca96bc2e17f3' "${watchOS_device[$i]}" "${watchOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'd08cfd47-4a4a-4825-91b5-3353dfff194f' "${watchOS_device[$i]}" "${watchOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'ff6df985-3cbe-4d54-ba5f-50d02428d2a3' "${watchOS_device[$i]}" "${watchOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
done; | |
for ((i = 1; i <= ${#audioOS_device[@]}; i++)); do | |
dl '0322d49d-d558-4ddf-bdff-c0443d0e6fac' "${audioOS_device[$i]}" "${audioOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
dl 'b05ddb59-b26d-4c89-9d09-5fda15e99207' "${audioOS_device[$i]}" "${audioOS_model[$i]}" '0'; n=$(($n+1)); printf '\r%d/%d' "$n" "$all" >&2; | |
done; | |
printf '\n' >&2; | |
jq -r 'def pad(s;l): s+(" "*(l-(s|length))); .[] | (pad(.OSVersion;12) + pad(.Build;12) + pad(.PrerequisiteOSVersion;12) + pad(.PrerequisiteBuild;12) + pad(.SupportedDevices|join(",");20) + pad(.SupportedDeviceModels|join(",");12) + .__BaseURL + .__RelativePath )' "$dir"/*.json | sort -u; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment