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.
85 lines
2.7 KiB
85 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 |
|
)
|
|
|