from django.db import models from django.db.models import TextChoices from django.utils.translation import gettext_lazy as _ from jumpserver.utils import has_valid_xpack_license class Type: def __init__(self, label, value): self.name = value self.label = label self.value = value def __str__(self): return self.value def __add__(self, other): if isinstance(other, str): return str(str(self) + other) raise TypeError("unsupported operand type(s) for +: '{}' and '{}'".format( type(self), type(other)) ) def __radd__(self, other): if isinstance(other, str): return str(other + str(self)) raise TypeError("unsupported operand type(s) for +(r): '{}' and '{}'".format( type(self), type(other)) ) class FillType(models.TextChoices): no = 'no', _('Disabled') basic = 'basic', _('Basic') script = 'script', _('Script') class BaseType(TextChoices): """ 约束应该考虑代是对平台对限制,避免多余对选项,如: mysql 开启 ssh, 或者开启了也没有作用, 比如 k8s 开启了 domain,目前还不支持 """ @classmethod def get_constrains(cls): constrains = {} base = cls._get_base_constrains() protocols = cls._get_protocol_constrains() automation = cls._get_automation_constrains() base_default = base.pop('*', {}) protocols_default = protocols.pop('*', {}) automation_default = automation.pop('*', {}) for k, v in cls.get_choices(): tp_base = {**base_default, **base.get(k, {})} tp_auto = {**automation_default, **automation.get(k, {})} tp_protocols = {**protocols_default, **{'port_from_addr': False}, **protocols.get(k, {})} tp_protocols = cls._parse_protocols(tp_protocols, k) tp_constrains = {**tp_base, 'protocols': tp_protocols, 'automation': tp_auto} constrains[k] = tp_constrains return constrains @classmethod def _parse_protocols(cls, protocol, tp): from .protocol import Protocol settings = Protocol.settings() choices = protocol.get('choices', []) if choices == '__self__': choices = [tp] protocols = [] for name in choices: protocol = {'name': name, **settings.get(name, {})} setting = protocol.pop('setting', {}) setting_values = {k: v.get('default', None) for k, v in setting.items()} protocol['setting'] = setting_values protocols.append(protocol) if protocols: protocols[0]['default'] = True return protocols @classmethod def _get_base_constrains(cls) -> dict: raise NotImplementedError @classmethod def _get_protocol_constrains(cls) -> dict: raise NotImplementedError @classmethod def _get_automation_constrains(cls) -> dict: raise NotImplementedError @classmethod def internal_platforms(cls): raise NotImplementedError @classmethod def _get_choices_to_types(cls): choices = cls.get_choices() return [Type(label, value) for value, label in choices] @classmethod def get_types(cls): return cls._get_choices_to_types() @classmethod def get_community_types(cls): return cls._get_choices_to_types() @classmethod def get_choices(cls): if not has_valid_xpack_license(): return [ (tp.value, tp.label) for tp in cls.get_community_types() ] return cls.choices