def get(self, apk_type: APK_Type, apk_arch: APK_Arch): if flask.request.url.split('/')[-1] == 'download': return stream_package(self.dbc, self.storage_obj, apk_type, apk_arch) else: data = get_apk_status(self.storage_obj) if apk_type is None and apk_arch is APK_Arch.noarch: return (get_apk_status(self.storage_obj), 200) else: try: return (data[apk_type][apk_arch], 200) except KeyError: return (data[apk_type], 200)
def apk_update_status(self): update_info = {} sql = "SELECT `usage`, `arch`, `version`, `download_status`, `last_checked`\n" \ "FROM `mad_apk_autosearch`" autosearch_data = self._db.autofetch_all(sql) apk_info: MAD_APKS = get_apk_status(self.storage_obj) package: APK_Type = None arch: APK_Arch = None for row in autosearch_data: arch = lookup_arch_enum(row['arch']) package = lookup_apk_enum(row['usage']) composite_key = '%s_%s' % (row['usage'], row['arch']) update_info[composite_key] = {} if row['download_status'] != 0: update_info[composite_key]['download_status'] = row[ 'download_status'] try: curr_info = apk_info[package][arch] except KeyError: curr_info = None if package == APK_Type.pogo: if not curr_info or is_newer_version(row['version'], curr_info.version): update_info[composite_key]['update'] = 1 else: if curr_info is None or curr_info.size is None or row[ 'version'] is None: update_info[composite_key]['update'] = 1 elif int(curr_info.size) != int(row['version']): update_info[composite_key]['update'] = 1 if not update_info[composite_key]: del update_info[composite_key] return Response(json.dumps(update_info), mimetype='application/json')
def status_check(self): all_data = get_apk_status(self.storage_elem) self.assertIsInstance(all_data, MAD_APKS) self.assertTrue(APK_Type.pogo in all_data) self.assertTrue(APK_Arch.armeabi_v7a in all_data[APK_Type.pogo]) self.assertTrue(APK_Arch.arm64_v8a in all_data[APK_Type.pogo]) self.assertFalse(APK_Arch.noarch in all_data[APK_Type.pogo]) self.assertTrue(APK_Type.rgc in all_data) self.assertFalse(APK_Arch.armeabi_v7a in all_data[APK_Type.rgc]) self.assertFalse(APK_Arch.arm64_v8a in all_data[APK_Type.rgc]) self.assertTrue(APK_Arch.noarch in all_data[APK_Type.rgc]) self.assertTrue(APK_Type.pd in all_data) self.assertFalse(APK_Arch.armeabi_v7a in all_data[APK_Type.pd]) self.assertFalse(APK_Arch.arm64_v8a in all_data[APK_Type.pd]) self.assertTrue(APK_Arch.noarch in all_data[APK_Type.pd])
def __init__(self, db, data_manager, args, storage_obj): self.warnings: List[AutoConfIssues] = [] self.critical: List[AutoConfIssues] = [] any_login = get_available_login(db) if not any_login and not args.autoconfig_no_auth: self.warnings.append(AutoConfIssues.no_login) if not validate_hopper_ready(data_manager): self.critical.append(AutoConfIssues.origin_hopper_not_ready) if not data_manager.get_root_resource('auth'): self.warnings.append(AutoConfIssues.auth_not_configured) if not PDConfig(db, args, data_manager).configured: self.critical.append(AutoConfIssues.pd_not_configured) if not RGCConfig(db, args, data_manager).configured: self.critical.append(AutoConfIssues.rgc_not_configured) missing_packages = [] for _, apkpackages in get_apk_status(storage_obj).items(): for _, package in apkpackages.items(): if package.version is None: missing_packages.append(package) if missing_packages: self.critical.append(AutoConfIssues.package_missing)
def __init__(self, db, data_manager, args, storage_obj): self.warnings: List[AutoConfIssues] = [] self.critical: List[AutoConfIssues] = [] sql = "SELECT count(*)\n" \ "FROM `settings_pogoauth` ag\n" \ "WHERE ag.`instance_id` = %s AND ag.`device_id` IS NULL" if db.autofetch_value(sql, (db.instance_id)) == 0 and not args.autoconfig_no_auth: self.warnings.append(AutoConfIssues.no_ggl_login) if not validate_hopper_ready(data_manager): self.critical.append(AutoConfIssues.origin_hopper_not_ready) if not data_manager.get_root_resource('auth'): self.warnings.append(AutoConfIssues.auth_not_configured) if not PDConfig(db, args, data_manager).configured: self.critical.append(AutoConfIssues.pd_not_configured) if not RGCConfig(db, args, data_manager).configured: self.critical.append(AutoConfIssues.rgc_not_configured) missing_packages = [] for _, apkpackages in get_apk_status(storage_obj).items(): for _, package in apkpackages.items(): if package.version is None: missing_packages.append(package) if missing_packages: self.critical.append(AutoConfIssues.package_missing)
def post(self, apk_type: APK_Type, apk_arch: APK_Arch): is_upload: bool = False apk: io.BytesIO = None filename: str = None if 'multipart/form-data' in self.api_req.content_type: filename = self.api_req.data['data'].get('filename', None) try: apk = io.BytesIO(self.api_req.data['files'].get('file').read()) except AttributeError: return ('No file present', 406) is_upload = True if self.api_req.content_type == 'application/octet-stream': filename = self.api_req.headers.get('filename', None) apk = io.BytesIO(self.api_req.data) is_upload = True if is_upload: if filename is None: return ('filename must be specified', 406) elems: MAD_APKS = get_apk_status(self.storage_obj) try: elems[apk_type][apk_arch] except KeyError: return ('Non-supported Type / Architecture', 406) filename_split = filename.rsplit('.', 1) if filename_split[1] in ['zip', 'apks']: mimetype = 'application/zip' elif filename_split[1] == 'apk': mimetype = 'application/vnd.android.package-archive' else: return ('Unsupported extension', 406) try: PackageImporter(apk_type, apk_arch, self.storage_obj, apk, mimetype) if 'multipart/form-data' in self.api_req.content_type: return flask.redirect(None, code=201) return (None, 201) except (BadZipFile, LargeZipFile) as err: return (str(err), 406) except WizardError as err: self._logger.warning(str(err)) return (str(err), 406) except Exception: self._logger.opt( exception=True).critical("An unhanded exception occurred!") return (None, 500) else: try: call = self.api_req.data['call'] wizard = APKWizard(self.dbc, self.storage_obj) if call == 'import': thread_args = (apk_type, apk_arch) t = Thread(target=wizard.apk_download, args=thread_args) t.start() return (None, 204) elif call == 'search': wizard.apk_search(apk_type, apk_arch) return (None, 204) elif call == 'search_download': try: wizard.apk_all_actions() return (None, 204) except TypeError: return (None, 404) else: return (call, 501) except KeyError: import traceback traceback.print_exc() return (call, 501) return (None, 500)
def mad_apks(self): return render_template('madmin_apk_root.html', apks=get_apk_status(self.storage_obj))
def mad_apks(self): return render_template('madmin_apk_root.html', apks=get_apk_status(self.storage_obj), has_token=self._args.maddev_api_token not in [None, ""])