Skip to content

Commit

Permalink
feat(display): add agent event time.
Browse files Browse the repository at this point in the history
  • Loading branch information
Bidaya0 committed Jan 28, 2023
1 parent ecccebd commit 8652920
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 40 deletions.
42 changes: 38 additions & 4 deletions dongtai_common/models/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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:
Expand Down
64 changes: 33 additions & 31 deletions dongtai_protocol/views/agent_register.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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="探针注册失败")
Expand All @@ -324,34 +326,34 @@ 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)
return agent['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


Expand Down
5 changes: 1 addition & 4 deletions dongtai_protocol/views/except_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 12 additions & 1 deletion dongtai_web/views/agents_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,6 +24,7 @@
import json
from typing import Optional
from time import time
from itertools import groupby

logger = logging.getLogger('dongtai-webapi')

Expand Down Expand Up @@ -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'])
Expand All @@ -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),
Expand Down

0 comments on commit 8652920

Please sign in to comment.