Example #1
0
def check_dict_data(data, flag='注册信息'):
    """
    校验字典类型数据
    :param data: 校验的数据
    :return:     校验后的数据
    """
    if not isinstance(data, dict):  # 判断请求数据类型是否合规
        return common.detector_message_response(400, '%s数据不是dict类型' % flag,
                                                '%s不是dict类型数据' % flag)
    else:
        return data.copy()  # request_data是 immutable QueryDict 对象,需要转变
Example #2
0
def process_header(request):
    header = request.META
    # 处理user_agent
    user_agent = header.get('HTTP_USER_AGENT')  # 请求头中的User-Agent
    if user_agent is None:
        return common.detector_message_response(400, '请求头缺少User-Agent字段',
                                                '请求头缺少User-Agent字段')
    elif not common.is_valid_user_agent(user_agent):
        return common.detector_message_response(400, '请求头User_Agent字段不符合标准',
                                                '请求头User_Agent字段不符合标准')
    else:
        detector_id = user_agent[0:12]  # 从User-Agent中提取检测器ID并返回

    if detector_id not in request.session:  # 通过session验证检测器是否认证
        return common.detector_message_response(403, '检测器没有认证', '检测器没有认证',
                                                status.HTTP_403_FORBIDDEN)

    is_effective = Detector.objects.filter(
        device_id=detector_id)[0].is_effective
    if not is_effective:
        return common.detector_message_response(403, '检测器已禁用', '检测器已禁用',
                                                status.HTTP_403_FORBIDDEN)

    return detector_id
Example #3
0
def fill_business_data_by_field(field_str, data, detector_id, report_time):
    """
    填充检测器ID和上报时间到检测器上传的业务状态数据用户入库
    :param field_str:      业务状态数据字段-> interface, suspected, plug_status
    :param data:           检测器上传的数据
    :param detector_id:    检测器ID
    :param report_time:    上报时间
    :return:               检测器上传的数据填充后对应字段的数据
    """
    business_data = []
    if field_str in data:
        plugin_status = data[field_str]  # List
        for item in plugin_status:
            item['device_id'] = detector_id
            item['report_time'] = report_time
            business_data.append(item)
        return business_data
    else:
        return common.detector_message_response(
            400, '请求数据缺少{0}参数'.format(field_str),
            '请求数据缺少{0}参数'.format(field_str))
Example #4
0
def process_communication_relation_upload(request, file_relative_path):
    try:
        # request_data = common.print_header_data(request)  # 获取请求数据
        # send_file = request.body
        request_id = snowflake.next_id(1, 0)  # 确定请求的全局唯一ID
        detector_id = common.check_detector_available(request, Detector)  # 检查检测器是否合法,合法就返回检测器ID
        if isinstance(detector_id, Response):
            return detector_id
        # 日志记录
        # logger_record.info('%s %s %s %d' % (request.META.get('REMOTE_ADDR'), detector_id, 'net_log', len(request.FILES)))
        log_str = '%s %s %s %s %d' % (request.META.get('REMOTE_ADDR'), request.META.get('HTTP_X_REMOTE_ADDR', '0.0.0.0'), detector_id, 'net_log', len(request.FILES))
        fu.string2log_append_per_day(content=log_str, path=common.LOG_PATH + 'detector_access_log/')

        file_desc = request.META.get('HTTP_CONTENT_FILEDESC')  # 请求头中的数据字段
        file_desc = common.check_detector_upload_header_filedesc_field(file_desc)  # 校验Content-Filedesc字段
        if isinstance(file_desc, Response):
            return file_desc

        print 'file_desc:', pu.pretty_print_format(file_desc)

        if len(request.FILES) == 1:  # 上传一个gzip压缩文件
            file_absolute_path = os.path.join(common.MEDIA_ROOT, file_relative_path)  # 绝对路径(没有文件名)
            request_file = request.FILES.values()[0]
            gzip_f = gzip.GzipFile(mode='rb', fileobj=request_file)
            try:
                gzip_f.readline()  # 尝试gzip读取文件,若无法读取则不是gzip格式文件
                request_file.seek(0)  # 将文件流重置偏移为文件开头
                gzip_f.close()  # 关闭文件流
            except IOError:
                gzip_f.close()  # 关闭文件流
                request_file.close()
                return common.detector_message_response(400, '不是一个gzip压缩文件',
                                                        request_file.name + ' not a gzipped file')

            file_name = request_file.name  # 原始文件名
            save_file_name = common.rename_detector_upload_file(detector_id, file_name)  # 存储文件名
            is_success = fu.handle_upload_file(file_absolute_path, request_file, save_file_name)  # 上传文件
            if is_success:  # 没有重名文件,上传成功
                request_file.close()  # 关闭文件流
                file_path = os.path.join(file_absolute_path, save_file_name)

                # 生成业务处置系统所需文件(原始文件)
                if config.const.UPLOAD_BUSINESS_DISPOSAL:
                    try:
                        # common.generate_business_file('net_log', file_path, detector_id + '_' + str(int(time.time())) + '_' + str(1) + '.gz')
                        if not os.path.exists(config.const.DISPOSAL_DIR + 'net_log/'):
                            os.makedirs(config.const.DISPOSAL_DIR + 'net_log/')
                        shutil.copy(file_path, config.const.DISPOSAL_DIR + 'net_log/' + detector_id + '_' + file_desc['checksum'])
                        # pass
                    except:
                        traceback.print_exc()

                save_data = {
                    'log_type': 1,
                    'request_id': request_id,
                    'time': datetime.datetime.strptime(file_desc['time'], '%Y-%m-%d %H:%M:%S'),
                    'filename': file_desc['filename'],
                    'checksum': file_desc['checksum'],
                    'filetype': file_desc['filetype'],
                    'save_path': file_relative_path + save_file_name,
                    'receive_time': du.get_current_time(),
                    'device_id': detector_id
                }
                serializer = AuditLogSerializer(data=save_data)
                if serializer.is_valid():
                    serializer.save()  # 存储数据库

                    if config.const.UPLOAD_ES:
                        sender.async_send_es_net_log(request_id, CR_URL, file_path, detector_id)

                    if config.const.UPLOAD_BUSINESS:
                        user_agent = request.META.get('HTTP_USER_AGENT')
                        business_request_header = construct_header('JCQ_XWSJ_NETLOG_FILE', user_agent, file_desc)
                        sender.async_send_business_file('project.audit', 'net_log', detector_id, business_request_header,
                                                        common.MEDIA_ROOT + save_data['save_path'], file_desc['filename'])

                    if config.const.UPLOAD_DIRECTOR and check_global_director_connection():
                        common_header = ccd.get_common_command_header_of_detector('alert', 'JCQ_XWSJ',
                                                                                  'JCQ_XWSJ_NETLOG_FILE', request,
                                                                                  detector_id,
                                                                                  capture_date=datetime.datetime.strptime(
                                                                                      file_desc['time'],
                                                                                      '%Y-%m-%d %H:%M:%S'))
                        ccd.upload_file_2_director_of_detector(common_header, save_data,
                                                               json.dumps((file_desc['filename'], file_path)),
                                                               'JCQ_XWSJ_NETLOG_FILE', 'JCQ_XWSJ_NETLOG_FILE',
                                                               async_level=3)

                    return common.detector_message_response(200, '文件存储成功', {'message': 'success'},
                                                            status.HTTP_200_OK)
                else:
                    return common.detector_message_response(400, json.dumps(serializer.errors),
                                                            '数据处理失败')

            else:
                return common.detector_message_response(400, '文件上传失败: 文件重名', '文件上传失败')
        # elif len(request.FILES) == 0:  # 上传数据(文本字符串)
        # data = request_data.strip().replace('\n', '~=~')
        # requests.post(CR_URL, data={'data': data})
        # return common.detector_message_response(200, '数据存储成功', {'message': 'success'},
        # status.HTTP_200_OK)
        else:
            return common.detector_message_response(400, '上传的不是一个文件', '上传数据格式有误')

    except Exception:
        traceback.print_exc()
        return common.detector_message_response(500, '服务器内部错误', '服务器内部错误',
                                                status.HTTP_500_INTERNAL_SERVER_ERROR)
Example #5
0
def process_system_audit(request):
    try:
        report_time = du.get_current_time()  # 获取当前时间
        request_data = common.print_header_data(request)  # 获取请求数据

        detector_id = common.check_detector_available(request, Detector)  # 检查检测器是否合法,合法就返回检测器ID
        if isinstance(detector_id, Response):
            return detector_id
        data_list = common.detector_upload_json_preprocess(request_data)  # 返回List()格式的上传json数据
        if isinstance(data_list, Response):
            return data_list
        # 日志记录
        # logger_record.info('%s %s %s %d' % (request.META.get('REMOTE_ADDR'), detector_id, 'detector_audit', len(data_list)))
        log_str = '%s %s %s %s %d' % (request.META.get('REMOTE_ADDR'), request.META.get('HTTP_X_REMOTE_ADDR', '0.0.0.0'), detector_id, 'detector_audit', len(data_list))
        fu.string2log_append_per_day(content=log_str, path=common.LOG_PATH + 'detector_access_log/')

        business_data_list = []  # 发送到业务数据服务器上的列表[(请求头, 数据),...]
        handle_data = copy.deepcopy(data_list)  # 生成业务处置系统所需文件的告警数据
        command_send_data = []  # 发送到指挥中心的数据[(请求头, 数据),...]

        for data in data_list:
            business_request_data = copy.deepcopy(data)  # 业务数据传输请求数据

            result = common.check_time_field(data)
            if isinstance(request, Response):
                return result

            if 'id' in data:
                data['log_id'] = data.pop('id')
            else:
                return common.detector_message_response(400, '请求数据中没有id字段', '请求数据中没有id字段')
            data['device_id'] = detector_id  # 加入检测器id字段
            data['report_time'] = report_time  # 加入上报时间字段

            if config.const.UPLOAD_BUSINESS:
                # 构建传输到业务数据服务器上的请求头和请求数据
                business_request_header = {
                    'Host': business_host,
                    'Date': datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S'),
                    'Content-Type': 'application/json',
                    'Version': '1.0',
                    # 'Cookie': 'unknown',
                    'Source-Type': 'JCQ_XTSJ',
                    'Data-Type': 'msg',
                    'User-Agent': request.META.get('HTTP_USER_AGENT'),
                    'Capture-Date': data['time'].strftime('%a, %d %b %Y %H:%M:%S'),
                    'BusinessData-Type': 'JCQ_XTSJ',
                    'Meta-Data': json.dumps({
                        'id': detector_id
                    }),
                }  # 业务数据传输请求头
                ##### update by wwenan 2019.06.18 17:47####
                #business_data_list.append((business_request_header, business_request_data))
                ###########################################
		
            if config.const.UPLOAD_DIRECTOR and check_global_director_connection():
                common_header = ccd.get_common_command_header_of_detector('status', 'AUDIT', 'JCQ_AUDIT',
                                                                          request, detector_id,
                                                                          capture_date=data['time'], data_type='msg')
                command_data = json.dumps(business_request_data, ensure_ascii=False).encode('utf-8')
                ccd.upload_json_2_director_of_detector(common_header, data, command_data, 'JCQ_AUDIT', async_level=3)

        serializer = AuditSystemSerializer(data=data_list, many=True)  # 序列化
        if serializer.is_valid():
            serializer.save()  # 存储数据库

            ##### update by wwenan 2019.06.18 17:47#####
            #if config.const.UPLOAD_BUSINESS:
                #sender.async_send_business_data('project.audit', 'JCQ_XTSJ', detector_id, business_data_list)
            ############################################

            # 生成业务处置系统所需文件
            if config.const.UPLOAD_BUSINESS_DISPOSAL:
                handle_data_type = 'detector_audit'
                file_dir = os.path.join(config.const.DISPOSAL_DIR, 'audit')
                file_name = 'detector_audit_' + str(int(time.time())) + '_' + str(1)
                sender.send_business_disposal(file_dir, file_name, request.META.get('HTTP_USER_AGENT'), handle_data_type, handle_data)

            return common.detector_message_response(200, '数据存储成功', {'message': 'Success'}, status.HTTP_200_OK)
        else:
            return common.detector_message_response(400, json.dumps(serializer.errors),
                                                    '数据缺失或字段不符合规定,序列化出错')
    except Exception:
        traceback.print_exc()
        return common.detector_message_response(500, '服务器内部错误', '服务器内部错误',
                                                status.HTTP_500_INTERNAL_SERVER_ERROR)