mirror of https://github.com/jumpserver/jumpserver
71 lines
1.6 KiB
Python
71 lines
1.6 KiB
Python
import sys
|
|
from abc import ABC
|
|
|
|
from common.db.utils import Encryptor
|
|
from common.utils import lazyproperty
|
|
|
|
current_module = sys.modules[__name__]
|
|
|
|
__all__ = ['build_entry']
|
|
|
|
|
|
class BaseEntry(ABC):
|
|
|
|
def __init__(self, instance):
|
|
self.instance = instance
|
|
|
|
@lazyproperty
|
|
def full_path(self):
|
|
return self.path_spec
|
|
|
|
@property
|
|
def path_spec(self):
|
|
raise NotImplementedError
|
|
|
|
def to_internal_data(self):
|
|
secret = getattr(self.instance, '_secret', None)
|
|
if secret is not None:
|
|
secret = Encryptor(secret).encrypt()
|
|
return secret
|
|
|
|
@staticmethod
|
|
def to_external_data(secret):
|
|
if secret is not None:
|
|
secret = Encryptor(secret).decrypt()
|
|
return secret
|
|
|
|
|
|
class AccountEntry(BaseEntry):
|
|
|
|
@property
|
|
def path_spec(self):
|
|
# 长度 0-127
|
|
account_id = str(self.instance.id)[:18]
|
|
path = f'assets-{self.instance.asset_id}-accounts-{account_id}'
|
|
return path
|
|
|
|
|
|
class AccountTemplateEntry(BaseEntry):
|
|
|
|
@property
|
|
def path_spec(self):
|
|
path = f'account-templates-{self.instance.id}'
|
|
return path
|
|
|
|
|
|
class HistoricalAccountEntry(BaseEntry):
|
|
|
|
@property
|
|
def path_spec(self):
|
|
path = f'accounts-{self.instance.instance.id}-histories-{self.instance.history_id}'
|
|
return path
|
|
|
|
|
|
def build_entry(instance) -> BaseEntry:
|
|
class_name = instance.__class__.__name__
|
|
entry_class_name = f'{class_name}Entry'
|
|
entry_class = getattr(current_module, entry_class_name, None)
|
|
if not entry_class:
|
|
raise Exception(f'Entry class {entry_class_name} is not found')
|
|
return entry_class(instance)
|