mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.7 KiB
86 lines
2.7 KiB
# -*- coding: utf-8 -*-
|
|
#
|
|
import uuid
|
|
|
|
from common.utils.timezone import local_now_display
|
|
from common.utils import get_logger
|
|
from common.utils.encode import Singleton
|
|
from common.plugins.es import ES
|
|
|
|
|
|
logger = get_logger(__file__)
|
|
|
|
|
|
class OperateLogStore(ES, metaclass=Singleton):
|
|
def __init__(self, config):
|
|
properties = {
|
|
"id": {
|
|
"type": "keyword"
|
|
},
|
|
"user": {
|
|
"type": "keyword"
|
|
},
|
|
"action": {
|
|
"type": "keyword"
|
|
},
|
|
"resource_type": {
|
|
"type": "keyword"
|
|
},
|
|
"org_id": {
|
|
"type": "keyword"
|
|
},
|
|
"datetime": {
|
|
"type": "date",
|
|
"format": "yyyy-MM-dd HH:mm:ss"
|
|
}
|
|
}
|
|
exact_fields = {}
|
|
match_fields = {
|
|
'id', 'user', 'action', 'resource_type',
|
|
'resource', 'remote_addr', 'org_id'
|
|
}
|
|
keyword_fields = {
|
|
'id', 'user', 'action', 'resource_type', 'org_id'
|
|
}
|
|
if not config.get('INDEX'):
|
|
config['INDEX'] = 'jumpserver_operate_log'
|
|
super().__init__(config, properties, keyword_fields, exact_fields, match_fields)
|
|
self.pre_use_check()
|
|
|
|
@staticmethod
|
|
def make_data(data):
|
|
op_id = data.get('id', str(uuid.uuid4()))
|
|
datetime_param = data.get('datetime', local_now_display())
|
|
data = {
|
|
'id': op_id, 'user': data['user'], 'action': data['action'],
|
|
'resource_type': data['resource_type'], 'resource': data['resource'],
|
|
'remote_addr': data['remote_addr'], 'datetime': datetime_param,
|
|
'before': data['before'], 'after': data['after'], 'org_id': data['org_id']
|
|
}
|
|
return data
|
|
|
|
def save(self, **kwargs):
|
|
log_id = kwargs.get('id', '')
|
|
before = kwargs.get('before') or {}
|
|
after = kwargs.get('after') or {}
|
|
|
|
op_log = self.get({'id': log_id})
|
|
if op_log is not None:
|
|
data = {'doc': {}}
|
|
raw_after = op_log.get('after') or {}
|
|
raw_before = op_log.get('before') or {}
|
|
raw_before.update(before)
|
|
raw_after.update(after)
|
|
data['doc']['before'] = raw_before
|
|
data['doc']['after'] = raw_after
|
|
self.es.update(
|
|
index=self.index, doc_type=self.doc_type,
|
|
id=op_log.get('es_id'), body=data, refresh=True
|
|
)
|
|
else:
|
|
data = self.make_data(kwargs)
|
|
self.es.index(
|
|
index=self.index, doc_type=self.doc_type, body=data,
|
|
refresh=True
|
|
)
|