Exemple #1
0
    def put(self, group_id=None, data_id=None):
        if not group_id or not data_id:
            return abort(400, '请设置参数 group_id & data_id')
        _group = context.application.data_manager.groups.get(group_id)
        if not _group:
            return context.make_fail_response('Group not found')
        _data = _group.all_data.get(data_id)
        if not _data:
            return context.make_fail_response('Data not found')

        _data.name = request.json.get('name')
        _data.rule = request.json.get('rule')
        req = request.json.get('request')
        if req:
            _data.request.content = req['content']
            _data.request.filetype = req['filetype']
        req_data = request.json.get('request_data')
        if req_data:
            _data.request_data.content = req_data['content']
            _data.request_data.filetype = req_data['filetype']
        resp = request.json.get('response')
        if resp:
            _data.response.content = resp['content']
            _data.response.filetype = resp['filetype']
        resp_data = request.json.get('response_data')
        if resp_data:
            _data.response_data.content = resp_data['content']
            _data.response_data.filetype = resp_data['filetype']
        _data.save()
        return context.make_ok_response()
Exemple #2
0
def execute_command():
    if request.method == 'POST':
        _command = request.json.get('command')
        if not _command:
            return make_fail_response('Empty command!')

        _device_id = request.json.get('device_id', '')
        device = device_service.devices.get(_device_id)
        if not device:
            return make_fail_response('Device not found!')

        res = device.adb_command_executor(_command)
        output = res.stdout.decode()
        err_str = res.stderr.decode()

        publish_channel = 'android.command'
        publish_message = {
            'command': res.args,
            'returncode': res.returncode,
            'result': err_str if err_str else output
        }
        publish(publish_channel, publish_message)

        if err_str:
            return make_fail_response(err_str)
        else:
            return make_ok_response(data=output)
Exemple #3
0
def device_controller(device_id, action):
    controller_actions = {'install': _install_package}

    if request.method == 'PUT':
        device = device_service.devices.get(device_id)
        if not device:
            return make_fail_response(f'Device {device_id} not found!')
        if not controller_actions.get(action):
            return make_fail_response(f'Unknown device action: {action}')

        action_func = controller_actions.get(action)
        res = action_func(device, request)

        publish_channel = 'android.' + action
        publish_message = {
            'command':
            res.args,
            'returncode':
            res.returncode,
            'result':
            res.stderr.decode()
            if res.stderr.decode() else res.stdout.decode()
        }
        publish(publish_channel, publish_message)

        if res.returncode != 0:
            return make_fail_response(res.stderr.decode())
        else:
            return make_ok_response()
    def check_base(self, obj):
        try:
            # 检查base schema
            check_schema(obj)
            # 检查url是否有重复项存在
            redundant_items = check_url_redundant(obj)
            if redundant_items:
                redundant_items_str = '\n'.join(redundant_items)
                logger.error(
                    f'API-Coverage import API file error: Duplicated API\n'
                    f'{len(redundant_items)} duplicated API:\n'
                    f'{redundant_items_str}\n')
                resp = context.make_fail_response('导入API有重复项' +
                                                  str(redundant_items))
                lyrebird.publish('api_coverage', 'error', name='import_base')
                return resp
            # 获取base内容,解析出base的business等字段
            filename = obj.get('business') + obj.get(
                'version_name') + '.' + str(obj.get('version_code'))
            app_context.filename = filename
            app_context.business = obj.get('business')
            app_context.version_name = obj.get('version_name')
            app_context.version_code = obj.get('version_code')
            return
        except Exception as e:
            resp = context.make_fail_response(f'导入文件有误: {e}\n请重新import base')

        return resp
Exemple #5
0
 def put(self, plugin_name):
     try:
         if plugin_name == 'lyrebird':
             return context.make_fail_response('暂未开放')
         else:
             plugin_manager.set_default_conf(plugin_name)
             return context.make_ok_response()
     except Exception as e:
         return context.make_fail_response(str(e))
Exemple #6
0
 def get(self, group_id=None, data_id=None):
     if not group_id or not data_id:
         return abort(400, '请设置参数 group_id & data_id')
     _group = context.application.data_manager.groups.get(group_id)
     if not _group:
         return context.make_fail_response('Group not found')
     _data = _group.all_data.get(data_id)
     if not _data:
         return context.make_fail_response('Data not found')
     return jsonify(_data.json(detail=True))
Exemple #7
0
 def post(self):
     link = request.json.get('link', '')
     link_length = len(link)
     if link_length > LINK_MAX_LENGTH:
         return context.make_fail_response(
             f'Current length {link_length} overflows, expected length is less than {LINK_MAX_LENGTH}'
         )
     qrcode_img = qrcode.get_qrcode_img(link)
     if qrcode_img:
         return context.make_ok_response(img=qrcode_img)
     else:
         return context.make_fail_response(
             f'make qrcode fail! Link is {link}')
Exemple #8
0
    def put(self, checker_id):
        _checker = application.checkers.get(checker_id)
        if not _checker:
            return context.make_fail_response(f'Checker {checker_id} not found')

        if 'status' not in request.json:
            return context.make_fail_response(f'Checker {checker_id} status not found')

        _checker_status = request.json.get('status')
        if _checker_status:
            application.checkers[checker_id].activate()
        else:
            application.checkers[checker_id].deactivate()
        return context.make_ok_response()
Exemple #9
0
 def delete(self, group):
     if group in context.application.data_manager.data_groups:
         _group = context.application.data_manager.data_groups.pop(group)
         _group.delete()
         return context.make_ok_response()
     else:
         return context.make_fail_response('Not found group')
Exemple #10
0
def stop_app(device_id, bundle_id):
    device = device_service.devices.get(device_id)
    res = device.stop_app()
    if 'NoneType' in res:
        return make_fail_response(
            f'Cannot stop app {bundle_id} before start it')
    return make_ok_response()
Exemple #11
0
def start_app(device_id, bundle_id):
    device = device_service.devices.get(device_id)
    port = application.config.get('mock.port')
    res = device.start_app(bundle_id, _get_ip(), port)
    if res:
        return make_fail_response(res)
    return make_ok_response()
Exemple #12
0
def app_list(device_id):
    device = device_service.devices.get(device_id)
    if device:
        app_list = device.get_apps_list(device_id)
        return make_ok_response(app_list=app_list)
    else:
        return make_fail_response(f'Device id {device_id} not found!')
Exemple #13
0
    def get(self, group_id=None, label=None):
        if group_id:
            _group = context.application.data_manager.id_map.get(group_id)
            if not _group:
                return context.make_fail_response('Not found group')

            return application.make_ok_response(data=_group)

        root = context.application.data_manager.root
        if not label:
            return application.make_ok_response(data=root)

        # update mock data tree with label
        groups_set = set()

        label_list = label.split('+')
        for label_id in label_list:
            label = application.labels.label_map.get(label_id)
            if not label:
                return application.make_fail_response(f'Label {label_id} is not found!')

            if not groups_set:
                groups_set = set(label['groups'])
            else:
                groups_set = groups_set & set(label['groups'])

        data_map = context.application.data_manager.make_data_map_by_group(groups_set)
        return application.make_ok_response(data=data_map)
Exemple #14
0
 def put(self):
     try:
         context.application.conf = request.get_json()
         context.application.save()
         return context.make_ok_response()
     except Exception as e:
         return context.make_fail_response(str(e))
Exemple #15
0
def attachments(attachment_id=None):
    if request.method == 'GET':
        if not attachment_id:
            return jsonify(list(event_handler.attachments.values()))
        else:
            attachment = event_handler.attachments.get(attachment_id)
            if attachment:
                return send_file(attachment['path'])
            else:
                return make_fail_response('Not found attachment')

    elif request.method == 'PUT':
        path = Path(event_handler.attachments[attachment_id].get('path'))
        name = event_handler.attachments[attachment_id].get('name')
        image_data = request.json.get('imageData')

        image_data = image_data.replace('data:image/png;base64,', '', 1)

        with codecs.open(str(path), 'wb') as f:
            image_data = base64.decodebytes(image_data.encode())
            f.write(image_data)
        return make_ok_response(
            message=f'Edited picture {name} has been saved')

    elif request.method == 'DELETE':
        event_handler.attachments.pop(attachment_id)
        return make_ok_response()
Exemple #16
0
def take_screen_shot(device_id):
    device = device_service.devices.get(device_id)
    img_info = device.take_screen_shot()
    if img_info['returncode'] != 0:
        return make_fail_response(img_info['result'].stdout.decode())
    timestamp = img_info.get('timestamp')
    return make_ok_response(
        imgUrl=f'/plugins/ios/api/src/screenshot/{device_id}?time={timestamp}')
Exemple #17
0
 def post(self):
     link = request.json.get('link')
     qrcode_img = qrcode.get_qrcode_img(link)
     if qrcode_img:
         return context.make_ok_response(img=qrcode_img)
     else:
         return context.make_fail_response(
             f'make qrcode fail! Link is {link}')
Exemple #18
0
 def delete(self, group_id=None, data_id=None):
     _group = context.application.data_manager.groups.get(group_id)
     if not _group:
         return context.make_fail_response('Group not found')
     ids = request.json.get('ids')
     for data_id in ids:
         _group.delete_data(data_id)        
     return context.make_ok_response()
Exemple #19
0
 def put(self):
     name = request.json.get('name')
     group_id = request.json.get('group_id')
     group = context.application.data_manager.groups.get(group_id)
     if not group:
         return context.make_fail_response('Group not found')
     group.name = name
     group.save()
     return context.make_ok_response()
Exemple #20
0
 def put(self, group=None, action=None):
     if action == 'activate':
         result = context.application.data_manager.set_current_data_group(group)
     else:
         result = context.application.data_manager.set_current_data_group(None)
     if result:
         return context.make_ok_response()
     else:
         return context.make_fail_response("Activate group fail. Not found! group=%s action=%s" % (group, action))
Exemple #21
0
 def get(self, group=None, data=None):
     if not group or not data:
         return abort(400, '请设置参数 group name')
     _group = context.application.data_manager.data_groups.get(group)
     if _group and data in _group.data_dict:
         _data = _group.data_dict[data]
         _data.read_file()
         return jsonify(_data.json_data)
     return context.make_fail_response('Data not found')
Exemple #22
0
def template_options_controller(action):
    if request.method == 'GET':
        if action == 'install':
            install_options = template_loader.install_options()
            return make_ok_response(install_options=install_options)
        elif action == 'start':
            start_options = template_loader.start_options()
            return make_ok_response(start_options=start_options)
        else:
            return make_fail_response(f'Unknown template action: {action}')
Exemple #23
0
def download_application():
    app_url = request.json.get('appUrl')
    app_url_obj = urlparse(app_url)
    app_name = app_url_obj.path.split('/')[-1]
    app_file = Path(tmp_dir)/app_name

    if not app_file.name.endswith('.apk'):
        return make_fail_response(f'Unexpected type: {app_file.stem}, url: {app_url}')
    _download_big_file(app_file, app_url)
    return make_ok_response(path=str(app_file))
 def get_base_source(self):
     json_obj = auto_load_base()
     if not json_obj:
         json_obj = context.make_fail_response('暂无默认文件,需手动导入base文件')
     # 检查不为空的base文件是否符合标准,符合标准check_base返回0
     else:
         if self.check_base(json_obj):
             # 遇到异常就返回
             return self.check_base(json_obj)
     return json_obj
Exemple #25
0
 def delete(self, group=None, data=None):
     if not group or not data:
         return abort(400, '请设置参数 group name')
     _group = context.application.data_manager.data_groups.get(group)
     if _group and data in _group.data_dict:
         data = _group.data_dict[data]
         data.delete()
         _group.scan()
         return context.make_ok_response()
     return context.make_fail_response('Data not found')
Exemple #26
0
    def get(self, group_id=None):
        if not group_id:
            groups = context.application.data_manager.groups
            return jsonify([groups[group_id].json() for group_id in groups])

        # 返回数据组中数据列表
        _group = context.application.data_manager.groups.get(group_id)
        if not _group:
            return context.make_fail_response('Not found group')

        return jsonify(_group.json(detail=True))
Exemple #27
0
 def put(self):
     group_name = request.json.get('group_name')
     action = request.json.get('action', 'activate')
     for group_id in context.application.data_manager.groups:
         if group_name == context.application.data_manager.groups[group_id].name:
             if action == 'activate':
                 context.application.data_manager.activate(group_id)
             else:
                 context.application.data_manager.deactivate()
             return context.make_ok_response()
     return context.make_fail_response(f'Group not found. name={group_name}')
Exemple #28
0
 def post(self, group=None, data=None):
     group = request.form.get('group')
     name = request.form.get('name')
     req = request.form.get('req')
     req_data = request.form.get('req_data')
     resp = request.form.get('resp')
     resp_data = request.form.get('resp_data')
     origin_name = request.form.get('origin_name')
     if not group or not name:
         return context.make_fail_response('请设置form:group & name')
     _group = context.application.data_manager.data_groups.get(group)
     if _group:
         data = DataHelper.to_dict(req, req_data, resp, resp_data)
         if origin_name == '' or origin_name is None:
             _group.add_data(name, data)
         else:
             _group.update_data(origin_name, name, data)
         return context.make_ok_response()
     else:
         return context.make_fail_response('Group not found')
Exemple #29
0
 def put(self, plugin_name):
     try:
         if plugin_name == 'lyrebird':
             context.application.conf = request.get_json()
             context.application.save()
             return context.make_ok_response()
         else:
             plugin_manager.set_conf(plugin_name, request.get_json())
             return context.make_ok_response()
     except Exception as e:
         return context.make_fail_response(str(e))
Exemple #30
0
    def get(self, group=None):
        if not group:
            return jsonify([group_name for group_name in context.application.data_manager.data_groups])

        _group = context.application.data_manager.data_groups.get(group)
        if _group:
            resp_obj = dict()
            resp_obj['data'] = [[k, _group.data_dict[k].path] for k in _group.data_dict]
            resp_obj['conf'] = _group.conf
            return jsonify(resp_obj)
        return context.make_fail_response('Not found group')