From d72bf018d12ef3255a44fd5e17eaa34666d754af Mon Sep 17 00:00:00 2001 From: Rikka <1103670381@qq.com> Date: Mon, 13 Feb 2023 18:36:40 +0800 Subject: [PATCH] Execute commands on waydroid shell with pipes --- main.py | 4 +-- stuffs/android_id.py | 24 ++++++++-------- tools/helper.py | 66 ++++++++++++++++++++++++++++++++++++++------ 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/main.py b/main.py index f324967..f34788c 100755 --- a/main.py +++ b/main.py @@ -2,7 +2,7 @@ import argparse from logging import Logger -from stuffs.android_id import Android_id +from stuffs.android_id import AndroidId from stuffs.gapps import Gapps from stuffs.hidestatusbar import HideStatusBar from stuffs.houdini import Houdini @@ -76,7 +76,7 @@ def main(): google_id_parser=subparsers.add_parser('google', help='grab device id for unblocking Google Apps') - google_id_parser.set_defaults(func=Android_id().get_id) + google_id_parser.set_defaults(func=AndroidId().get_id) # create the parser for the "a" command arg_template = { diff --git a/stuffs/android_id.py b/stuffs/android_id.py index ad92a62..75acbb1 100644 --- a/stuffs/android_id.py +++ b/stuffs/android_id.py @@ -1,23 +1,21 @@ -import os -import sys from tools import container -from tools.helper import run +from tools.helper import shell from tools.logger import Logger -class Android_id: +class AndroidId: def get_id(self): - if container.is_running(): - queryout = run([ - 'waydroid','shell', - 'sqlite3', - '/data/data/com.google.android.gsf/databases/gservices.db', - "select * from main where name = \"android_id\";" - ]) + try: + queryout = shell( + arg="sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"select * from main where name = 'android_id';\"", + env="ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n" + ) + except: + return else: - Logger.error("Cannot access gservices.db, make sure gapps is installed and waydroid was started at least once after installation and make sure waydroid is running !") + Logger.error("WayDroid isn't running !") return - print(queryout.stdout.decode().replace("android_id|", "").strip()) + print(queryout.replace("android_id|", "").strip()) print(" ^----- Open https://google.com/android/uncertified/?pli=1") print(" Login with your google id then submit the form with id shown above") diff --git a/tools/helper.py b/tools/helper.py index 81ae7f9..23b86fd 100644 --- a/tools/helper.py +++ b/tools/helper.py @@ -8,13 +8,19 @@ import requests from tools.logger import Logger from tqdm import tqdm import hashlib +from typing import Optional + def get_download_dir(): download_loc = "" if os.environ.get("XDG_CACHE_HOME", None) is None: - download_loc = os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".cache", "waydroid-script", "downloads") + download_loc = os.path.join('/', "home", os.environ.get( + "SUDO_USER", os.environ["USER"]), ".cache", "waydroid-script", "downloads" + ) else: - download_loc = os.path.join(os.environ["XDG_CACHE_HOME"], "waydroid-script", "downloads") + download_loc = os.path.join( + os.environ["XDG_CACHE_HOME"], "waydroid-script", "downloads" + ) if not os.path.exists(download_loc): os.makedirs(download_loc) return download_loc @@ -23,21 +29,65 @@ def get_download_dir(): def get_data_dir(): return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", "data") -def run(args, env=None, ignore=""): - result = subprocess.run(args=args, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +# execute on host +def run(args: list, env: Optional[str] = None, ignore: Optional[str] = None): + result = subprocess.run( + args=args, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + # print(result.stdout.decode()) if result.stderr: error = result.stderr.decode("utf-8") - if re.match(ignore, error): + if ignore and re.match(ignore, error): return result Logger.error(error) raise subprocess.CalledProcessError( - returncode = result.returncode, - cmd = result.args, - stderr = result.stderr + returncode=result.returncode, + cmd=result.args, + stderr=result.stderr ) return result +# execute on waydroid shell +def shell(arg: str, env: Optional[str] = None): + a = subprocess.Popen( + args=["sudo", "waydroid", "shell"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + subprocess.Popen( + args=["echo", "export BOOTCLASSPATH=/apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/core-icu4j.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/framework-atb-backward-compatibility.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.media/javalib/updatable-media.jar:/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:/apex/com.android.os.statsd/javalib/framework-statsd.jar:/apex/com.android.permission/javalib/framework-permission.jar:/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:/apex/com.android.wifi/javalib/framework-wifi.jar:/apex/com.android.tethering/javalib/framework-tethering.jar"], + stdout=a.stdin, + stdin=subprocess.PIPE + ).communicate() + + if env: + subprocess.Popen( + args=["echo", env], + stdout=a.stdin, + stdin=subprocess.PIPE + ).communicate() + + subprocess.Popen( + args=["echo", arg], + stdout=a.stdin, + stdin=subprocess.PIPE + ).communicate() + + a.stdin.close() + if a.stderr.read(): + Logger.error(a.stderr.read().decode('utf-8')) + raise subprocess.CalledProcessError( + returncode=a.returncode, + cmd=a.args, + stderr=a.stderr + ) + return a.stdout.read().decode("utf-8") + def download_file(url, f_name): md5 = "" response = requests.get(url, stream=True)