Merge pull request #237 from asdfugil/options

better option parsing
This commit is contained in:
mineek authored and GitHub committed 2022-11-17 20:02:56 +01:00
commit 407a01f74a
1 file changed
+156 -54
+156 -54
View File
@@ -3,10 +3,6 @@
mkdir -p logs mkdir -p logs
set -e set -e
if [[ "$@" == *"--debug"* ]]; then
set -o xtrace
fi
{ {
echo "[*] Command ran:`if [ $EUID = 0 ]; then echo " sudo"; fi` ./palera1n.sh $@" echo "[*] Command ran:`if [ $EUID = 0 ]; then echo " sudo"; fi` ./palera1n.sh $@"
@@ -20,6 +16,8 @@ os=$(uname)
dir="$(pwd)/binaries/$os" dir="$(pwd)/binaries/$os"
commit=$(git rev-parse --short HEAD) commit=$(git rev-parse --short HEAD)
branch=$(git rev-parse --abbrev-ref HEAD) branch=$(git rev-parse --abbrev-ref HEAD)
max_args=1
arg_count=0
# ========= # =========
# Functions # Functions
@@ -32,6 +30,106 @@ step() {
printf '\r\e[0m%s (0)\n' "$2" printf '\r\e[0m%s (0)\n' "$2"
} }
print_help() {
cat << EOF
Usage: $0 [Options] [ subcommand | iOS version ]
iOS 15.0-15.7.1 jailbreak tool for checkm8 devices
Options:
--help Print this help
--tweaks Enable tweaks
--semi-tethered When used with --tweaks, make the jailbreak semi-tethered instead of tethered
--dfuhelper A helper to help get A11 devices into DFU mode from recovery mode
--no-baseband When used with --semi-tethered, allows the fakefs to be created correctly on no baseband devices
--skip-fakefs Don't create the fakefs even if --semi-tethered is specified
--no-install Skip murdering Tips app
--restorerootfs Restore the root fs on tethered
--debug Debug the script
--verbose Enable verbose boot on the device
Subcommands:
dfuhelper An alias for --dfuhelper
clean Deletes the created boot files
The iOS version argument should be the iOS version of your device.
It is required when starting from DFU mode.
EOF
}
parse_opt() {
case "$1" in
--)
no_more_opts=1
;;
--tweaks)
tweaks=1
;;
--semi-tethered)
semi_tethered=1
;;
--dfuhelper)
dfuhelper=1
;;
--skip-fakefs)
skip_fakefs=1
;;
--no-baseband)
no_baseband=1
;;
--no-install)
no_install=1
;;
--verbose)
verbose=1
;;
--dfu)
dfu=1
;;
--restorerootfs)
restorerootfs=1
;;
--debug)
debug=1
;;
--help)
print_help
exit 0
;;
*)
echo "[-] Unknown option $1. Use $0 --help for help."
exit 1;
esac
}
parse_arg() {
((arg_count++))
echo "$1"
case "$1" in
dfuhelper)
dfuhelper=1
;;
clean)
clean=1
;;
*)
version="$1"
;;
esac
}
parse_cmdline() {
for arg in $@; do
if [[ "$arg" == --* ]] && [ -z "$no_more_opts" ]; then
parse_opt "$arg";
elif [ "$arg_count" -lt "$max_args" ]; then
parse_arg "$arg";
else
echo "[-] Too many arguments. Use $0 --help for help.";
exit 1;
fi
done
}
_wait() { _wait() {
if [ "$1" = 'normal' ]; then if [ "$1" = 'normal' ]; then
if [ "$os" = 'Darwin' ]; then if [ "$os" = 'Darwin' ]; then
@@ -70,7 +168,7 @@ _wait() {
done done
fi fi
if [ "$1" = "--tweaks" ]; then if [ "$tweaks" = "1" ]; then
"$dir"/irecovery -c "setenv auto-boot false" "$dir"/irecovery -c "setenv auto-boot false"
"$dir"/irecovery -c "saveenv" "$dir"/irecovery -c "saveenv"
else else
@@ -78,7 +176,7 @@ _wait() {
"$dir"/irecovery -c "saveenv" "$dir"/irecovery -c "saveenv"
fi fi
if [[ "$@" == *"--semi-tethered"* ]]; then if [ "$semi_tethered" = "1" ]; then
"$dir"/irecovery -c "setenv auto-boot true" "$dir"/irecovery -c "setenv auto-boot true"
"$dir"/irecovery -c "saveenv" "$dir"/irecovery -c "saveenv"
fi fi
@@ -163,7 +261,7 @@ _beta_url() {
_exit_handler() { _exit_handler() {
if [ "$os" = 'Darwin' ]; then if [ "$os" = 'Darwin' ]; then
if [ ! "$1" = '--dfu' ]; then if [ -z "$dfu" ]; then
defaults write -g ignore-devices -bool false defaults write -g ignore-devices -bool false
defaults write com.apple.AMPDevicesAgent dontAutomaticallySyncIPods -bool false defaults write com.apple.AMPDevicesAgent dontAutomaticallySyncIPods -bool false
killall Finder killall Finder
@@ -193,28 +291,6 @@ if [ "$os" = 'Darwin' ]; then
killall Finder killall Finder
fi fi
# ===========
# Subcommands
# ===========
if [ "$1" = 'clean' ]; then
rm -rf boot* work .tweaksinstalled
echo "[*] Removed the created boot files"
exit
elif [ "$1" = 'dfuhelper' ]; then
echo "[*] Running DFU helper"
_dfuhelper
exit
elif [ "$1" = '--restorerootfs' ]; then
echo "[*] Restoring rootfs..."
"$dir"/irecovery -n
sleep 2
echo "[*] Done, your device will boot into iOS now."
# clean the boot files bcs we don't need them anymore
rm -rf boot-"$deviceid" work .tweaksinstalled
exit
fi
# ============ # ============
# Dependencies # Dependencies
# ============ # ============
@@ -266,17 +342,45 @@ echo "palera1n | Version $version-$branch-$commit"
echo "Written by Nebula and Mineek | Some code and ramdisk from Nathan | Loader app by Amy" echo "Written by Nebula and Mineek | Some code and ramdisk from Nathan | Loader app by Amy"
echo "" echo ""
if [ ! "$1" = '--tweaks' ] && [[ "$@" == *"--semi-tethered"* ]]; then parse_cmdline "$@"
echo "[!] --semi-tethered may not be used with rootless"
echo " Rootless is already semi-tethered" if [ "$debug" = "1" ]; then
set -o xtrace
fi
# ===========
# Subcommands
# ===========
if [ "$clean" = "1" ]; then
rm -rf boot* work .tweaksinstalled
echo "[*] Removed the created boot files"
exit
elif [ "$dfuhelper" = "1" ]; then
echo "[*] Running DFU helper"
_dfuhelper
exit
elif [ "$restorerootfs" = "1" ]; then
echo "[*] Restoring rootfs..."
"$dir"/irecovery -n
sleep 2
echo "[*] Done, your device will boot into iOS now."
# clean the boot files bcs we don't need them anymore
rm -rf boot-"$deviceid" work .tweaksinstalled
exit exit
fi fi
if [ "$1" = '--tweaks' ]; then if [ -z "$tweaks" ] && [ "$semi_tethered" = "1" ]; then
echo "[!] --semi-tethered may not be used with rootless"
echo " Rootless is already semi-tethered"
exit 1;
fi
if [ "$tweaks" = "1" ]; then
_check_dfu _check_dfu
fi fi
if [ "$1" = '--tweaks' ] && [ ! -e ".tweaksinstalled" ] && [ ! -e ".disclaimeragree" ] && [[ ! "$@" == *"--semi-tethered"* ]]; then if [ "$tweaks" = 1 ] && [ ! -e ".tweaksinstalled" ] && [ ! -e ".disclaimeragree" ] && [ -z "$semi_tethered" ]; then
echo "!!! WARNING WARNING WARNING !!!" echo "!!! WARNING WARNING WARNING !!!"
echo "This flag will add tweak support BUT WILL BE TETHERED." echo "This flag will add tweak support BUT WILL BE TETHERED."
echo "THIS ALSO MEANS THAT YOU'LL NEED A PC EVERY TIME TO BOOT." echo "THIS ALSO MEANS THAT YOU'LL NEED A PC EVERY TIME TO BOOT."
@@ -301,12 +405,10 @@ if [ "$1" = '--tweaks' ] && [ ! -e ".tweaksinstalled" ] && [ ! -e ".disclaimerag
fi fi
# Get device's iOS version from ideviceinfo if in normal mode # Get device's iOS version from ideviceinfo if in normal mode
if [ "$1" = '--dfu' ] || [ "$1" = '--tweaks' ]; then if [ "$dfu" = "1" ] || [ "$tweaks" = "1" ]; then
if [ -z "$2" ]; then if [ -z "$version" ]; then
echo "[-] When using --dfu, please pass the version you're device is on" echo "[-] When using --dfu, please pass the version you're device is on"
exit exit
else
version=$2
fi fi
else else
_wait normal _wait normal
@@ -335,7 +437,7 @@ else
fi fi
# Have the user put the device into DFU # Have the user put the device into DFU
if [ ! "$1" = '--dfu' ] && [ ! "$1" = '--tweaks' ]; then if [ -z "$dfu" ] && [ -z "$tweaks" ]; then
_dfuhelper _dfuhelper
fi fi
sleep 2 sleep 2
@@ -344,7 +446,7 @@ sleep 2
# Ramdisk # Ramdisk
# ============ # ============
# Dump blobs, and install pogo if needed # Dump blobs, and install pogo if needed
if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then
mkdir -p blobs mkdir -p blobs
@@ -383,12 +485,12 @@ if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then
"$dir"/img4tool --convert -s blobs/"$deviceid"-"$version".shsh2 dump.raw "$dir"/img4tool --convert -s blobs/"$deviceid"-"$version".shsh2 dump.raw
rm dump.raw rm dump.raw
if [[ "$@" == *"--semi-tethered"* ]]; then if [ "$semi_tethered" = "1" ]; then
if [[ ! "$@" == *"--skip-fakefs"* ]]; then if [ -z "$skip_fakefs" ]; then
echo "[*] Creating fakefs, this may take a while (up to 10 minutes)" echo "[*] Creating fakefs, this may take a while (up to 10 minutes)"
"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/sbin/newfs_apfs -A -D -o role=r -v System /dev/disk0s1" "$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/sbin/newfs_apfs -A -D -o role=r -v System /dev/disk0s1"
sleep 2 sleep 2
if [[ "$@" == *"--no-baseband"* ]]; then if [ "$skip_baseband" = "1" ]; then
"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/sbin/mount_apfs /dev/disk0s1s7 /mnt8" "$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/sbin/mount_apfs /dev/disk0s1s7 /mnt8"
else else
"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/sbin/mount_apfs /dev/disk0s1s8 /mnt8" "$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/sbin/mount_apfs /dev/disk0s1s8 /mnt8"
@@ -401,7 +503,7 @@ if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then
fi fi
fi fi
if [[ ! "$@" == *"--no-install"* ]]; then if [ -z "$no_install" ]; then
tipsdir=$("$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/bin/find /mnt2/containers/Bundle/Application/ -name 'Tips.app'" 2> /dev/null) tipsdir=$("$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/bin/find /mnt2/containers/Bundle/Application/ -name 'Tips.app'" 2> /dev/null)
sleep 1 sleep 1
if [ "$tipsdir" = "" ]; then if [ "$tipsdir" = "" ]; then
@@ -430,7 +532,7 @@ if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then
#"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram allow-root-hash-mismatch=1" #"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram allow-root-hash-mismatch=1"
#"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram root-live-fs=1" #"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram root-live-fs=1"
if [[ "$@" == *"--semi-tethered"* ]]; then if [ "$semi_tethered" = "1" ]; then
"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram auto-boot=true" "$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram auto-boot=true"
else else
"$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram auto-boot=false" "$dir"/sshpass -p 'alpine' ssh -o StrictHostKeyChecking=no -p2222 root@localhost "/usr/sbin/nvram auto-boot=false"
@@ -474,7 +576,7 @@ if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then
sleep 1 sleep 1
if [[ "$deviceid" == *'iPhone8'* ]] || [[ "$deviceid" == *'iPad6'* ]] || [[ "$deviceid" == *'iPad5'* ]]; then if [[ "$deviceid" == *'iPhone8'* ]] || [[ "$deviceid" == *'iPad6'* ]] || [[ "$deviceid" == *'iPad5'* ]]; then
python3 -m pyimg4 im4p create -i work/kcache.patched2 -o work/kcache.im4p -f krnl --extra work/kpp.bin --lzss python3 -m pyimg4 im4p create -i work/kcache.patched2 -o work/kcache.im4p -f krnl --extra work/kpp.bin --lzss
elif [[ $1 == *"--tweaks"* ]]; then elif [ "$tweaks" = "1" ]; then
python3 -m pyimg4 im4p create -i work/kcache.patched2 -o work/kcache.im4p -f krnl --lzss python3 -m pyimg4 im4p create -i work/kcache.patched2 -o work/kcache.im4p -f krnl --lzss
fi fi
sleep 1 sleep 1
@@ -499,13 +601,13 @@ if [ ! -f blobs/"$deviceid"-"$version".shsh2 ]; then
sleep 1 sleep 1
_kill_if_running iproxy _kill_if_running iproxy
if [[ "$@" == *"--semi-tethered"* ]]; then if [ "$semi_tethered" = "1" ]; then
_wait normal _wait normal
sleep 5 sleep 5
echo "[*] Switching device into recovery mode..." echo "[*] Switching device into recovery mode..."
"$dir"/ideviceenterrecovery $(_info normal UniqueDeviceID) "$dir"/ideviceenterrecovery $(_info normal UniqueDeviceID)
elif [ ! "$1" = '--tweaks' ]; then elif [ -z "$tweaks" ]; then
_wait normal _wait normal
sleep 5 sleep 5
@@ -549,22 +651,22 @@ if [ ! -f boot-"$deviceid"/ibot.img4 ]; then
echo "[*] Patching and signing iBSS/iBoot" echo "[*] Patching and signing iBSS/iBoot"
"$dir"/iBoot64Patcher iBSS.dec iBSS.patched "$dir"/iBoot64Patcher iBSS.dec iBSS.patched
if [[ "$@" == *"--semi-tethered"* ]]; then if [ "$semi_tethered" = "1" ]; then
if [[ "$@" == *"--no-baseband"* ]]; then if [ "$no_baseband" = "1" ]; then
if [[ "$@" == *"--verbose"* ]]; then if [ "$verbose" = "1" ]; then
"$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b '-v keepsyms=1 debug=0x2014e rd=disk0s1s7' "$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b '-v keepsyms=1 debug=0x2014e rd=disk0s1s7'
else else
"$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b 'keepsyms=1 debug=0x2014e rd=disk0s1s7' "$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b 'keepsyms=1 debug=0x2014e rd=disk0s1s7'
fi fi
else else
if [[ "$@" == *"--verbose"* ]]; then if [ "$verbose" = "1" ]; then
"$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b '-v keepsyms=1 debug=0x2014e rd=disk0s1s8' "$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b '-v keepsyms=1 debug=0x2014e rd=disk0s1s8'
else else
"$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b 'keepsyms=1 debug=0x2014e rd=disk0s1s8' "$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b 'keepsyms=1 debug=0x2014e rd=disk0s1s8'
fi fi
fi fi
else else
if [[ "$@" == *"--verbose"* ]]; then if [ "$verbose" = "1" ]; then
"$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b '-v keepsyms=1 debug=0x2014e' "$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b '-v keepsyms=1 debug=0x2014e'
else else
"$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b 'keepsyms=1 debug=0x2014e' "$dir"/iBoot64Patcherfsboot ibot.dec ibot.patched -b 'keepsyms=1 debug=0x2014e'
@@ -611,7 +713,7 @@ else
fi fi
if [ "$os" = 'Darwin' ]; then if [ "$os" = 'Darwin' ]; then
if [ ! "$1" = '--dfu' ]; then if [ -z "$dfu" ]; then
defaults write -g ignore-devices -bool false defaults write -g ignore-devices -bool false
defaults write com.apple.AMPDevicesAgent dontAutomaticallySyncIPods -bool false defaults write com.apple.AMPDevicesAgent dontAutomaticallySyncIPods -bool false
killall Finder killall Finder