Beispiel #1
0
 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)
Beispiel #2
0
 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')
Beispiel #3
0
 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])
Beispiel #4
0
 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)
Beispiel #5
0
 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)
Beispiel #6
0
    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)
Beispiel #7
0
 def mad_apks(self):
     return render_template('madmin_apk_root.html',
                            apks=get_apk_status(self.storage_obj))
Beispiel #8
0
 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, ""])