Execute commands on waydroid shell with pipes
This commit is contained in:
parent
0feb86ceef
commit
d72bf018d1
3 changed files with 71 additions and 23 deletions
4
main.py
4
main.py
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
from logging import Logger
|
from logging import Logger
|
||||||
from stuffs.android_id import Android_id
|
from stuffs.android_id import AndroidId
|
||||||
from stuffs.gapps import Gapps
|
from stuffs.gapps import Gapps
|
||||||
from stuffs.hidestatusbar import HideStatusBar
|
from stuffs.hidestatusbar import HideStatusBar
|
||||||
from stuffs.houdini import Houdini
|
from stuffs.houdini import Houdini
|
||||||
|
|
@ -76,7 +76,7 @@ def main():
|
||||||
|
|
||||||
google_id_parser=subparsers.add_parser('google',
|
google_id_parser=subparsers.add_parser('google',
|
||||||
help='grab device id for unblocking Google Apps')
|
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
|
# create the parser for the "a" command
|
||||||
|
|
||||||
arg_template = {
|
arg_template = {
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,21 @@
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
from tools import container
|
from tools import container
|
||||||
from tools.helper import run
|
from tools.helper import shell
|
||||||
from tools.logger import Logger
|
from tools.logger import Logger
|
||||||
|
|
||||||
|
|
||||||
class Android_id:
|
class AndroidId:
|
||||||
def get_id(self):
|
def get_id(self):
|
||||||
|
|
||||||
if container.is_running():
|
if container.is_running():
|
||||||
queryout = run([
|
try:
|
||||||
'waydroid','shell',
|
queryout = shell(
|
||||||
'sqlite3',
|
arg="sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"select * from main where name = 'android_id';\"",
|
||||||
'/data/data/com.google.android.gsf/databases/gservices.db',
|
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"
|
||||||
"select * from main where name = \"android_id\";"
|
)
|
||||||
])
|
except:
|
||||||
|
return
|
||||||
else:
|
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
|
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(" ^----- Open https://google.com/android/uncertified/?pli=1")
|
||||||
print(" Login with your google id then submit the form with id shown above")
|
print(" Login with your google id then submit the form with id shown above")
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,19 @@ import requests
|
||||||
from tools.logger import Logger
|
from tools.logger import Logger
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
import hashlib
|
import hashlib
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
def get_download_dir():
|
def get_download_dir():
|
||||||
download_loc = ""
|
download_loc = ""
|
||||||
if os.environ.get("XDG_CACHE_HOME", None) is None:
|
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:
|
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):
|
if not os.path.exists(download_loc):
|
||||||
os.makedirs(download_loc)
|
os.makedirs(download_loc)
|
||||||
return download_loc
|
return download_loc
|
||||||
|
|
@ -23,21 +29,65 @@ def get_download_dir():
|
||||||
def get_data_dir():
|
def get_data_dir():
|
||||||
return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", "data")
|
return os.path.join('/', "home", os.environ.get("SUDO_USER", os.environ["USER"]), ".local", "share", "waydroid", "data")
|
||||||
|
|
||||||
def run(args, env=None, ignore=""):
|
# execute on host
|
||||||
result = subprocess.run(args=args, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
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())
|
# print(result.stdout.decode())
|
||||||
if result.stderr:
|
if result.stderr:
|
||||||
error = result.stderr.decode("utf-8")
|
error = result.stderr.decode("utf-8")
|
||||||
if re.match(ignore, error):
|
if ignore and re.match(ignore, error):
|
||||||
return result
|
return result
|
||||||
Logger.error(error)
|
Logger.error(error)
|
||||||
raise subprocess.CalledProcessError(
|
raise subprocess.CalledProcessError(
|
||||||
returncode = result.returncode,
|
returncode=result.returncode,
|
||||||
cmd = result.args,
|
cmd=result.args,
|
||||||
stderr = result.stderr
|
stderr=result.stderr
|
||||||
)
|
)
|
||||||
return result
|
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):
|
def download_file(url, f_name):
|
||||||
md5 = ""
|
md5 = ""
|
||||||
response = requests.get(url, stream=True)
|
response = requests.get(url, stream=True)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue