mirror of https://github.com/jumpserver/jumpserver
feat: 命令过滤器支持关联节点; 添加端点规则迁移文件
parent
d1acab3aa9
commit
df31f47c68
|
@ -208,7 +208,8 @@ class SystemUserTaskApi(generics.CreateAPIView):
|
||||||
|
|
||||||
class SystemUserCommandFilterRuleListApi(generics.ListAPIView):
|
class SystemUserCommandFilterRuleListApi(generics.ListAPIView):
|
||||||
rbac_perms = {
|
rbac_perms = {
|
||||||
'list': 'assets.view_commandfilterule'
|
'list': 'assets.view_commandfilterule',
|
||||||
|
'GET': 'assets.view_commandfilterule',
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_serializer_class(self):
|
def get_serializer_class(self):
|
||||||
|
@ -223,12 +224,14 @@ class SystemUserCommandFilterRuleListApi(generics.ListAPIView):
|
||||||
if not system_user:
|
if not system_user:
|
||||||
system_user_id = self.request.query_params.get('system_user_id')
|
system_user_id = self.request.query_params.get('system_user_id')
|
||||||
asset_id = self.request.query_params.get('asset_id')
|
asset_id = self.request.query_params.get('asset_id')
|
||||||
|
node_id = self.request.query_params.get('node_id')
|
||||||
application_id = self.request.query_params.get('application_id')
|
application_id = self.request.query_params.get('application_id')
|
||||||
rules = CommandFilterRule.get_queryset(
|
rules = CommandFilterRule.get_queryset(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
user_group_id=user_group_id,
|
user_group_id=user_group_id,
|
||||||
system_user_id=system_user_id,
|
system_user_id=system_user_id,
|
||||||
asset_id=asset_id,
|
asset_id=asset_id,
|
||||||
|
node_id=node_id,
|
||||||
application_id=application_id
|
application_id=application_id
|
||||||
)
|
)
|
||||||
return rules
|
return rules
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.15 on 2022-10-09 09:55
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('assets', '0091_auto_20220629_1826'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='commandfilter',
|
||||||
|
name='nodes',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='cmd_filters', to='assets.Node', verbose_name='Nodes'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -116,7 +116,7 @@ class NodesRelationMixin:
|
||||||
nodes = []
|
nodes = []
|
||||||
for node in self.get_nodes():
|
for node in self.get_nodes():
|
||||||
_nodes = node.get_ancestors(with_self=True)
|
_nodes = node.get_ancestors(with_self=True)
|
||||||
nodes.append(_nodes)
|
nodes.extend(list(_nodes))
|
||||||
if flat:
|
if flat:
|
||||||
nodes = list(reduce(lambda x, y: set(x) | set(y), nodes))
|
nodes = list(reduce(lambda x, y: set(x) | set(y), nodes))
|
||||||
return nodes
|
return nodes
|
||||||
|
|
|
@ -10,7 +10,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from users.models import User, UserGroup
|
from users.models import User, UserGroup
|
||||||
from applications.models import Application
|
from applications.models import Application
|
||||||
from ..models import SystemUser, Asset
|
from ..models import SystemUser, Asset, Node
|
||||||
|
|
||||||
from common.utils import lazyproperty, get_logger, get_object_or_none
|
from common.utils import lazyproperty, get_logger, get_object_or_none
|
||||||
from orgs.mixins.models import OrgModelMixin
|
from orgs.mixins.models import OrgModelMixin
|
||||||
|
@ -33,6 +33,10 @@ class CommandFilter(OrgModelMixin):
|
||||||
'users.UserGroup', related_name='cmd_filters', blank=True,
|
'users.UserGroup', related_name='cmd_filters', blank=True,
|
||||||
verbose_name=_("User group"),
|
verbose_name=_("User group"),
|
||||||
)
|
)
|
||||||
|
nodes = models.ManyToManyField(
|
||||||
|
'assets.Node', related_name='cmd_filters', blank=True,
|
||||||
|
verbose_name=_("Nodes")
|
||||||
|
)
|
||||||
assets = models.ManyToManyField(
|
assets = models.ManyToManyField(
|
||||||
'assets.Asset', related_name='cmd_filters', blank=True,
|
'assets.Asset', related_name='cmd_filters', blank=True,
|
||||||
verbose_name=_("Asset")
|
verbose_name=_("Asset")
|
||||||
|
@ -189,7 +193,8 @@ class CommandFilterRule(OrgModelMixin):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_queryset(cls, user_id=None, user_group_id=None, system_user_id=None,
|
def get_queryset(cls, user_id=None, user_group_id=None, system_user_id=None,
|
||||||
asset_id=None, application_id=None, org_id=None):
|
asset_id=None, node_id=None, application_id=None, org_id=None):
|
||||||
|
# user & user_group
|
||||||
user_groups = []
|
user_groups = []
|
||||||
user = get_object_or_none(User, pk=user_id)
|
user = get_object_or_none(User, pk=user_id)
|
||||||
if user:
|
if user:
|
||||||
|
@ -198,8 +203,18 @@ class CommandFilterRule(OrgModelMixin):
|
||||||
if user_group:
|
if user_group:
|
||||||
org_id = user_group.org_id
|
org_id = user_group.org_id
|
||||||
user_groups.append(user_group)
|
user_groups.append(user_group)
|
||||||
system_user = get_object_or_none(SystemUser, pk=system_user_id)
|
|
||||||
|
# asset & node
|
||||||
|
nodes = []
|
||||||
asset = get_object_or_none(Asset, pk=asset_id)
|
asset = get_object_or_none(Asset, pk=asset_id)
|
||||||
|
if asset:
|
||||||
|
nodes.extend(asset.get_all_nodes())
|
||||||
|
node = get_object_or_none(Node, pk=node_id)
|
||||||
|
if node:
|
||||||
|
org_id = node.org_id
|
||||||
|
nodes.append(node)
|
||||||
|
|
||||||
|
system_user = get_object_or_none(SystemUser, pk=system_user_id)
|
||||||
application = get_object_or_none(Application, pk=application_id)
|
application = get_object_or_none(Application, pk=application_id)
|
||||||
q = Q()
|
q = Q()
|
||||||
if user:
|
if user:
|
||||||
|
@ -212,6 +227,8 @@ class CommandFilterRule(OrgModelMixin):
|
||||||
if asset:
|
if asset:
|
||||||
org_id = asset.org_id
|
org_id = asset.org_id
|
||||||
q |= Q(assets=asset)
|
q |= Q(assets=asset)
|
||||||
|
if nodes:
|
||||||
|
q |= Q(nodes__in=set(nodes))
|
||||||
if application:
|
if application:
|
||||||
org_id = application.org_id
|
org_id = application.org_id
|
||||||
q |= Q(applications=application)
|
q |= Q(applications=application)
|
||||||
|
|
|
@ -21,7 +21,7 @@ class CommandFilterSerializer(BulkOrgResourceModelSerializer):
|
||||||
'comment', 'created_by',
|
'comment', 'created_by',
|
||||||
]
|
]
|
||||||
fields_fk = ['rules']
|
fields_fk = ['rules']
|
||||||
fields_m2m = ['users', 'user_groups', 'system_users', 'assets', 'applications']
|
fields_m2m = ['users', 'user_groups', 'system_users', 'nodes', 'assets', 'applications']
|
||||||
fields = fields_small + fields_fk + fields_m2m
|
fields = fields_small + fields_fk + fields_m2m
|
||||||
extra_kwargs = {
|
extra_kwargs = {
|
||||||
'rules': {'read_only': True},
|
'rules': {'read_only': True},
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Generated by Django 3.2.15 on 2022-10-09 09:55
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('terminal', '0052_auto_20220713_1417'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='endpoint',
|
||||||
|
name='mariadb_port',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='endpoint',
|
||||||
|
name='mysql_port',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='endpoint',
|
||||||
|
name='oracle_11g_port',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='endpoint',
|
||||||
|
name='oracle_12c_port',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='endpoint',
|
||||||
|
name='postgresql_port',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='endpoint',
|
||||||
|
name='redis_port',
|
||||||
|
),
|
||||||
|
]
|
Loading…
Reference in New Issue