mirror of https://github.com/jumpserver/jumpserver
perf: 修改依赖
parent
cd8adc6d3d
commit
dca1388a67
|
@ -41,7 +41,7 @@ class SerializeToTreeNodeMixin:
|
||||||
def get_platform(self, asset: Asset):
|
def get_platform(self, asset: Asset):
|
||||||
default = 'file'
|
default = 'file'
|
||||||
icon = {'windows', 'linux'}
|
icon = {'windows', 'linux'}
|
||||||
platform = asset.platform_base.lower()
|
platform = asset.platform.type.lower()
|
||||||
if platform in icon:
|
if platform in icon:
|
||||||
return platform
|
return platform
|
||||||
return default
|
return default
|
||||||
|
@ -70,7 +70,7 @@ class SerializeToTreeNodeMixin:
|
||||||
'name': asset.name,
|
'name': asset.name,
|
||||||
'ip': asset.ip,
|
'ip': asset.ip,
|
||||||
'protocols': asset.protocols_as_list,
|
'protocols': asset.protocols_as_list,
|
||||||
'platform': asset.platform_base,
|
'platform': asset.platform.id,
|
||||||
'org_name': asset.org_name
|
'org_name': asset.org_name
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,7 +192,7 @@ class NodeChildrenAsTreeApi(SerializeToTreeNodeMixin, NodeChildrenApi):
|
||||||
if not self.instance or not include_assets:
|
if not self.instance or not include_assets:
|
||||||
return []
|
return []
|
||||||
assets = self.instance.get_assets().only(
|
assets = self.instance.get_assets().only(
|
||||||
"id", "name", "ip", "os", "platform_id",
|
"id", "name", "ip", "platform_id",
|
||||||
"org_id", "protocols", "is_active",
|
"org_id", "protocols", "is_active",
|
||||||
).prefetch_related('platform')
|
).prefetch_related('platform')
|
||||||
return self.serialize_assets(assets, self.instance.key)
|
return self.serialize_assets(assets, self.instance.key)
|
||||||
|
|
|
@ -4,35 +4,6 @@ from itertools import groupby
|
||||||
from django.db import migrations
|
from django.db import migrations
|
||||||
from django.db.models import F
|
from django.db.models import F
|
||||||
|
|
||||||
category_mapper = {
|
|
||||||
'Linux': ('host', 'linux'),
|
|
||||||
'Unix': ('host', 'unix'),
|
|
||||||
'MacOS': ('host', 'macos'),
|
|
||||||
'BSD': ('host', 'unix'),
|
|
||||||
'Windows': ('host', 'windows'),
|
|
||||||
'Other': ('host', 'other_host'),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def migrate_category_and_type(apps, *args):
|
|
||||||
asset_model = apps.get_model('assets', 'Asset')
|
|
||||||
assets_bases = asset_model.objects.all()\
|
|
||||||
.annotate(base=F("platform__base"))\
|
|
||||||
.values_list('id', 'base')\
|
|
||||||
.order_by('base')
|
|
||||||
base_assets = groupby(assets_bases, lambda a: a[1])
|
|
||||||
|
|
||||||
print("")
|
|
||||||
for base, grouper in base_assets:
|
|
||||||
asset_ids = [g[0] for g in grouper]
|
|
||||||
category_type = category_mapper.get(base)
|
|
||||||
if not category_type:
|
|
||||||
continue
|
|
||||||
print("Migrate {} to => {}".format(base, category_type))
|
|
||||||
category, tp = category_type
|
|
||||||
assets = asset_model.objects.filter(id__in=asset_ids)
|
|
||||||
assets.update(category=category, type=tp)
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
@ -41,5 +12,4 @@ class Migration(migrations.Migration):
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.RunPython(migrate_category_and_type)
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -26,18 +26,13 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='platform',
|
model_name='platform',
|
||||||
name='category',
|
name='category',
|
||||||
field=models.CharField(choices=[('host', 'Host'), ('network', 'Networking'), ('database', 'Database'), ('remote_app', 'Remote app'), ('cloud', 'Clouding')], default='host', max_length=16, verbose_name='Category'),
|
field=models.CharField(default='host', max_length=16, verbose_name='Category'),
|
||||||
preserve_default=False,
|
preserve_default=False,
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='platform',
|
model_name='platform',
|
||||||
name='type',
|
name='type',
|
||||||
field=models.CharField(choices=[('linux', 'Linux'), ('windows', 'Windows'), ('unix', 'Unix'), ('bsd', 'BSD'), ('macos', 'MacOS'), ('mainframe', 'Mainframe'), ('other_host', 'Other host'), ('switch', 'Switch'), ('router', 'Router'), ('firewall', 'Firewall'), ('other_network', 'Other device'), ('mysql', 'MySQL'), ('mariadb', 'MariaDB'), ('postgresql', 'PostgreSQL'), ('oracle', 'Oracle'), ('sqlserver', 'SQLServer'), ('mongodb', 'MongoDB'), ('redis', 'Redis'), ('chrome', 'Chrome'), ('vmware_client', 'vSphere client'), ('mysql_workbench', 'MySQL workbench'), ('general_remote_app', 'Custom'), ('k8s', 'Kubernetes')], default='Linux', max_length=32, verbose_name='Type'),
|
field=models.CharField(default='linux', max_length=32, verbose_name='Type'),
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='systemuser',
|
|
||||||
name='protocol',
|
|
||||||
field=models.CharField(choices=[('ssh', 'SSH'), ('rdp', 'RDP'), ('telnet', 'Telnet'), ('vnc', 'VNC'), ('mysql', 'MySQL'), ('mariadb', 'MariaDB'), ('oracle', 'Oracle'), ('postgresql', 'PostgreSQL'), ('sqlserver', 'SQLServer'), ('redis', 'Redis'), ('mongodb', 'MongoDB'), ('k8s', 'K8S')], default='ssh', max_length=16, verbose_name='Protocol'),
|
|
||||||
),
|
),
|
||||||
migrations.RunPython(migrate_platform_type_to_lower)
|
migrations.RunPython(migrate_platform_type_to_lower)
|
||||||
]
|
]
|
||||||
|
|
|
@ -17,11 +17,8 @@ def create_app_platform(apps, *args):
|
||||||
{'name': 'SQLServer', 'category': 'database', 'type': 'sqlserver'},
|
{'name': 'SQLServer', 'category': 'database', 'type': 'sqlserver'},
|
||||||
{'name': 'MongoDB', 'category': 'database', 'type': 'mongodb'},
|
{'name': 'MongoDB', 'category': 'database', 'type': 'mongodb'},
|
||||||
{'name': 'Redis', 'category': 'database', 'type': 'redis'},
|
{'name': 'Redis', 'category': 'database', 'type': 'redis'},
|
||||||
{'name': 'Chrome', 'category': 'remote_app', 'type': 'chrome'},
|
|
||||||
{'name': 'MysqlWorkbench', 'category': 'remote_app', 'type': 'mysql_workbench'},
|
|
||||||
{'name': 'VmwareClient', 'category': 'remote_app', 'type': 'vmware_client'},
|
|
||||||
{'name': 'General', 'category': 'remote_app', 'type': 'general_remote_app'},
|
|
||||||
{'name': 'Kubernetes', 'category': 'cloud', 'type': 'k8s'},
|
{'name': 'Kubernetes', 'category': 'cloud', 'type': 'k8s'},
|
||||||
|
{'name': 'Web', 'category': 'web', 'type': 'general'},
|
||||||
]
|
]
|
||||||
|
|
||||||
for platform in platforms:
|
for platform in platforms:
|
||||||
|
@ -34,7 +31,7 @@ def get_prop_name_id(apps, app, category):
|
||||||
asset_model = apps.get_model('assets', 'Asset')
|
asset_model = apps.get_model('assets', 'Asset')
|
||||||
_id = app.id
|
_id = app.id
|
||||||
id_exists = asset_model.objects.filter(id=_id).exists()
|
id_exists = asset_model.objects.filter(id=_id).exists()
|
||||||
if (id_exists):
|
if id_exists:
|
||||||
_id = uuid.uuid4()
|
_id = uuid.uuid4()
|
||||||
name = app.name
|
name = app.name
|
||||||
name_exists = asset_model.objects.filter(hostname=name).exists()
|
name_exists = asset_model.objects.filter(hostname=name).exists()
|
||||||
|
|
|
@ -112,6 +112,10 @@ class Asset(AbsConnectivity, NodesRelationMixin, JMSOrgBaseModel):
|
||||||
names.append(n.name + ':' + n.value)
|
names.append(n.name + ':' + n.value)
|
||||||
return names
|
return names
|
||||||
|
|
||||||
|
@property
|
||||||
|
def protocols_as_list(self):
|
||||||
|
return [{'name': p.name, 'port': p.port} for p in self.protocols.all()]
|
||||||
|
|
||||||
@lazyproperty
|
@lazyproperty
|
||||||
def type(self):
|
def type(self):
|
||||||
return self.platform.type
|
return self.platform.type
|
||||||
|
|
|
@ -94,13 +94,13 @@ class AssetPermissionFilter(PermissionBaseFilter):
|
||||||
node_id = filters.UUIDFilter(method='do_nothing')
|
node_id = filters.UUIDFilter(method='do_nothing')
|
||||||
node = filters.CharFilter(method='do_nothing')
|
node = filters.CharFilter(method='do_nothing')
|
||||||
asset_id = filters.UUIDFilter(method='do_nothing')
|
asset_id = filters.UUIDFilter(method='do_nothing')
|
||||||
hostname = filters.CharFilter(method='do_nothing')
|
asset_name = filters.CharFilter(method='do_nothing')
|
||||||
ip = filters.CharFilter(method='do_nothing')
|
ip = filters.CharFilter(method='do_nothing')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = AssetPermission
|
model = AssetPermission
|
||||||
fields = (
|
fields = (
|
||||||
'user_id', 'username', 'system_user_id', 'system_user', 'user_group_id',
|
'user_id', 'username', 'user_group_id',
|
||||||
'user_group', 'node_id', 'node', 'asset_id', 'name', 'ip', 'name',
|
'user_group', 'node_id', 'node', 'asset_id', 'name', 'ip', 'name',
|
||||||
'all', 'asset_id', 'is_valid', 'is_effective', 'from_ticket'
|
'all', 'asset_id', 'is_valid', 'is_effective', 'from_ticket'
|
||||||
)
|
)
|
||||||
|
@ -141,36 +141,36 @@ class AssetPermissionFilter(PermissionBaseFilter):
|
||||||
def filter_asset(self, queryset):
|
def filter_asset(self, queryset):
|
||||||
is_query_all = self.get_query_param('all', True)
|
is_query_all = self.get_query_param('all', True)
|
||||||
asset_id = self.get_query_param('asset_id')
|
asset_id = self.get_query_param('asset_id')
|
||||||
hostname = self.get_query_param('name')
|
asset_name = self.get_query_param('asset_name')
|
||||||
ip = self.get_query_param('ip')
|
ip = self.get_query_param('ip')
|
||||||
|
|
||||||
if asset_id:
|
if asset_id:
|
||||||
assets = Asset.objects.filter(pk=asset_id)
|
assets = Asset.objects.filter(pk=asset_id)
|
||||||
elif hostname:
|
elif asset_name:
|
||||||
assets = Asset.objects.filter(hostname=hostname)
|
assets = Asset.objects.filter(name=asset_name)
|
||||||
elif ip:
|
elif ip:
|
||||||
assets = Asset.objects.filter(ip=ip)
|
assets = Asset.objects.filter(ip=ip)
|
||||||
else:
|
else:
|
||||||
return queryset
|
return queryset
|
||||||
if not assets:
|
if not assets:
|
||||||
return queryset.none()
|
return queryset.none()
|
||||||
assetids = list(assets.values_list('id', flat=True))
|
asset_ids = list(assets.values_list('id', flat=True))
|
||||||
|
|
||||||
if not is_query_all:
|
if not is_query_all:
|
||||||
queryset = queryset.filter(assets__in=assetids)
|
queryset = queryset.filter(assets__in=asset_ids)
|
||||||
return queryset
|
return queryset
|
||||||
inherit_all_nodekeys = set()
|
inherit_all_node_keys = set()
|
||||||
inherit_nodekeys = set(assets.values_list('nodes__key', flat=True))
|
inherit_node_keys = set(assets.values_list('nodes__key', flat=True))
|
||||||
|
|
||||||
for key in inherit_nodekeys:
|
for key in inherit_node_keys:
|
||||||
ancestor_keys = Node.get_node_ancestor_keys(key, with_self=True)
|
ancestor_keys = Node.get_node_ancestor_keys(key, with_self=True)
|
||||||
inherit_all_nodekeys.update(ancestor_keys)
|
inherit_all_node_keys.update(ancestor_keys)
|
||||||
|
|
||||||
inherit_all_nodeids = Node.objects.filter(key__in=inherit_all_nodekeys).values_list('id', flat=True)
|
inherit_all_node_ids = Node.objects.filter(key__in=inherit_all_node_keys).values_list('id', flat=True)
|
||||||
inherit_all_nodeids = list(inherit_all_nodeids)
|
inherit_all_node_ids = list(inherit_all_node_ids)
|
||||||
|
|
||||||
qs1 = queryset.filter(assets__in=assetids).distinct()
|
qs1 = queryset.filter(assets__in=asset_ids).distinct()
|
||||||
qs2 = queryset.filter(nodes__in=inherit_all_nodeids).distinct()
|
qs2 = queryset.filter(nodes__in=inherit_all_node_ids).distinct()
|
||||||
|
|
||||||
qs = UnionQuerySet(qs1, qs2)
|
qs = UnionQuerySet(qs1, qs2)
|
||||||
return qs
|
return qs
|
||||||
|
|
|
@ -137,3 +137,5 @@ ipython==8.4.0
|
||||||
ForgeryPy3==0.3.1
|
ForgeryPy3==0.3.1
|
||||||
django-debug-toolbar==3.5
|
django-debug-toolbar==3.5
|
||||||
Pympler==1.0.1
|
Pympler==1.0.1
|
||||||
|
IPy==1.1
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue