diff --git a/apps/applications/const.py b/apps/applications/const.py index dde571fbc..79a76b593 100644 --- a/apps/applications/const.py +++ b/apps/applications/const.py @@ -17,6 +17,7 @@ class AppCategory(TextChoices): class AppType(TextChoices): # db category mysql = 'mysql', 'MySQL' + redis = 'redis', 'Redis' oracle = 'oracle', 'Oracle' pgsql = 'postgresql', 'PostgreSQL' mariadb = 'mariadb', 'MariaDB' @@ -34,7 +35,9 @@ class AppType(TextChoices): @classmethod def category_types_mapper(cls): return { - AppCategory.db: [cls.mysql, cls.oracle, cls.pgsql, cls.mariadb, cls.sqlserver], + AppCategory.db: [ + cls.mysql, cls.oracle, cls.redis, cls.pgsql, cls.mariadb, cls.sqlserver + ], AppCategory.remote_app: [cls.chrome, cls.mysql_workbench, cls.vmware_client, cls.custom], AppCategory.cloud: [cls.k8s] } @@ -62,7 +65,3 @@ class AppType(TextChoices): @classmethod def cloud_types(cls): return [tp.value for tp in cls.category_types_mapper()[AppCategory.cloud]] - - - - diff --git a/apps/applications/serializers/attrs/application_type/__init__.py b/apps/applications/serializers/attrs/application_type/__init__.py index 8881dedc0..94a6f921d 100644 --- a/apps/applications/serializers/attrs/application_type/__init__.py +++ b/apps/applications/serializers/attrs/application_type/__init__.py @@ -1,5 +1,6 @@ from .mysql import * +from .redis import * from .mariadb import * from .oracle import * from .pgsql import * diff --git a/apps/applications/serializers/attrs/application_type/redis.py b/apps/applications/serializers/attrs/application_type/redis.py new file mode 100644 index 000000000..3ba9ea715 --- /dev/null +++ b/apps/applications/serializers/attrs/application_type/redis.py @@ -0,0 +1,15 @@ +from rest_framework import serializers +from django.utils.translation import ugettext_lazy as _ + +from ..application_category import DBSerializer + + +__all__ = ['RedisSerializer'] + + +class RedisSerializer(DBSerializer): + port = serializers.IntegerField(default=6379, label=_('Port'), allow_null=True) + + + + diff --git a/apps/applications/serializers/attrs/attrs.py b/apps/applications/serializers/attrs/attrs.py index 4bd3f81eb..f249d7816 100644 --- a/apps/applications/serializers/attrs/attrs.py +++ b/apps/applications/serializers/attrs/attrs.py @@ -25,6 +25,7 @@ category_serializer_classes_mapping = { type_serializer_classes_mapping = { # db const.AppType.mysql.value: application_type.MySQLSerializer, + const.AppType.redis.value: application_type.RedisSerializer, const.AppType.mariadb.value: application_type.MariaDBSerializer, const.AppType.oracle.value: application_type.OracleSerializer, const.AppType.pgsql.value: application_type.PostgreSerializer, diff --git a/apps/assets/api/system_user.py b/apps/assets/api/system_user.py index cf61be658..15c541eaa 100644 --- a/apps/assets/api/system_user.py +++ b/apps/assets/api/system_user.py @@ -19,6 +19,7 @@ from ..tasks import ( push_system_user_to_assets_manual, test_system_user_connectivity_manual, push_system_user_to_assets ) +from ..filters import ProtocolInFilterBackend logger = get_logger(__file__) __all__ = [ @@ -40,6 +41,7 @@ class SystemUserViewSet(SuggestionMixin, OrgBulkModelViewSet): 'type': ['exact', 'in'], } search_fields = filterset_fields + extra_filter_backends = [ProtocolInFilterBackend] serializer_class = serializers.SystemUserSerializer serializer_classes = { 'default': serializers.SystemUserSerializer, diff --git a/apps/assets/filters.py b/apps/assets/filters.py index b807396e0..20119aced 100644 --- a/apps/assets/filters.py +++ b/apps/assets/filters.py @@ -149,3 +149,13 @@ class IpInFilterBackend(filters.BaseFilterBackend): ) ) ] + + +class ProtocolInFilterBackend(filters.BaseFilterBackend): + def filter_queryset(self, request, queryset, view): + protocols = request.query_params.get('protocols') + if not protocols: + return queryset + protocol_list = [i.strip() for i in protocols.split(',')] + queryset = queryset.filter(protocol__in=protocol_list) + return queryset diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 7677c3f08..47f05bf83 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -29,6 +29,8 @@ class ProtocolMixin: telnet = 'telnet', 'Telnet' vnc = 'vnc', 'VNC' mysql = 'mysql', 'MySQL' + redis = 'redis', 'Redis' + redis_acl = 'redis_acl', 'Redis ACL' oracle = 'oracle', 'Oracle' mariadb = 'mariadb', 'MariaDB' postgresql = 'postgresql', 'PostgreSQL' @@ -44,7 +46,8 @@ class ProtocolMixin: Protocol.rdp ] APPLICATION_CATEGORY_DB_PROTOCOLS = [ - Protocol.mysql, Protocol.oracle, Protocol.mariadb, Protocol.postgresql, Protocol.sqlserver + Protocol.mysql, Protocol.redis, Protocol.redis_acl, Protocol.oracle, + Protocol.mariadb, Protocol.postgresql, Protocol.sqlserver ] APPLICATION_CATEGORY_CLOUD_PROTOCOLS = [ Protocol.k8s diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 9a085fb27..62ab54683 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -119,7 +119,8 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer): return '' login_mode = self.get_initial_value("login_mode") - if login_mode == SystemUser.LOGIN_AUTO and protocol != SystemUser.Protocol.vnc: + if login_mode == SystemUser.LOGIN_AUTO and protocol != SystemUser.Protocol.vnc \ + and protocol != SystemUser.Protocol.redis: msg = _('* Automatic login mode must fill in the username.') raise serializers.ValidationError(msg) return username diff --git a/apps/terminal/models/session.py b/apps/terminal/models/session.py index bba196bde..43f320267 100644 --- a/apps/terminal/models/session.py +++ b/apps/terminal/models/session.py @@ -29,6 +29,8 @@ class Session(OrgModelMixin): VNC = 'vnc', 'vnc' TELNET = 'telnet', 'telnet' MYSQL = 'mysql', 'mysql' + REDIS = 'redis', 'redis' + REDIS_ACL = 'redis_acl', 'redis acl' ORACLE = 'oracle', 'oracle' MARIADB = 'mariadb', 'mariadb' SQLSERVER = 'sqlserver', 'sqlserver' @@ -162,7 +164,8 @@ class Session(OrgModelMixin): @property def db_protocols(self): _PROTOCOL = self.PROTOCOL - return [_PROTOCOL.MYSQL, _PROTOCOL.MARIADB, _PROTOCOL.ORACLE, _PROTOCOL.POSTGRESQL, _PROTOCOL.SQLSERVER] + return [_PROTOCOL.MYSQL, _PROTOCOL.MARIADB, _PROTOCOL.REDIS, _PROTOCOL.REDIS_ACL, + _PROTOCOL.ORACLE, _PROTOCOL.POSTGRESQL, _PROTOCOL.SQLSERVER] @property def can_terminate(self):