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 对象,需要转变
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
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))
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)
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)