class CommonStorageModelMixin(models.Model): name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) meta = EncryptJsonDictTextField(default={}) is_default = models.BooleanField(default=False, verbose_name=_('Default storage')) comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) class Meta: abstract = True def __str__(self): return self.name def set_to_default(self): self.is_default = True self.save() self.__class__.objects.select_for_update()\ .filter(is_default=True)\ .exclude(id=self.id)\ .update(is_default=False) @classmethod def default(cls): objs = cls.objects.filter(is_default=True) if not objs: objs = cls.objects.filter(name='default', type='server') if not objs: objs = cls.objects.all() return objs.first()
class CommandStorage(CommonModelMixin): TYPE_CHOICES = const.COMMAND_STORAGE_TYPE_CHOICES TYPE_DEFAULTS = dict(const.REPLAY_STORAGE_TYPE_CHOICES_DEFAULT).keys() TYPE_SERVER = const.COMMAND_STORAGE_TYPE_SERVER name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) type = models.CharField( max_length=16, choices=TYPE_CHOICES, verbose_name=_('Type'), default=TYPE_SERVER ) meta = EncryptJsonDictTextField(default={}) comment = models.TextField( max_length=128, default='', blank=True, verbose_name=_('Comment') ) def __str__(self): return self.name @property def config(self): config = self.meta config.update({'TYPE': self.type}) return config def in_defaults(self): return self.type in self.TYPE_DEFAULTS def is_valid(self): if self.in_defaults(): return True storage = jms_storage.get_log_storage(self.config) return storage.ping() def is_using(self): return Terminal.objects.filter(command_storage=self.name).exists()
class RemoteApp(OrgModelMixin): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, verbose_name=_('Name')) asset = models.ForeignKey( 'assets.Asset', on_delete=models.CASCADE, verbose_name=_('Asset') ) type = models.CharField( default=const.REMOTE_APP_TYPE_CHROME, choices=const.REMOTE_APP_TYPE_CHOICES, max_length=128, verbose_name=_('App type') ) path = models.CharField( max_length=128, blank=False, null=False, verbose_name=_('App path') ) params = EncryptJsonDictTextField( max_length=4096, default={}, blank=True, null=True, verbose_name=_('Parameters') ) created_by = models.CharField( max_length=32, null=True, blank=True, verbose_name=_('Created by') ) date_created = models.DateTimeField( auto_now_add=True, null=True, blank=True, verbose_name=_('Date created') ) comment = models.TextField( max_length=128, default='', blank=True, verbose_name=_('Comment') ) class Meta: verbose_name = _("RemoteApp") unique_together = [('org_id', 'name')] ordering = ('name', ) def __str__(self): return self.name @property def parameters(self): """ 返回Guacamole需要的RemoteApp配置参数信息中的parameters参数 """ _parameters = list() _parameters.append(self.type) path = '\"%s\"' % self.path _parameters.append(path) for field in const.REMOTE_APP_TYPE_FIELDS_MAP[self.type]: value = self.params.get(field['name']) if value is None: continue _parameters.append(value) _parameters = ' '.join(_parameters) return _parameters @property def asset_info(self): return { 'id': self.asset.id, 'hostname': self.asset.hostname }
class ReplayStorage(CommonModelMixin): TYPE_CHOICES = const.REPLAY_STORAGE_TYPE_CHOICES TYPE_SERVER = const.REPLAY_STORAGE_TYPE_SERVER TYPE_DEFAULTS = dict(const.REPLAY_STORAGE_TYPE_CHOICES_DEFAULT).keys() name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) type = models.CharField(max_length=16, choices=TYPE_CHOICES, verbose_name=_('Type'), default=TYPE_SERVER) meta = EncryptJsonDictTextField(default={}) comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment')) def __str__(self): return self.name def convert_type(self): s3_type_list = [const.REPLAY_STORAGE_TYPE_CEPH] tp = self.type if tp in s3_type_list: tp = const.REPLAY_STORAGE_TYPE_S3 return tp def get_extra_config(self): extra_config = {'TYPE': self.convert_type()} if self.type == const.REPLAY_STORAGE_TYPE_SWIFT: extra_config.update({'signer': 'S3SignerType'}) return extra_config @property def config(self): config = self.meta extra_config = self.get_extra_config() config.update(extra_config) return config def in_defaults(self): return self.type in self.TYPE_DEFAULTS def is_valid(self): if self.in_defaults(): return True storage = jms_storage.get_object_storage(self.config) target = 'tests.py' src = os.path.join(settings.BASE_DIR, 'common', target) return storage.is_valid(src, target) def is_using(self): return Terminal.objects.filter(replay_storage=self.name).exists()
class CommandStorage(CommonModelMixin): name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) type = models.CharField( max_length=16, choices=const.CommandStorageTypeChoices.choices, default=const.CommandStorageTypeChoices.server.value, verbose_name=_('Type'), ) meta = EncryptJsonDictTextField(default={}) comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) def __str__(self): return self.name @property def type_null(self): return self.type == const.CommandStorageTypeChoices.null.value @property def type_server(self): return self.type == const.CommandStorageTypeChoices.server.value @property def type_null_or_server(self): return self.type_null or self.type_server @property def config(self): config = self.meta config.update({'TYPE': self.type}) return config def is_valid(self): if self.type_null_or_server: return True storage = jms_storage.get_log_storage(self.config) return storage.ping() def is_use(self): return Terminal.objects.filter(command_storage=self.name, is_deleted=False).exists() def get_command_queryset(self): if self.type_server: qs = Command.objects.all() else: if self.type not in TYPE_ENGINE_MAPPING: logger.error(f'Command storage `{self.type}` not support') return Command.objects.none() engine_mod = import_module(TYPE_ENGINE_MAPPING[self.type]) qs = engine_mod.QuerySet(self.config) qs.model = Command return qs
class CommandStorage(CommonModelMixin): name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) type = models.CharField( max_length=16, choices=const.CommandStorageTypeChoices.choices, default=const.CommandStorageTypeChoices.server.value, verbose_name=_('Type'), ) meta = EncryptJsonDictTextField(default={}) comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) def __str__(self): return self.name @property def type_null(self): return self.type == const.CommandStorageTypeChoices.null.value @property def type_server(self): return self.type == const.CommandStorageTypeChoices.server.value @property def type_null_or_server(self): return self.type_null or self.type_server @property def config(self): config = self.meta config.update({'TYPE': self.type}) return config def is_valid(self): if self.type_null_or_server: return True storage = jms_storage.get_log_storage(self.config) return storage.ping() def is_use(self): return Terminal.objects.filter(command_storage=self.name).exists()
class ReplayStorage(CommonModelMixin): name = models.CharField(max_length=128, verbose_name=_("Name"), unique=True) type = models.CharField( max_length=16, choices=const.ReplayStorageTypeChoices.choices, default=const.ReplayStorageTypeChoices.server.value, verbose_name=_('Type') ) meta = EncryptJsonDictTextField(default={}) comment = models.TextField(default='', blank=True, verbose_name=_('Comment')) def __str__(self): return self.name @property def type_null(self): return self.type == const.ReplayStorageTypeChoices.null.value @property def type_server(self): return self.type == const.ReplayStorageTypeChoices.server.value @property def type_null_or_server(self): return self.type_null or self.type_server @property def type_swift(self): return self.type == const.ReplayStorageTypeChoices.swift.value @property def type_ceph(self): return self.type == const.ReplayStorageTypeChoices.ceph.value @property def config(self): _config = {} # add type config if self.type_ceph: _type = const.ReplayStorageTypeChoices.s3.value else: _type = self.type _config.update({'TYPE': _type}) # add special config if self.type_swift: _config.update({'signer': 'S3SignerType'}) # add meta config _config.update(self.meta) return _config def is_valid(self): if self.type_null_or_server: return True storage = jms_storage.get_object_storage(self.config) target = 'tests.py' src = os.path.join(settings.BASE_DIR, 'common', target) return storage.is_valid(src, target) def is_use(self): return Terminal.objects.filter(replay_storage=self.name).exists()