import os import re from deploy.Windows.logger import logger def patch_trust_env(file): """ People use proxies, but they never realize that proxy software leaves a global proxy pointing to itself even when the software is not running. In most situations we set `session.trust_env = False` in requests, but this does not effect the `pip` command. To handle untrusted user environment for good. We patch the code file in requests directly. Of course, the patch only effect the python env inside Alas. Returns: bool: If patched. """ try: with open(file, 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: logger.info(f'{file} trust_env not exist') return if re.search('self.trust_env = True', content): content = re.sub('self.trust_env = True', 'self.trust_env = False', content) with open(file, 'w', encoding='utf-8') as f: f.write(content) logger.info(f'{file} trust_env patched') elif re.search('self.trust_env = False', content): logger.info(f'{file} trust_env already patched') else: logger.info(f'{file} trust_env is not in the file') def check_running_directory(): """ An fool-proof mechanism. Show error if user is running Easy Install in compressing software, since Alas can't install in temp directories. """ file = __file__.replace(r"\\", "/").replace("\\", "/") # C:/Users//AppData/Local/Temp/360zip$temp/360$3/AzurLaneAutoScript if 'Temp/360zip' in file: logger.critical('请先解压Alas的压缩包,再安装Alas') exit(1) # C:/Users//AppData/Local/Temp/Rar$EXa9248.23428/AzurLaneAutoScript if 'Temp/Rar' in file or 'Local/Temp' in file: logger.critical('Please unzip ALAS installer first') exit(1) def patch_uiautomator2(): """ uiautomator2 download assets from https://tool.appetizer.io first then fallback to https://github.com/openatx. https://tool.appetizer.io is added to bypass the wall in China but https://tool.appetizer.io is slow outside of CN plus some CN users cannot access it for unknown reason. So we patch `uiautomator2/init.py` to a local assets cache `uiautomator2cache/cache`. appdir = os.path.join(os.path.expanduser('~'), '.uiautomator2') to: appdir = os.path.join(__file__, '../../uiautomator2cache') And we also remove minicap installations since emulators doesn't need it. for url in self.minicap_urls: self.push_url(url) to: for url in []: self.push_url(url) """ init_file = './toolkit/Lib/site-packages/uiautomator2/init.py' cache_dir = './toolkit/Lib/site-packages/uiautomator2cache/cache' appdir = "os.path.join(__file__, '../../uiautomator2cache')" modified = False try: with open(init_file, 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: logger.info(f'{init_file} not exist') return # Patch minicap_urls res = re.search(r'self.minicap_urls', content) if res: content = re.sub(r'self.minicap_urls', '[]', content) modified = True logger.info(f'{init_file} minicap_urls patched') else: logger.info(f'{init_file} minicap_urls no need to patch') # Patch appdir if os.path.exists(cache_dir): res = re.search(r'appdir ?=(.*)\n', content) if res: prev = res.group(1).strip() if prev == appdir: logger.info(f'{init_file} appdir already patched') else: content = re.sub(r'appdir ?=.*\n', f'appdir = {appdir}\n', content) modified = True logger.info(f'{init_file} appdir patched') else: logger.info(f'{init_file} appdir not found') else: logger.info('uiautomator2cache is not installed skip patching') # Save file if modified: with open(init_file, 'w', encoding='utf-8') as f: f.write(content) logger.info(f'{init_file} content saved') def patch_apkutils2(): """ `adbutils/mixin.py` `ShellMixin.install` imports `apkutils2`, but `apkutils2` does not provide wheel files, it may failed to install for unknown reasons. Since we never used that method, we just remove the import. """ mixin = './toolkit/Lib/site-packages/adbutils/mixin.py' try: with open(mixin, 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: logger.info(f'{mixin} not exist') return res = re.search(r'import apkutils2', content) if res: content = re.sub(r'import apkutils2', '', content) with open(mixin, 'w', encoding='utf-8') as f: f.write(content) logger.info(f'{mixin} apkutils2 patched') else: logger.info(f'{mixin} apkutils2 no need to patch') def pre_checks(): check_running_directory() # patch_trust_env patch_trust_env('./toolkit/Lib/site-packages/requests/sessions.py') patch_trust_env('./toolkit/Lib/site-packages/pip/_vendor/requests/sessions.py') patch_uiautomator2() patch_apkutils2() if __name__ == '__main__': pre_checks()