Skip to content

Instantly share code, notes, and snippets.

@1Conan
Forked from Siguza/pallas.sh
Created July 8, 2020 14:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1Conan/c1e55b0df3b62390f7cab01a72dd6da5 to your computer and use it in GitHub Desktop.
Save 1Conan/c1e55b0df3b62390f7cab01a72dd6da5 to your computer and use it in GitHub Desktop.
newstyle OTA
#!/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