diff --git a/dongtai_common/models/agent.py b/dongtai_common/models/agent.py index 94fa16abf..de38a7b02 100644 --- a/dongtai_common/models/agent.py +++ b/dongtai_common/models/agent.py @@ -14,6 +14,7 @@ from dongtai_common.models.project import IastProject from dongtai_common.models.project_version import IastProjectVersion import json +from time import time class IastAgent(models.Model): @@ -68,15 +69,48 @@ class Meta: db_table = 'iast_agent' def append_events(self, event: str): - events_list = self.events if self.events else ["注册成功"] - events_list.append(event) - self.events = events_list - self.save() + #events_list = self.events if self.events else ["注册成功"] + #events_list.append(event) + #self.events = events_list + #self.save() + self.update_events_if_need() + IastAgentEvent.objects.create(agent_id=self.id, name=event) def only_register(self): events_list = self.events if self.events else ["注册成功"] return events_list == ['注册成功'] + def update_events(self): + for event in self.events: + IastAgentEvent.objects.create(agent_id=self.id, + name=event, + time=None) + + def is_need_to_update(self): + if len(self.events) <= self.new_events.count(): + return False + return True + + def update_events_if_need(self): + if self.is_need_to_update(): + self.update_events() + + +class IastAgentEvent(models.Model): + agent = models.ForeignKey(IastAgent, + on_delete=models.CASCADE, + related_name='new_events', + null=True) + name = models.CharField(default='', max_length=255, blank=True, null=True) + time = models.IntegerField(default=lambda: int(time()), + blank=True, + null=True) + + class Meta: + managed = get_managed() + db_table = 'iast_agent_event' + + # class IastAgent(models.Model): # # class Meta: diff --git a/dongtai_protocol/views/agent_register.py b/dongtai_protocol/views/agent_register.py index 80293da49..128225de4 100644 --- a/dongtai_protocol/views/agent_register.py +++ b/dongtai_protocol/views/agent_register.py @@ -45,10 +45,8 @@ def register_agent(token, version, language, project_name, user, project_current_version = project_version else: project_current_version = IastProjectVersion.objects.filter( - project_id=project['id'], - current_version=1, - status=1 - ).first() + project_id=project['id'], current_version=1, + status=1).first() agent_id = AgentRegisterEndPoint.get_agent_id( token, project_name, user, project_current_version.id) if agent_id == -1: @@ -61,11 +59,13 @@ def register_agent(token, version, language, project_name, user, project_name=project_name, project_version_id=project_current_version.id, language=language, - is_audit=is_audit - ) + is_audit=is_audit) else: - agent_id = AgentRegisterEndPoint.get_agent_id(token=token, project_name=project_name, user=user, - current_project_version_id=0) + agent_id = AgentRegisterEndPoint.get_agent_id( + token=token, + project_name=project_name, + user=user, + current_project_version_id=0) if agent_id == -1: agent_id = AgentRegisterEndPoint.__register_agent( exist_project=False, @@ -76,8 +76,7 @@ def register_agent(token, version, language, project_name, user, project_name=project_name, project_version_id=0, language=language, - is_audit=is_audit - ) + is_audit=is_audit) return agent_id @staticmethod @@ -313,7 +312,10 @@ def post(self, request: Request): agent.save() core_auto_start = agent.is_audit - return R.success(data={'id': agent_id, 'coreAutoStart': core_auto_start}) + return R.success(data={ + 'id': agent_id, + 'coreAutoStart': core_auto_start + }) except Exception as e: logger.error("探针注册失败,原因:{reason}".format(reason=e), exc_info=True) return R.failure(msg="探针注册失败") @@ -324,8 +326,7 @@ def get_agent_id(token, project_name, user, current_project_version_id): token=token, project_name=project_name, user=user, - project_version_id=current_project_version_id - ) + project_version_id=current_project_version_id) agent = queryset.first() if agent: queryset.update(is_core_running=1, online=1, is_running=1) @@ -333,25 +334,26 @@ def get_agent_id(token, project_name, user, current_project_version_id): return -1 @staticmethod - def __register_agent(exist_project, token, user, version, project_id, project_name, project_version_id, language, is_audit): + def __register_agent(exist_project, token, user, version, project_id, + project_name, project_version_id, language, is_audit): if exist_project: - IastAgent.objects.filter(token=token, online=1, user=user).update(online=0) - agent = IastAgent.objects.create( - token=token, - version=version, - latest_time=int(time.time()), - user=user, - is_running=1, - bind_project_id=project_id, - project_name=project_name, - control=0, - is_control=0, - is_core_running=1, - online=1, - project_version_id=project_version_id, - language=language, - is_audit=is_audit - ) + IastAgent.objects.filter(token=token, online=1, + user=user).update(online=0) + agent = IastAgent.objects.create(token=token, + version=version, + latest_time=int(time.time()), + user=user, + is_running=1, + bind_project_id=project_id, + project_name=project_name, + control=0, + is_control=0, + is_core_running=1, + online=1, + project_version_id=project_version_id, + language=language, + is_audit=is_audit) + agent.append_events('注册成功') return agent.id diff --git a/dongtai_protocol/views/except_action.py b/dongtai_protocol/views/except_action.py index c12b8dcdf..68530ba3c 100644 --- a/dongtai_protocol/views/except_action.py +++ b/dongtai_protocol/views/except_action.py @@ -35,10 +35,7 @@ def actual_running_status(self, request): agent = IastAgent.objects.filter(pk=agent_id).first() if not agent: return R.failure(msg=_("Agent not found")) - if agent.only_register( - ) or agent.actual_running_status != actual_running_status: - if not agent.events: - agent.append_events("注册成功") + if agent.actual_running_status != actual_running_status: if actual_running_status in EVENT_MAPPING: agent.append_events(EVENT_MAPPING[actual_running_status]) agent.actual_running_status = actual_running_status diff --git a/dongtai_web/views/agents_v2.py b/dongtai_web/views/agents_v2.py index 318139879..5c81bfc93 100644 --- a/dongtai_web/views/agents_v2.py +++ b/dongtai_web/views/agents_v2.py @@ -6,7 +6,7 @@ from dongtai_common.utils import const from dongtai_web.serializers.agent import AgentSerializer from dongtai_web.utils import get_model_field -from dongtai_common.models.agent import IastAgent +from dongtai_common.models.agent import IastAgent, IastAgentEvent from collections import defaultdict from functools import reduce from django.db.models import Q @@ -24,6 +24,7 @@ import json from typing import Optional from time import time +from itertools import groupby logger = logging.getLogger('dongtai-webapi') @@ -65,6 +66,7 @@ def pagenation_list(self, request): summary, queryset = self.get_paginator( query_agent(filter_condiction), page, page_size) queryset = list(queryset) + agent_dict = {} for agent in queryset: agent['state'] = cal_state(agent) agent['memory_rate'] = get_memory(agent['heartbeat__memory']) @@ -79,6 +81,15 @@ def pagenation_list(self, request): json.loads(agent['server__ipaddresslist']), agent['server__port']) if not agent['events']: agent['events'] = ['注册成功'] + agent_dict[agent['id']] = {} + agent_events = IastAgentEvent.objects.filter( + agent__id__in=agent_dict.keys()).values().all() + agent_events_dict = { + k: list(g) + for k, g in groupby(agent_events, key=lambda x: x['agent_id']) + } + for agent in queryset: + agent['new_events'] = agent_events_dict[agent['id']] data = {'agents': queryset, "summary": summary} except Exception as e: logger.error("agents pagenation_list error:{}".format(e),