From bd7dba0a9286188ec1201efa0c1b7c89824f5cf1 Mon Sep 17 00:00:00 2001 From: Howard Wu Date: Thu, 8 Feb 2024 18:15:03 +0800 Subject: [PATCH] No hard-code kernel version --- scripts/build.sh | 94 ++++++++++++++++++++------------- scripts/generateKernelSULink.py | 26 +++++++-- scripts/generateWSALinks.py | 23 ++++---- scripts/getWSAMajorVersion.py | 40 -------------- 4 files changed, 87 insertions(+), 96 deletions(-) delete mode 100644 scripts/getWSAMajorVersion.py diff --git a/scripts/build.sh b/scripts/build.sh index 509177bd7e..6612bd2acb 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -348,36 +348,71 @@ update_gapps_file_name() { GAPPS_PATH=$DOWNLOAD_DIR/$GAPPS_FILE_NAME } WSA_MAJOR_VER=0 +getKernelVersion() { + local bintype kernel_string kernel_version + bintype="$(file -b "$1")" + if [[ $bintype == *"version"* ]]; then + readarray -td '' kernel_string < <(awk '{ gsub(/, /,"\0"); print; }' <<<"$bintype, ") + unset 'kernel_string[-1]' + for i in "${kernel_string[@]}"; do + if [[ $i == *"version"* ]]; then + IFS=" " read -r -a kernel_string <<<"$i" + kernel_version="${kernel_string[1]}" + fi + done + else + IFS=" " read -r -a kernel_string <<<"$(strings "$1" | grep 'Linux version')" + kernel_version="${kernel_string[2]}" + fi + IFS=" " read -r -a arr <<<"${kernel_version//-/ }" + printf '%s' "${arr[0]}" +} update_ksu_zip_name() { KERNEL_VER="" - case "$WSA_MAJOR_VER" in - "2305") KERNEL_VER="5.15.94.2" ;; - "2306") KERNEL_VER="5.15.104.1" ;; - "2307") KERNEL_VER="5.15.104.2" ;; - "2308") KERNEL_VER="5.15.104.3" ;; - "2309") KERNEL_VER="5.15.104.4" ;; - *) abort "KernelSU is not supported in this WSA version: $WSA_MAJOR_VER" ;; - esac + if [ -f "$WORK_DIR/wsa/$ARCH/Tools/kernel" ]; then + KERNEL_VER=$(getKernelVersion "$WORK_DIR/wsa/$ARCH/Tools/kernel") + fi KERNELSU_ZIP_NAME=kernelsu-$ARCH-$KERNEL_VER.zip KERNELSU_PATH=$DOWNLOAD_DIR/$KERNELSU_ZIP_NAME KERNELSU_INFO="$KERNELSU_PATH.info" } + if [ -z ${OFFLINE+x} ]; then + echo "Generating WSA Download Links" require_su if [ "$DOWN_WSA" != "no" ]; then - echo "Generate Download Links" python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort - # shellcheck disable=SC1090 - source "$WSA_WORK_ENV" || abort + echo "Downloading WSA" else - echo "Generate Download Links" python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$DOWN_WSA" || abort - WSA_MAJOR_VER=$(python3 getWSAMajorVersion.py "$ARCH" "$WSA_ZIP_PATH") + echo "Skip download WSA, downloading WSA depends" fi - if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then - ANDROID_API=32 + if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity=true --continue=true --allow-overwrite=true --conditional-get=true -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR/$DOWNLOAD_CONF_NAME"; then + echo "We have encountered an error while downloading files." + exit 1 fi - if [ "$ROOT_SOL" = "magisk" ]; then + rm -f "${DOWNLOAD_DIR:?}/$DOWNLOAD_CONF_NAME" +fi + +echo "Extract WSA" +if [ -f "$WSA_ZIP_PATH" ]; then + if ! python3 extractWSA.py "$ARCH" "$WSA_ZIP_PATH" "$WORK_DIR" "$WSA_WORK_ENV"; then + CLEAN_DOWNLOAD_WSA=1 + abort "Unzip WSA failed, is the download incomplete?" + fi + echo -e "Extract done\n" + # shellcheck disable=SC1090 + source "$WSA_WORK_ENV" || abort +else + echo "The WSA zip package does not exist, is the download incomplete?" + exit 1 +fi +if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then + ANDROID_API=32 +fi +if [ -z ${OFFLINE+x} ]; then + echo "Generating Download Links" + if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then if [ -z ${CUSTOM_MAGISK+x} ]; then python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort fi @@ -395,18 +430,14 @@ if [ -z ${OFFLINE+x} ]; then python3 generateGappsLink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_FILE_NAME" || abort fi - echo "Download Artifacts" + echo "Downloading Artifacts" if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity=true --continue=true --allow-overwrite=true --conditional-get=true -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR/$DOWNLOAD_CONF_NAME"; then echo "We have encountered an error while downloading files." exit 1 fi else # Offline mode - WSA_MAJOR_VER=$(python3 getWSAMajorVersion.py "$ARCH" "$WSA_ZIP_PATH") - if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then - ANDROID_API=32 - fi - declare -A FILES_CHECK_LIST=([WSA_ZIP_PATH]="$WSA_ZIP_PATH" [xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [UWPVCLibs_PATH]="$UWPVCLibs_PATH") - if [ "$ROOT_SOL" = "magisk" ]; then + declare -A FILES_CHECK_LIST=([xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [UWPVCLibs_PATH]="$UWPVCLibs_PATH") + if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH") fi if [ "$ROOT_SOL" = "kernelsu" ]; then @@ -430,20 +461,6 @@ else # Offline mode require_su fi -echo "Extract WSA" -if [ -f "$WSA_ZIP_PATH" ]; then - if ! python3 extractWSA.py "$ARCH" "$WSA_ZIP_PATH" "$WORK_DIR" "$WSA_WORK_ENV"; then - CLEAN_DOWNLOAD_WSA=1 - abort "Unzip WSA failed, is the download incomplete?" - fi - echo -e "Extract done\n" - # shellcheck disable=SC1090 - source "$WSA_WORK_ENV" || abort -else - echo "The WSA zip package does not exist, is the download incomplete?" - exit 1 -fi - if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then echo "Extract Magisk" if [ -f "$MAGISK_PATH" ]; then @@ -479,10 +496,11 @@ if [ "$ROOT_SOL" = "magisk" ]; then "$WORK_DIR/magisk/magiskboot" cpio "$WORK_DIR/wsa/$ARCH/Tools/initrd.img" "mv /init /wsainit" "add 0750 /lspinit ../bin/$ARCH/lspinit" "ln /lspinit /init" "add 0750 /magiskinit $WORK_DIR/magisk/magiskinit" "mkdir 0750 overlay.d" "mkdir 0750 overlay.d/sbin" "add 0644 overlay.d/sbin/magisk64.xz $WORK_DIR/magisk/magisk64.xz" "add 0644 overlay.d/sbin/magisk32.xz $WORK_DIR/magisk/magisk32.xz" "add 0644 overlay.d/sbin/stub.xz $WORK_DIR/magisk/stub.xz" "mkdir 000 .backup" "add 000 .backup/.magisk $WORK_DIR/magisk/config" || abort "Unable to patch initrd" echo -e "Integrate Magisk done\n" elif [ "$ROOT_SOL" = "kernelsu" ]; then - update_ksu_zip_name echo "Extract KernelSU" # shellcheck disable=SC1090 source "${KERNELSU_INFO:?}" || abort + echo "WSA Kernel Version: $KERNEL_VER" + echo "KernelSU Version: $KERNELSU_VER" if ! unzip "$KERNELSU_PATH" -d "$WORK_DIR/kernelsu"; then CLEAN_DOWNLOAD_KERNELSU=1 abort "Unzip KernelSU failed, package is corrupted?" diff --git a/scripts/generateKernelSULink.py b/scripts/generateKernelSULink.py index 3c36bd96bd..a287809cb5 100644 --- a/scripts/generateKernelSULink.py +++ b/scripts/generateKernelSULink.py @@ -27,6 +27,7 @@ import json import re from pathlib import Path +from packaging import version class Prop(OrderedDict): @@ -53,20 +54,34 @@ def __repr__(self): 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") +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"] +kernel_ver = 0 if res.status_code == 200: link = "" 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": + asset_name = asset["name"] + if re.match(f'kernel-WSA-{abi_map[arch]}-{kernelVersion}.*\.zip$', asset_name) and asset["content_type"] == "application/zip": + tmp_kernel_ver = re.search( + u'\d{1}.\d{1,}.\d{1,}.\d{1,}', asset_name.split("-")[3]).group() + if (kernel_ver == 0): + kernel_ver = tmp_kernel_ver + elif version.parse(kernel_ver) < version.parse(tmp_kernel_ver): + kernel_ver = tmp_kernel_ver + print(f"Kernel version: {kernel_ver}", flush=True) + for asset in assets: + if re.match(f'kernel-WSA-{abi_map[arch]}-{kernel_ver}.*\.zip$', asset["name"]) and asset["content_type"] == "application/zip": link = asset["browser_download_url"] break if link == "": - print(f"Error: No KernelSU release found for arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True) + print( + f"Error: No KernelSU release found for arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True) exit(1) release_name = json_data["name"] with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file: @@ -79,7 +94,8 @@ def __repr__(self): 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) + print( + f"The current rate limit window resets in {ratelimit_reset}", flush=True) exit(1) print(f"download link: {link}", flush=True) diff --git a/scripts/generateWSALinks.py b/scripts/generateWSALinks.py index 5286b5ebcf..7692f1e24c 100644 --- a/scripts/generateWSALinks.py +++ b/scripts/generateWSALinks.py @@ -20,7 +20,6 @@ import html import logging -import os import re import sys @@ -70,7 +69,8 @@ def __repr__(self): with open(ms_account_conf, "r") as f: conf = Prop(f.read()) user = conf.get('user_code') -print(f"Generating WSA download link: arch={arch} release_type={release_name}\n", flush=True) +print( + f"Generating WSA download link: arch={arch} release_type={release_name}\n", flush=True) with open(Path.cwd().parent / ("xml/GetCookie.xml"), "r") as f: cookie_content = f.read().format(user) @@ -146,8 +146,9 @@ def send_req(i, v, out_file_name): wsa_build_ver = 0 for filename, values in identities.items(): if re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename): - tmp_wsa_build_ver = re.search(u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group() - if(wsa_build_ver == 0): + tmp_wsa_build_ver = re.search( + u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group() + if (wsa_build_ver == 0): wsa_build_ver = tmp_wsa_build_ver elif version.parse(wsa_build_ver) < version.parse(tmp_wsa_build_ver): wsa_build_ver = tmp_wsa_build_ver @@ -162,25 +163,21 @@ def send_req(i, v, out_file_name): out_file_name = f"{values[1]}_{arch}.appx" out_file = download_dir / out_file_name elif not skip_wsa_download and re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename): - tmp_wsa_build_ver = re.search(u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group() - if(wsa_build_ver != tmp_wsa_build_ver): + tmp_wsa_build_ver = re.search( + u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group() + if (wsa_build_ver != tmp_wsa_build_ver): continue version_splitted = wsa_build_ver.split(".") major_ver = version_splitted[0] minor_ver = version_splitted[1] build_ver = version_splitted[2] revision_ver = version_splitted[3] - with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file: - env = Prop(environ_file.read()) - env.WSA_VER = wsa_build_ver - env.WSA_MAJOR_VER = major_ver - with open(os.environ['WSA_WORK_ENV'], 'w') as environ_file: - environ_file.write(str(env)) out_file_name = f"wsa-{release_type}.zip" out_file = download_dir / out_file_name else: continue - th = Thread(target=send_req, args=(values[0][0], values[0][1], out_file_name)) + th = Thread(target=send_req, args=( + values[0][0], values[0][1], out_file_name)) threads.append(th) th.daemon = True th.start() diff --git a/scripts/getWSAMajorVersion.py b/scripts/getWSAMajorVersion.py deleted file mode 100644 index f10ce26d6f..0000000000 --- a/scripts/getWSAMajorVersion.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/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 -# - -import sys - -import zipfile -from pathlib import Path - -arch = sys.argv[1] - -zip_name = "" -wsa_zip_path= Path(sys.argv[2]) - -with zipfile.ZipFile(wsa_zip_path) as zip: - for f in zip.filelist: - if arch in f.filename.lower(): - zip_name = f.filename - break -ver_no = zip_name.split("_") -long_ver = ver_no[1] -ver = long_ver.split(".") -major_ver = ver[0] -print(major_ver)