diff --git a/scripts/build.sh b/scripts/build.sh index c6b1c83..21830bd 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -80,6 +80,10 @@ clean_download() { if [ "$CLEAN_DOWNLOAD_GAPPS" ]; then rm -f "${GAPPS_PATH:?}" fi + if [ "$CLEAN_DOWNLOAD_KERNELSU" ]; then + rm -f "${KERNELSU_PATH:?}" + rm -f "${KERNELSU_INFO:?}" + fi fi } abort() { @@ -152,6 +156,7 @@ GAPPS_VARIANT_MAP=( ROOT_SOL_MAP=( "magisk" + "kernelsu" "none" ) @@ -342,7 +347,11 @@ vclibs_PATH=$DOWNLOAD_DIR/Microsoft.VCLibs."$ARCH".14.00.Desktop.appx xaml_PATH=$DOWNLOAD_DIR/Microsoft.UI.Xaml_"$ARCH".appx MAGISK_ZIP=magisk-$MAGISK_VER.zip MAGISK_PATH=$DOWNLOAD_DIR/$MAGISK_ZIP -if [ "$CUSTOM_MAGISK" ]; then +KERNEL_VER="5.10.117.2" # TODO: Get from kernel +KERNELSU_ZIP_NAME=kernelsu-$ARCH-$KERNEL_VER.zip +KERNELSU_PATH=$DOWNLOAD_DIR/$KERNELSU_ZIP_NAME +KERNELSU_INFO="$KERNELSU_PATH".info +if [ "$CUSTOM_MAGISK" ] && [ "$ROOT_SOL" = "magisk" ]; then if [ ! -f "$MAGISK_PATH" ]; then echo "Custom Magisk $MAGISK_ZIP not found" MAGISK_ZIP=app-$MAGISK_VER.apk @@ -379,8 +388,17 @@ if [ -z "${OFFLINE+x}" ]; then ANDROID_API=32 update_gapps_zip_name fi - if [ -z "${CUSTOM_MAGISK+x}" ]; then - python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort + if [ "$ROOT_SOL" = "magisk" ] || [ "$GAPPS_BRAND" != "none" ]; then + if [ -z "${CUSTOM_MAGISK+x}" ]; then + python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort + fi + fi + if [ "$ROOT_SOL" = "kernelsu" ]; then + python3 generateKernelSULink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$KERNEL_VER" "$KERNELSU_ZIP_NAME" || abort + # shellcheck disable=SC1091 + source "${WORK_DIR:?}/ENV" || abort + # shellcheck disable=SC2153 + echo "KERNELSU_VER=$KERNELSU_VER" > "$KERNELSU_INFO" fi if [ "$GAPPS_BRAND" != "none" ]; then python3 generateGappsLink.py "$ARCH" "$GAPPS_BRAND" "$GAPPS_VARIANT" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_ZIP_NAME" || abort @@ -397,19 +415,22 @@ else # Offline mode ANDROID_API=32 update_gapps_zip_name fi - declare -A FILES_CHECK_LIST=([WSA_ZIP_PATH]="$WSA_ZIP_PATH" [xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [MAGISK_PATH]="$MAGISK_PATH") + declare -A FILES_CHECK_LIST=([WSA_ZIP_PATH]="$WSA_ZIP_PATH" [xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH") + if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then + FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH") + fi + if [ "$ROOT_SOL" = "kernelsu" ]; then + FILES_CHECK_LIST+=(["KERNELSU_PATH"]="$KERNELSU_PATH") + fi + if [ "$GAPPS_BRAND" != 'none' ]; then + FILES_CHECK_LIST+=(["GAPPS_PATH"]="$GAPPS_PATH") + fi for i in "${FILES_CHECK_LIST[@]}"; do if [ ! -f "$i" ]; then echo "Offline mode: missing [$i]." OFFLINE_ERR="1" fi done - if [ "$GAPPS_BRAND" != 'none' ]; then - if [ ! -f "$GAPPS_PATH" ]; then - echo "Offline mode: missing [$GAPPS_PATH]." - OFFLINE_ERR="1" - fi - fi if [ "$OFFLINE_ERR" ]; then echo "Offline mode: Some files are missing, please disable offline mode." exit 1 @@ -432,32 +453,51 @@ else exit 1 fi -echo "Extract Magisk" -if [ -f "$MAGISK_PATH" ]; then - MAGISK_VERSION_NAME="" - MAGISK_VERSION_CODE=0 - if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then - echo "Unzip Magisk failed, is the download incomplete?" - CLEAN_DOWNLOAD_MAGISK=1 - abort +if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then + echo "Extract Magisk" + if [ -f "$MAGISK_PATH" ]; then + MAGISK_VERSION_NAME="" + MAGISK_VERSION_CODE=0 + if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then + echo "Unzip Magisk failed, is the download incomplete?" + CLEAN_DOWNLOAD_MAGISK=1 + abort + fi + # shellcheck disable=SC1091 + source "${WORK_DIR:?}/ENV" || abort + if [ "$MAGISK_VERSION_CODE" -lt 24000 ]; then + echo "Please install Magisk v24+" + abort + fi + "$SUDO" chmod +x "../linker/$HOST_ARCH/linker64" || abort + "$SUDO" patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort + chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort + elif [ -z "${CUSTOM_MAGISK+x}" ]; then + echo "The Magisk zip package does not exist, is the download incomplete?" + exit 1 + else + echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder." + exit 1 fi - # shellcheck disable=SC1091 - source "${WORK_DIR:?}/ENV" || abort - if [ "$MAGISK_VERSION_CODE" -lt 24000 ]; then - echo "Please install Magisk v24+" - abort - fi - "$SUDO" chmod +x "../linker/$HOST_ARCH/linker64" || abort - "$SUDO" patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort - chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort -elif [ -z "${CUSTOM_MAGISK+x}" ]; then - echo "The Magisk zip package does not exist, is the download incomplete?" - exit 1 -else - echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder." - exit 1 + echo -e "done\n" +fi + +if [ "$ROOT_SOL" = "kernelsu" ]; then + echo "Extract KernelSU" + # shellcheck disable=SC1090 + source "${KERNELSU_INFO:?}" || abort + if ! unzip "$KERNELSU_PATH" -d "$WORK_DIR"/kernelsu; then + echo "Unzip KernelSU failed, package is corrupted?" + CLEAN_DOWNLOAD_KERNELSU=1 + abort + fi + if [ "$ARCH" = "x64" ]; then + mv "$WORK_DIR"/kernelsu/bzImage "$WORK_DIR"/kernelsu/kernel + elif [ "$ARCH" = "arm64" ]; then + mv "$WORK_DIR"/kernelsu/Image "$WORK_DIR"/kernelsu/kernel + fi + echo -e "done\n" fi -echo -e "done\n" if [ "$GAPPS_BRAND" != 'none' ]; then echo "Extract $GAPPS_BRAND" @@ -513,7 +553,7 @@ fi if [ -d "$WORK_DIR"/magisk ]; then SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/magisk/magisk | cut -f1) )) fi -if [ -f "$MAGISK_PATH" ]; then +if [ "$ROOT_SOL" = "magisk" ] && [ -f "$MAGISK_PATH" ]; then SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$MAGISK_PATH" | cut -f1) )) fi if [ -d "../$ARCH/system" ]; then @@ -546,7 +586,7 @@ $SUDO sed -i -e '/cts/a \ \ \ \ $SUDO setfattr -n security.selinux -v "u:object_r:vendor_configs_file:s0" "$MOUNT_DIR"/vendor/etc/permissions/windows.permissions.xml || abort echo -e "done\n" -if [ "$ROOT_SOL" = 'magisk' ] || [ "$ROOT_SOL" = '' ]; then +if [ "$ROOT_SOL" = 'magisk' ]; then echo "Integrate Magisk" "$SUDO" mkdir "$MOUNT_DIR"/sbin "$SUDO" setfattr -n security.selinux -v "u:object_r:rootfs:s0" "$MOUNT_DIR"/sbin || abort @@ -639,6 +679,11 @@ on property:init.svc.zygote=stopped EOF echo -e "Integrate Magisk done\n" +elif [ "$ROOT_SOL" = "kernelsu" ]; then + echo "Integrate KernelSU" + mv "$WORK_DIR/wsa/$ARCH/Tools/kernel" "$WORK_DIR/wsa/$ARCH/Tools/kernel_origin" + cp "$WORK_DIR"/kernelsu/kernel "$WORK_DIR/wsa/$ARCH/Tools/kernel" + echo -e "Integrate KernelSU done\n" fi cp "$WORK_DIR/wsa/$ARCH/resources.pri" "$WORK_DIR"/wsa/pri/en-us.pri \ @@ -769,10 +814,10 @@ echo "Generate info" if [[ "$ROOT_SOL" = "none" ]]; then name1="" -elif [ "$ROOT_SOL" = "" ] || [ "$ROOT_SOL" = "magisk" ]; then +elif [ "$ROOT_SOL" = "magisk" ]; then name1="-with-magisk-$MAGISK_VERSION_NAME($MAGISK_VERSION_CODE)-$MAGISK_VER" -else - name1="-with-$ROOT_SOL-$MAGISK_VER" +elif [ "$ROOT_SOL" = "kernelsu" ]; then + name1="-with-$ROOT_SOL-$KERNELSU_VER" fi if [ "$GAPPS_BRAND" = "none" ]; then name2="-NoGApps" diff --git a/scripts/generateGappsLink.py b/scripts/generateGappsLink.py index 47217c0..95fa592 100644 --- a/scripts/generateGappsLink.py +++ b/scripts/generateGappsLink.py @@ -68,7 +68,7 @@ elif brand == "MindTheGapps": if res.status_code == 200: assets = json_data["assets"] for asset in assets: - if re.match(f'.*{release}.*{abi_map[arch]}.*\.zip$', asset["name"]) and asset["content_type"] == "application/x-zip-compressed": + if re.match(f'.*{release}.*{abi_map[arch]}.*\.zip$', asset["name"]) and asset["content_type"] == "application/zip": link = asset["browser_download_url"] break elif res.status_code == 403 and x_ratelimit_remaining == '0': diff --git a/scripts/generateKernelSULink.py b/scripts/generateKernelSULink.py new file mode 100644 index 0000000..41c89bc --- /dev/null +++ b/scripts/generateKernelSULink.py @@ -0,0 +1,64 @@ +#!/usr/bin/python3 +# +# This file is part of MagiskOnWSALocal. +# +# MagiskOnWSALocal is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# MagiskOnWSALocal is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with MagiskOnWSALocal. If not, see . +# +# Copyright (C) 2023 LSPosed Contributors +# + +from datetime import datetime +import sys +import os + +import requests +import json +import re +from pathlib import Path + +arch = sys.argv[1] +download_dir = Path.cwd().parent / \ + "download" if sys.argv[2] == "" else Path(sys.argv[2]).resolve() +tempScript = sys.argv[3] +kernelVersion = sys.argv[4] +file_name = sys.argv[5] +abi_map = {"x64": "x86_64", "arm64": "arm64"} +print(f"Generating KernelSU download link: arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True) +res = requests.get(f"https://api.github.com/repos/tiann/KernelSU/releases/latest") +json_data = json.loads(res.content) +headers = res.headers +x_ratelimit_remaining = headers["x-ratelimit-remaining"] +if res.status_code == 200: + assets = json_data["assets"] + for asset in assets: + if re.match(f'kernel-WSA-{abi_map[arch]}-{kernelVersion}.*\.zip$', asset["name"]) and asset["content_type"] == "application/zip": + link = asset["browser_download_url"] + break + release_name = json_data["name"] + with open(os.environ['WSA_WORK_ENV'], 'a') as environ_file: + environ_file.write(f'KERNELSU_VER={release_name}\n') +elif res.status_code == 403 and x_ratelimit_remaining == '0': + message = json_data["message"] + print(f"Github API Error: {message}", flush=True) + ratelimit_reset = headers["x-ratelimit-reset"] + ratelimit_reset = datetime.fromtimestamp(int(ratelimit_reset)) + print(f"The current rate limit window resets in {ratelimit_reset}", flush=True) + exit(1) + +print(f"download link: {link}", flush=True) + +with open(download_dir/tempScript, 'a') as f: + f.writelines(f'{link}\n') + f.writelines(f' dir={download_dir}\n') + f.writelines(f' out={file_name}\n') diff --git a/scripts/getWSAMainVersion.py b/scripts/getWSAMainVersion.py index 68f3768..1186ecf 100644 --- a/scripts/getWSAMainVersion.py +++ b/scripts/getWSAMainVersion.py @@ -32,8 +32,9 @@ with zipfile.ZipFile(wsa_zip_path) as zip: for f in zip.filelist: if arch in f.filename.lower(): zip_name = f.filename - ver_no = zip_name.split("_") - long_ver = ver_no[1] - ver = long_ver.split(".") - main_ver = ver[0] - print(main_ver) + break +ver_no = zip_name.split("_") +long_ver = ver_no[1] +ver = long_ver.split(".") +main_ver = ver[0] +print(main_ver) diff --git a/scripts/run.sh b/scripts/run.sh index 0b55dcc..2f5700a 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -122,8 +122,9 @@ ROOT_SOL=$( Radiolist '([title]="Root solution" [default]="magisk")' \ \ - 'magisk' "" 'on' \ - 'none' "" 'off' + 'magisk' "Magisk" 'on' \ + 'kernelsu' "KernelSU" 'on' \ + 'none' "Without root" 'off' ) if (YesNoBox '([title]="Compress output" [text]="Do you want to compress the output?")'); then