class PlanContactsSerializer(serializers.Serializer): """预案库联系人""" name = serializers.CharField(required=True, max_length=256, min_length=1, error_messages=generate_error_msg('联系人')) phone = serializers.CharField(required=True, max_length=11, min_length=11, error_messages=generate_error_msg('手机号')) email = serializers.EmailField(required=True, error_messages=generate_error_msg('邮箱')) def validate_phone(self, phone): supported = False for pre in PHONE_PREFIX: if phone.startswith(pre): supported = True break if not supported: raise serializers.ValidationError('手机号码不支持') return phone def create(self, validated_data): contact = PlanContacts.objects.create(**validated_data) return contact def update(self, instance, validated_data): instance.name = validated_data.get('name') instance.phone = validated_data.get('phone') instance.email = validated_data.get('email') instance.save() return instance
class SSAAlarmNotifySerializers(serializers.Serializer): id = serializers.IntegerField() sms = serializers.IntegerField(min_value=0, max_value=1, error_messages=generate_error_msg("是否启用短信")) email = serializers.IntegerField( min_value=0, max_value=1, error_messages=generate_error_msg("是否启用邮件")) def update(self, instance, validated_data): instance.sms = validated_data.get('sms', instance.sms) instance.email = validated_data.get('email', instance.email) instance.save() return instance
class SSAAlarmCellSerializers(serializers.Serializer): id = serializers.IntegerField() enable = serializers.IntegerField( min_value=0, max_value=1, error_messages=generate_error_msg("是否启用")) alarm = serializers.IntegerField(error_messages=generate_error_msg("告警阈值")) warning = serializers.IntegerField( error_messages=generate_error_msg("预警阈值")) def update(self, instance, validated_data): instance.enable = validated_data.get('enable', instance.enable) instance.alarm = validated_data.get('alarm', instance.alarm) instance.warning = validated_data.get('warning', instance.warning) instance.save() return instance
class SSAAlarmConfSerializers(serializers.Serializer): max_alarm_count = serializers.IntegerField( min_value=1, max_value=24, error_messages=generate_error_msg("最大告警次数")) toggle_condition = serializers.IntegerField( min_value=1, max_value=2, error_messages=generate_error_msg("触发条件")) cells = serializers.ListField(child=serializers.DictField()) notifys = serializers.ListField(child=serializers.DictField()) def validate_cells(self, value): data = [] for cell in value: v = SSAAlarmCellSerializers(data=cell) if not v.is_valid(): raise serializers.ValidationError(v.errors.items()[0][1][0]) data.append(cell) return data def validate_notifys(self, value): data = [] for cell in value: v = SSAAlarmNotifySerializers(data=cell) if not v.is_valid(): raise serializers.ValidationError(v.errors.items()[0][1][0]) data.append(cell) return data def update(self, instance, validated_data): instance.max_alarm_count = validated_data.get('max_alarm_count', instance.max_alarm_count) instance.toggle_condition = validated_data.get( 'toggle_condition', instance.toggle_condition) for cell in validated_data.get('cells'): cell_instance = models.SSAAlarmConfCell.objects.get(id=cell['id']) v = SSAAlarmCellSerializers(data=cell, instance=cell_instance) if v.is_valid(): v.save() for cell in validated_data.get('notifys'): cell_instance = models.SSAAlarmNotifyConf.objects.get( id=cell['id']) v = SSAAlarmNotifySerializers(data=cell, instance=cell_instance) if v.is_valid(): v.save() instance.save() return instance
class GroupRuleSerializer(serializers.Serializer): """转换序列化""" id = serializers.IntegerField(read_only=True) group_name = serializers.CharField( required=True, error_messages=generate_error_msg("规则组名称")) description = serializers.CharField( required=False, allow_blank=True, error_messages=generate_error_msg('描述')) def create(self, validated_data): return GroupRule.objects.create(**validated_data) def update(self, instance, validated_data): instance.group_name = validated_data.get('group_name') instance.description = validated_data.get('description') instance.save() return instance
class SSAdashborad(serializers.Serializer): "dashborad" name = serializers.CharField(required=True, max_length=256, error_messages=generate_error_msg("名称")) def update(self, instance, validated_data): instance.name = validated_data.get("name", instance.name) instance.save() return instance
class SmWordSerializer(serializers.Serializer): id = serializers.IntegerField(required=True, error_messages={ 'required': 'id必填', }) """SM词库""" word = serializers.CharField(required=True, max_length=50, min_length=1, error_messages=generate_error_msg('SM词'))
class WorkDaySerializer(serializers.Serializer): """转换序列化""" id = serializers.IntegerField(required=True, error_messages={ 'required': 'id必填', }) week = serializers.CharField(required=True, max_length=100, min_length=1, error_messages=generate_error_msg('工作日')) state = serializers.CharField( required=True, max_length=100, min_length=1, error_messages=generate_error_msg('上班状态 1-上班 2-休息')) am_start_time = serializers.CharField( required=False, max_length=100, error_messages=generate_error_msg('上午开始时间')) am_end_time = serializers.CharField( required=False, max_length=100, error_messages=generate_error_msg('上午结束时间')) pm_start_time = serializers.CharField( required=False, max_length=100, error_messages=generate_error_msg('下午开始时间')) pm_end_time = serializers.CharField( required=False, max_length=100, error_messages=generate_error_msg('下午结束时间'))
class SSAChartPerViewSerializer(SSAChartSerializer): """ 预览接口验证 """ name = serializers.CharField(required=False, max_length=256, error_messages=generate_error_msg("名称")) def validate_name(self, data): """ 预览不验证名称 """ return data
class RuleManageSerializers(serializers.Serializer, UserInfos): id = serializers.IntegerField(read_only=True) name = serializers.CharField(required=True, error_messages=generate_error_msg("规则名称")) # 1 文件夹 2 文件 type = serializers.IntegerField(min_value=1, max_value=2, error_messages=generate_error_msg("类型")) sql = serializers.CharField(required=False, allow_null=True, allow_blank=True, error_messages=generate_error_msg("SQL")) parent_id = serializers.IntegerField(required=False, allow_null=True) def validate_name(self, name): qs = models.SSARuleManage.objects.filter(agent=self.agent, company=self.company, name=name) if self.instance: qs = qs.exclude(id=self.instance.id) if qs.count() > 0: raise serializers.ValidationError("名称不能重复") return name def create(self, validated_data): if not validated_data['parent_id']: del validated_data['parent_id'] return models.SSARuleManage.objects.create(agent=self.agent, company=self.company, **validated_data) def update(self, instance, validated_data): if not validated_data['parent_id']: del validated_data['parent_id'] instance.name = validated_data.get("name", instance.name) instance.sql = validated_data.get("sql", instance.sql) instance.save() return instance
class ReportTemplateCellSerializers(serializers.Serializer): """ 报告模板元素 """ cell_id = serializers.IntegerField( error_messages=generate_error_msg("报告元素ID")) cycle = serializers.IntegerField(error_messages=generate_error_msg("统计周期")) chart_type = serializers.CharField( error_messages=generate_error_msg("图表类型")) has_table = serializers.IntegerField( error_messages=generate_error_msg("表格选项")) remark = serializers.CharField(required=False, allow_blank=True, error_messages=generate_error_msg("备注")) order = serializers.IntegerField(required=True, error_messages=generate_error_msg("排序字段"))
class ReportTemplateSerializers(serializers.Serializer, UserInfos): """ 报告模板 """ name = serializers.CharField(required=False, allow_null=True, error_messages=generate_error_msg("模板名称")) cells = serializers.ListField(child=serializers.DictField(), required=False, allow_null=True, error_messages=generate_error_msg("报告元素")) # 生成时间 schedule_type = serializers.IntegerField( error_messages=generate_error_msg("周期类型"), max_value=7, min_value=0) schedule_time = serializers.TimeField( required=False, allow_null=True, error_messages=generate_error_msg("执行时间")) schedule_days = serializers.IntegerField( error_messages=generate_error_msg("执行日期"), required=False, allow_null=True, default=1, max_value=32, min_value=1) schedule_months = serializers.IntegerField( error_messages=generate_error_msg("执行月份"), required=False, allow_null=True, default=1, max_value=12, min_value=1) schedule_start_date = serializers.CharField( required=False, allow_null=True, allow_blank=True, default=timezone.localtime(timezone.now()).date(), error_messages=generate_error_msg("开始时间")) content = serializers.ListField(required=False, error_messages=generate_error_msg("模版内容")) def validate_schedule_start_date(self, data): if not data: return timezone.localtime(timezone.now()).date() return timezone.datetime.strptime(data, "%Y-%m-%d") def validate_name(self, data): if not data: if not self.instance: raise serializers.ValidationError("模板名称不能为空") qs = models.SSAReportTemplate.objects.filter(agent=self.agent, company=self.company, name=data) if self.instance: print(self.instance.id) qs = qs.exclude(id=self.instance.id) if qs.count() > 0: raise serializers.ValidationError("模板名称不能重复") return data def validate(self, attrs): # 按季度执行月份不能超过3 if attrs['schedule_type'] == 6: if attrs['schedule_months'] > 3: raise serializers.ValidationError("按季度执行月份不能超过3") return attrs def validate_cells(self, value): data = [] for index, cell in enumerate(value): cell['order'] = cell.get('order', index + 1) v = ReportTemplateCellSerializers(data=cell) if not v.is_valid(): raise serializers.ValidationError(v.errors.items()[0][1][0]) data.append(cell) return data def create(self, validated_data): # cells = validated_data.get("cells") or [] # del validated_data['cells'] if validated_data['content']: validated_data['content'] = json.dumps(validated_data['content']) else: del validated_data['content'] instance = models.SSAReportTemplate.objects.create( agent=self.agent, company=self.company, **validated_data) instance.next_scan_time = get_next_scan_time( start_date=instance.schedule_start_date, time_s=instance.schedule_time, period_type=instance.schedule_type, days=instance.schedule_days, months=instance.schedule_months) instance.save() ''' for cell in cells: models.SSAReportTemplateCell.objects.create( agent=self.agent, company=self.company, template=instance, **cell) ''' return instance def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.schedule_type = validated_data.get('schedule_type', instance.schedule_type) instance.schedule_time = validated_data.get('schedule_time', instance.schedule_time) instance.schedule_days = validated_data.get('schedule_days', instance.schedule_days) instance.schedule_months = validated_data.get('schedule_months', instance.schedule_months) instance.schedule_start_date = validated_data.get( 'schedule_start_date', instance.schedule_start_date) if 'content' in validated_data and validated_data['content']: instance.content = json.dumps(validated_data.get('content')) ''' cells = validated_data.get("cells") or [] if cells: instance.ssareporttemplatecell_set.all().delete() for cell in cells: models.SSAReportTemplateCell.objects.create( agent=self.agent, company=self.company, template=instance, **cell) ''' instance.next_scan_time = get_next_scan_time( start_date=instance.schedule_start_date, time_s=instance.schedule_time, period_type=instance.schedule_type, days=instance.schedule_days, months=instance.schedule_months) instance.save() return instance
class SSAChartSerializer(serializers.Serializer, UserInfos): """图表""" name = serializers.CharField(required=True, max_length=256, error_messages=generate_error_msg("名称")) chart_type = serializers.CharField( required=False, max_length=256, error_messages=generate_error_msg("图表类型")) map_type = serializers.CharField(required=False, max_length=256, error_messages=generate_error_msg("地图类型")) type = serializers.IntegerField(required=False, error_messages=generate_error_msg("图表标签")) data_tag = serializers.IntegerField( required=True, error_messages=generate_error_msg("数据标签")) limit = serializers.IntegerField(default=0, error_messages=generate_error_msg("显示条数")) styles = serializers.DictField(write_only=True, required=False, default='{}', error_messages=generate_error_msg("样式配置")) x = serializers.ListField( # type=serializers.CharField(max_length=256), # value=serializers.CharField(max_length=256), # order=serializers.CharField(max_length=256), ) y = serializers.ListField( # aggregator=serializers.CharField(max_length=256), # value=serializers.CharField(max_length=256), # order=serializers.CharField(max_length=256), ) query_time = serializers.IntegerField( required=False, error_messages=generate_error_msg("时间周期")) data_type = serializers.IntegerField( required=False, error_messages=generate_error_msg("数据源类型")) def validate_name(self, data): """ v name """ if not data: raise serializers.ValidationError("图表名称不能为空") qs = models.SSAChart.objects.filter(agent=self.agent, company=self.company, name=data) if self.instance: qs = qs.exclude(id=self.instance.id) if qs.count() > 0: raise serializers.ValidationError("图表名称不能重复") return data def validate_x(self, data): """ 验证维度 """ uniq_list = [] for i in data: if not isinstance(i, dict): raise serializers.ValidationError("维度条件错误") uniq_str = str(i) if uniq_str in uniq_list: raise serializers.ValidationError("维度条件重复") else: uniq_list.append(uniq_str) i_type = i.get('type') i_value = i.get('value') i_order = i.get('order') if i_type not in ['date', 'key']: raise serializers.ValidationError("维度类型错误") if not i_value: raise serializers.ValidationError("维度值不能为空") if i_order: if i_order not in ['desc', 'asc']: raise serializers.ValidationError("排序方式错误") return data def validate_y(self, data): """ 验证数值字段 """ uniq_list = [] for i in data: if not isinstance(i, dict): raise serializers.ValidationError("查询条件错误") uniq_str = str(i) if uniq_str in uniq_list: raise serializers.ValidationError("查询条件重复") else: uniq_list.append(uniq_str) i_type = i.get('aggregator') i_value = i.get('value') i_order = i.get('order') if i_type not in ssa_common.AGG_MAP.keys(): raise serializers.ValidationError("聚合方式错误") if not i_value: raise serializers.ValidationError("数值字段不能为空") if i_order: if i_order not in ['desc', 'asc']: raise serializers.ValidationError("排序方式错误") return data ''' def validate_data_tag(self, data): """ v name """ try: models.SSADataTag.objects.get(id=data) except models.SSADataTag.DoesNotExist: raise serializers.ValidationError("数据标签错误") return data ''' def create(self, validated_data): # validated_data['data_tag_id'] = validated_data['data_tag'] validated_data['x'] = json.dumps(validated_data['x']) validated_data['y'] = json.dumps(validated_data['y']) validated_data['styles'] = json.dumps(validated_data['styles']) # del validated_data['data_tag'] instance = models.SSAChart.objects.create(agent=self.agent, company=self.company, **validated_data) return instance def update(self, instance, validated_data): instance.name = validated_data.get("name", instance.name) instance.type = validated_data.get("type", instance.type) instance.limit = validated_data.get("limit", instance.limit) instance.chart_type = validated_data.get("chart_type", instance.chart_type) instance.map_type = validated_data.get("map_type", instance.map_type) instance.data_tag = validated_data.get("data_tag", instance.data_tag) instance.query_time = validated_data.get("query_time", instance.query_time) x = validated_data.get('x') y = validated_data.get('y') styles = validated_data.get('styles') if x: instance.x = json.dumps(x) if y: instance.y = json.dumps(y) if styles: instance.styles = json.dumps(styles) instance.data_type = validated_data.get("data_type", instance.data_type) instance.save() return instance
class PlanSerializer(serializers.Serializer): """转换序列化""" title = serializers.CharField(required=True, max_length=256, min_length=1, error_messages=generate_error_msg('标题')) user = serializers.CharField(required=False, max_length=128, min_length=1, error_messages=generate_error_msg('添加人')) level = serializers.IntegerField(required=True, min_value=1, error_messages=generate_error_msg('等级')) scene = serializers.CharField(required=True, max_length=128, min_length=1, error_messages=generate_error_msg('应用场景')) description = serializers.CharField( required=True, min_length=1, error_messages=generate_error_msg('内容')) brief = serializers.CharField(required=False, max_length=2048, min_length=1, error_messages=generate_error_msg('简介')) # 验证 # 创建 def get_tags(self): tag_list = self.context.get('tag', '').split(',') tag_data = [] for tag in tag_list: if not tag: continue tag_obj, _ = PlanTag.objects.get_or_create(name=tag) tag_data.append(tag_obj) return tag_data def get_contact(self): contact = self.context.get('contact', '') all_contact = [] if contact: contact_list = contact.split(',') for c in contact_list: info = c.split('&') c_dict = dict() c_dict['name'] = info[0] c_dict['phone'] = info[1] c_dict['email'] = info[2] all_contact.append(c_dict) return all_contact def create(self, validated_data): store = PlanStore.objects.create(**validated_data) tag_data = self.get_tags() if tag_data: store.tag.add(*tag_data) contact_data = self.get_contact() contact_list = [] for c in contact_data: c['plan_id'] = store.id contact_list.append(PlanContacts(**c)) PlanContacts.objects.bulk_create(contact_list) return store def update(self, instance, validated_data): instance.title = validated_data.get('title') instance.user = validated_data.get('user') instance.level = validated_data.get('level') instance.scene = validated_data.get('scene') instance.description = validated_data.get('description') instance.brief = validated_data.get('brief') instance.save() tag_data = self.get_tags() if tag_data: instance.tag.clear() instance.tag.add(*tag_data) contact_data = self.get_contact() contact_list = [] for c in contact_data: c['plan_id'] = instance.id contact_list.append(PlanContacts(**c)) # 删掉旧的管理人 PlanContacts.objects.filter(plan=instance).delete() PlanContacts.objects.bulk_create(contact_list) return instance
class AlarmRuleSerializer(serializers.Serializer): """转换序列化""" id = serializers.IntegerField(read_only=True) group_id = serializers.IntegerField( required=True, error_messages=generate_error_msg("规则组ID")) rule_name = serializers.CharField( required=True, error_messages=generate_error_msg("规则名称")) description = serializers.CharField( required=False, allow_blank=True, error_messages=generate_error_msg('描述')) level = serializers.IntegerField(required=False, default=0) status = serializers.IntegerField(required=False, default=-1) content = serializers.ListField() sql = serializers.CharField(required=False, allow_blank=True, error_messages=generate_error_msg('拼装sql')) time_type = serializers.IntegerField(required=False, default=0) time_start = serializers.CharField( required=False, allow_blank=True, error_messages=generate_error_msg('开始时间')) time_end = serializers.CharField(required=False, allow_blank=True, error_messages=generate_error_msg('结束时间')) interval = serializers.IntegerField(required=False, default=0) def parase_sql(self, content): sql_list = [] for item in json.loads(content): sql = 'select * from all-event-* ' where_list = [] time_type = self.validated_data.get('time_type') if time_type == 2 or time_type == "2": time_start = str( self.validated_data.get('time_start')).replace(":", "") time_end = str(self.validated_data.get('time_end')).replace( ":", "") where = 'stastic_time > ${} AND stastic_time < ${}'.format( time_start, time_end) where_list.append(where) if 'event_type' in item and item['event_type']: where = 'event_three_type=\'{}\' '.format( item['event_type']['name']) where_list.append(where) if 'sourceIp' in item and item['sourceIp']: source_ip_list = item['sourceIp'].split(';') ips = [] for item_ip in source_ip_list: if '-' in item_ip: ip_list = get_ip_list(item_ip) ips.extend(ip_list) else: ips.append(item_ip) ips = ['\'{}\''.format(i) for i in ips] where = 'src_ip in ({}) '.format(','.join(ips)) where_list.append(where) if 'sourcePort' in item and item['sourcePort']: source_port_list = item['sourcePort'].split(';') where = 'src_port in ({}) '.format(','.join(source_port_list)) where_list.append(where) if 'targetIp' in item and item['targetIp']: target_ip_list = item['targetIp'].split(';') ips = [] for item_ip in target_ip_list: if '-' in item_ip: ip_list = get_ip_list(item_ip) ips.extend(ip_list) else: ips.append(item_ip) ips = ['\'{}\''.format(i) for i in ips] where = 'dst_ip in ({}) '.format(','.join(ips)) where_list.append(where) if 'targetPort' in item and item['targetPort']: target_port_list = item['targetPort'].split(';') where = 'dst_port in ({}) '.format(','.join(target_port_list)) where_list.append(where) if where_list: sql = sql + 'WHERE ' + ' AND '.join(where_list) if 'count' in item and item['count']: sql += '|{}'.format(item['count']) sql_list.append(sql) return '@'.join(sql_list) def create(self, validated_data): group_id = validated_data.get('group_id') group_rule = GroupRule.objects.get(id=group_id) content = json.dumps( validated_data['content']).decode("unicode_escape") validated_data['status'] = validated_data['status'] if validated_data[ 'status'] else -1 validated_data['content'] = content validated_data['sql'] = self.parase_sql(content=content) instance = AlarmRule.objects.create(**validated_data) instance.group = group_rule return instance def update(self, instance, validated_data): instance.rule_name = validated_data.get('rule_name') instance.description = validated_data.get('description') instance.level = validated_data.get('level') instance.status = validated_data.get('status') if validated_data.get( 'status') else -1 content = json.dumps( validated_data['content']).decode("unicode_escape") instance.content = content instance.sql = self.parase_sql(content=content) instance.time_type = validated_data.get('time_type') instance.time_start = validated_data.get('time_start') instance.time_end = validated_data.get('time_end') instance.interval = validated_data.get('interval') instance.save() group_id = validated_data.get('group_id') group_rule = GroupRule.objects.get(id=group_id) if group_rule: instance.group = group_rule return instance
class KnowledgeSerializer(serializers.Serializer): """转换序列化""" title = serializers.CharField(required=True, max_length=256, min_length=1, error_messages=generate_error_msg('标题')) user = serializers.CharField(required=False, max_length=128, allow_blank=True, error_messages=generate_error_msg('添加人')) type = serializers.CharField(required=True, max_length=128, error_messages=generate_error_msg('分类')) content = serializers.CharField(required=True, min_length=1, error_messages=generate_error_msg('内容')) relate = serializers.CharField(required=False, allow_blank=True, error_messages=generate_error_msg('关联内容')) scene = serializers.CharField(required=False, max_length=128, allow_blank=True, error_messages=generate_error_msg('应用场景')) description = serializers.CharField( required=False, max_length=2048, allow_blank=True, error_messages=generate_error_msg('现象描述')) operate = serializers.CharField(required=False, max_length=2048, allow_blank=True, error_messages=generate_error_msg('运维操作')) decide = serializers.CharField(required=False, max_length=2048, allow_blank=True, error_messages=generate_error_msg('信息研判')) feedback = serializers.CharField(required=False, max_length=2048, allow_blank=True, error_messages=generate_error_msg('结果反馈')) # 验证 def validate_type(self, attr): type = KnowledgeType.objects.filter(name=attr).first() if not type: raise serializers.ValidationError("分类错误") return type # 创建 def get_tags(self): tag_list = self.context.get('tag', '').split(',') tag_data = [] for tag in tag_list: if not tag: continue tag_obj, _ = KnowledgeTag.objects.get_or_create(name=tag) tag_data.append(tag_obj) return tag_data def create(self, validated_data): KnowledgeType.objects.filter() store = KnowledgeStore.objects.create(**validated_data) tag_data = self.get_tags() if tag_data: store.tag.add(*tag_data) return store def update(self, instance, validated_data): instance.title = validated_data.get('title') instance.user = validated_data.get('user') instance.type = validated_data.get('type') instance.content = validated_data.get('content') instance.relate = validated_data.get('relate') instance.scene = validated_data.get('scene') instance.description = validated_data.get('description') instance.operate = validated_data.get('operate') instance.decide = validated_data.get('decide') instance.feedback = validated_data.get('feedback') instance.save() tag_data = self.get_tags() if tag_data: instance.tag.clear() instance.tag.add(*tag_data) return instance