mirror of https://github.com/jumpserver/jumpserver
				
				
				
			[update] 修改一些性能问题
							parent
							
								
									218e425333
								
							
						
					
					
						commit
						1472f0437f
					
				|  | @ -149,9 +149,10 @@ class AssetUserTestConnectiveApi(generics.RetrieveAPIView): | |||
|     def get_asset_users(self): | ||||
|         username = self.request.GET.get('username') | ||||
|         asset_id = self.request.GET.get('asset_id') | ||||
|         prefer = self.request.GET.get("prefer") | ||||
|         asset = get_object_or_none(Asset, pk=asset_id) | ||||
|         manager = AssetUserManager() | ||||
|         asset_users = manager.filter(username=username, assets=[asset]) | ||||
|         asset_users = manager.filter(username=username, assets=[asset], prefer=prefer) | ||||
|         return asset_users | ||||
| 
 | ||||
|     def retrieve(self, request, *args, **kwargs): | ||||
|  |  | |||
|  | @ -126,6 +126,7 @@ class Asset(OrgModelMixin): | |||
|     comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment')) | ||||
| 
 | ||||
|     objects = OrgManager.from_queryset(AssetQuerySet)() | ||||
|     _connectivity = None | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return '{0.hostname}({0.ip})'.format(self) | ||||
|  | @ -221,17 +222,18 @@ class Asset(OrgModelMixin): | |||
| 
 | ||||
|     @property | ||||
|     def connectivity(self): | ||||
|         if self._connectivity: | ||||
|             return self._connectivity | ||||
|         if not self.admin_user: | ||||
|             return Connectivity.unknown() | ||||
|         instance = self.admin_user.get_asset_user(self) | ||||
|         return instance.connectivity | ||||
|         connectivity = self.admin_user.get_asset_connectivity(self) | ||||
|         return connectivity | ||||
| 
 | ||||
|     @connectivity.setter | ||||
|     def connectivity(self, value): | ||||
|         if not self.admin_user: | ||||
|             return | ||||
|         instance = self.admin_user.get_asset_user(self) | ||||
|         instance.set_asset_connectivity(self, value) | ||||
|         self.admin_user.set_asset_connectivity(self, value) | ||||
| 
 | ||||
|     def get_auth_info(self): | ||||
|         if not self.admin_user: | ||||
|  |  | |||
|  | @ -35,8 +35,8 @@ class AssetUser(OrgModelMixin): | |||
|     date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated")) | ||||
|     created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by')) | ||||
| 
 | ||||
|     CONNECTIVITY_ASSET_CACHE_KEY = "ASSET_USER_{}_ASSET_CONNECTIVITY" | ||||
|     CONNECTIVITY_AMOUNT_CACHE_KEY = "ASSET_USER_{}_CONNECTIVITY_AMOUNT" | ||||
|     CONNECTIVITY_ASSET_CACHE_KEY = "ASSET_USER_{}_{}_ASSET_CONNECTIVITY" | ||||
|     CONNECTIVITY_AMOUNT_CACHE_KEY = "ASSET_USER_{}_{}_CONNECTIVITY_AMOUNT" | ||||
|     ASSETS_AMOUNT_CACHE_KEY = "ASSET_USER_{}_ASSETS_AMOUNT" | ||||
|     ASSET_USER_CACHE_TIME = 3600 * 24 | ||||
| 
 | ||||
|  | @ -99,21 +99,24 @@ class AssetUser(OrgModelMixin): | |||
|         unreachable = summary.get('dark', {}).keys() | ||||
|         reachable = summary.get('contacted', {}).keys() | ||||
| 
 | ||||
|         for asset in self.get_related_assets(): | ||||
|         assets = self.get_related_assets() | ||||
|         if not isinstance(assets, list): | ||||
|             assets = assets.only('id', 'hostname', 'admin_user__id') | ||||
|         for asset in assets: | ||||
|             if asset.hostname in unreachable: | ||||
|                 self.set_asset_connectivity(asset, Connectivity.unreachable()) | ||||
|             elif asset.hostname in reachable: | ||||
|                 self.set_asset_connectivity(asset, Connectivity.reachable()) | ||||
|             else: | ||||
|                 self.set_asset_connectivity(asset, Connectivity.unknown()) | ||||
|         cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) | ||||
|         cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, self.part_id) | ||||
|         cache.delete(cache_key) | ||||
| 
 | ||||
|     @property | ||||
|     def connectivity(self): | ||||
|         assets = self.get_related_assets()\ | ||||
|             .select_related('admin_user')\ | ||||
|             .only('id', 'hostname', 'admin_user') | ||||
|         assets = self.get_related_assets() | ||||
|         if not isinstance(assets, list): | ||||
|             assets = assets.only('id', 'hostname', 'admin_user__id') | ||||
|         data = { | ||||
|             'unreachable': [], | ||||
|             'reachable': [], | ||||
|  | @ -131,11 +134,11 @@ class AssetUser(OrgModelMixin): | |||
| 
 | ||||
|     @property | ||||
|     def connectivity_amount(self): | ||||
|         cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) | ||||
|         cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, self.part_id) | ||||
|         amount = cache.get(cache_key) | ||||
|         if not amount: | ||||
|             connectivity = {k: len(v) for k, v in self.connectivity.items()} | ||||
|             cache.set(cache_key, connectivity, self.ASSET_USER_CACHE_TIME) | ||||
|             amount = {k: len(v) for k, v in self.connectivity.items()} | ||||
|             cache.set(cache_key, amount, self.ASSET_USER_CACHE_TIME) | ||||
|         return amount | ||||
| 
 | ||||
|     @property | ||||
|  | @ -152,17 +155,18 @@ class AssetUser(OrgModelMixin): | |||
|         cache.delete(cache_key) | ||||
| 
 | ||||
|     def get_asset_connectivity(self, asset): | ||||
|         i = self.generate_id_with_asset(asset) | ||||
|         key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i) | ||||
|         key = self.get_asset_connectivity_key(asset) | ||||
|         return Connectivity.get(key) | ||||
| 
 | ||||
|     def get_asset_connectivity_key(self, asset): | ||||
|         return self.CONNECTIVITY_ASSET_CACHE_KEY.format(self.username, asset.id) | ||||
| 
 | ||||
|     def set_asset_connectivity(self, asset, c): | ||||
|         i = self.generate_id_with_asset(asset) | ||||
|         key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i) | ||||
|         key = self.get_asset_connectivity_key(asset) | ||||
|         Connectivity.set(key, c) | ||||
|         # 当为某个系统用户或管理用户设置的的时候,失效掉他们的连接数量 | ||||
|         amount_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) | ||||
|         cache.delete(amount_key) | ||||
|         amount_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, '*') | ||||
|         cache.delete_pattern(amount_key) | ||||
| 
 | ||||
|     def get_asset_user(self, asset): | ||||
|         from ..backends import AssetUserManager | ||||
|  |  | |||
|  | @ -98,5 +98,11 @@ class Connectivity: | |||
|     def __eq__(self, other): | ||||
|         return self.status == other.status | ||||
| 
 | ||||
|     def __gt__(self, other): | ||||
|         return self.status > other.status | ||||
| 
 | ||||
|     def __lt__(self, other): | ||||
|         return not self.__gt__(other) | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return self.display() | ||||
|  |  | |||
|  | @ -2,12 +2,12 @@ | |||
| # | ||||
| from rest_framework import serializers | ||||
| from rest_framework.validators import ValidationError | ||||
| 
 | ||||
| from django.db.models import Prefetch | ||||
| from django.utils.translation import ugettext_lazy as _ | ||||
| 
 | ||||
| from orgs.mixins import BulkOrgResourceModelSerializer | ||||
| from common.serializers import AdaptedBulkListSerializer | ||||
| from ..models import Asset, Protocol | ||||
| from ..models import Asset, Protocol, Node, Label | ||||
| from .base import ConnectivitySerializer | ||||
| 
 | ||||
| __all__ = [ | ||||
|  | @ -58,7 +58,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer): | |||
|             'cpu_model', 'cpu_count', 'cpu_cores', 'cpu_vcpus', 'memory', | ||||
|             'disk_total', 'disk_info', 'os', 'os_version', 'os_arch', | ||||
|             'hostname_raw', 'comment', 'created_by', 'date_created', | ||||
|             'hardware_info', 'connectivity' | ||||
|             'hardware_info', 'connectivity', | ||||
|         ] | ||||
|         read_only_fields = ( | ||||
|             'vendor', 'model', 'sn', 'cpu_model', 'cpu_count', | ||||
|  | @ -76,8 +76,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer): | |||
|     @classmethod | ||||
|     def setup_eager_loading(cls, queryset): | ||||
|         """ Perform necessary eager loading of data. """ | ||||
|         queryset = queryset.prefetch_related('labels', 'nodes', 'protocols')\ | ||||
|             .select_related('admin_user', 'domain') | ||||
|         queryset = queryset.prefetch_related( | ||||
|             Prefetch('nodes', queryset=Node.objects.all().only('id')), | ||||
|             Prefetch('labels', queryset=Label.objects.all().only('id')), | ||||
|             'protocols' | ||||
|         ).select_related('admin_user', 'domain') | ||||
|         return queryset | ||||
| 
 | ||||
|     @staticmethod | ||||
|  |  | |||
|  | @ -576,6 +576,7 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False) | |||
| 
 | ||||
|     tasks = get_test_asset_user_connectivity_tasks(asset_user.asset) | ||||
|     if not tasks: | ||||
|         logger.debug("No tasks ") | ||||
|         return | ||||
| 
 | ||||
|     args = (task_name,) | ||||
|  |  | |||
|  | @ -92,8 +92,8 @@ function initAssetUserTable() { | |||
|         ajax_url: assetUserListUrl, | ||||
|         columns: [ | ||||
|             {data: "id"}, {data: "hostname"}, {data: "ip"}, | ||||
|             {data: "username", orderable: false}, {data: "version", orderable: false}, | ||||
|             {data: "connectivity", orderable: false}, | ||||
|             {data: "username"}, {data: "version", orderable: false}, | ||||
|             {data: "connectivity"}, | ||||
|             {data: "date_created", orderable: false}, | ||||
|             {data: "asset", orderable: false} | ||||
|         ], | ||||
|  |  | |||
|  | @ -75,7 +75,7 @@ function initTable() { | |||
|             }}, | ||||
|             {targets: 4, createdCell: function (td, cellData) { | ||||
|                 var innerHtml = ""; | ||||
|                 var data = cellData['reachable']; | ||||
|                 var data = cellData.reachable; | ||||
|                 if (data !== 0) { | ||||
|                     innerHtml = "<span class='text-navy'>" + data + "</span>"; | ||||
|                 } else { | ||||
|  |  | |||
|  | @ -83,4 +83,4 @@ class ApiMessageMixin: | |||
|         message = self.get_success_message(resp.data) | ||||
|         if message: | ||||
|             messages.success(request, message) | ||||
|         return resp | ||||
|         return resp | ||||
|  |  | |||
|  | @ -57,10 +57,15 @@ class JMSCSVRender(BaseRenderer): | |||
|         request = renderer_context['request'] | ||||
|         template = request.query_params.get('template', 'export') | ||||
|         view = renderer_context['view'] | ||||
|         data = json.loads(json.dumps(data, cls=encoders.JSONEncoder)) | ||||
| 
 | ||||
|         if isinstance(data, dict) and data.get("count"): | ||||
|             data = data["results"] | ||||
| 
 | ||||
|         if template == 'import': | ||||
|             data = [data[0]] if data else data | ||||
| 
 | ||||
|         data = json.loads(json.dumps(data, cls=encoders.JSONEncoder)) | ||||
| 
 | ||||
|         try: | ||||
|             serializer = view.get_serializer() | ||||
|             self.set_response_disposition(serializer, renderer_context) | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ def run_command_execution(cid, **kwargs): | |||
|         try: | ||||
|             execution.run() | ||||
|         except SoftTimeLimitExceeded: | ||||
|             print("HLLL") | ||||
|             logger.error("Run time out") | ||||
|     else: | ||||
|         logger.error("Not found the execution id: {}".format(cid)) | ||||
| 
 | ||||
|  |  | |||
|  | @ -28,7 +28,8 @@ class OrgModelViewSet(IDInCacheFilterMixin, ModelViewSet): | |||
| class OrgBulkModelViewSet(IDInCacheFilterMixin, BulkModelViewSet): | ||||
|     def get_queryset(self): | ||||
|         queryset = super().get_queryset().all() | ||||
|         if hasattr(self, 'serializer_class') and \ | ||||
|         if hasattr(self, 'action') and self.action == 'list' and \ | ||||
|             hasattr(self, 'serializer_class') and \ | ||||
|                 hasattr(self.serializer_class, 'setup_eager_loading'): | ||||
|             queryset = self.serializer_class.setup_eager_loading(queryset) | ||||
|         return queryset | ||||
|  |  | |||
|  | @ -32,10 +32,10 @@ class OrgManager(models.Manager): | |||
|             kwargs['org_id'] = _current_org.id | ||||
|         elif _current_org.is_default(): | ||||
|             queryset = queryset.filter(org_id="") | ||||
| 
 | ||||
|         # | ||||
|         # lines = traceback.format_stack() | ||||
|         # print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>") | ||||
|         # for line in lines[-10:-5]: | ||||
|         # for line in lines[-10:-1]: | ||||
|         #     print(line) | ||||
|         # print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<") | ||||
| 
 | ||||
|  |  | |||
|  | @ -262,7 +262,6 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView) | |||
|                 system_users=self.system_user_id | ||||
|             ) | ||||
|         nodes = util.get_nodes_with_assets() | ||||
|         print(list(nodes.keys())) | ||||
|         for node, assets in nodes.items(): | ||||
|             data = parse_node_to_tree_node(node) | ||||
|             queryset.append(data) | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ | |||
|         {% csrf_token %} | ||||
|         <div class="form-group"> | ||||
|             <label class="control-label">{% trans "Download the imported template or use the exported CSV file format" %}</label> | ||||
|             <a href="{% block import_modal_download_template_url %}{% endblock %}?format=csv&template=import" style="display: block">{% trans 'Download the import template' %}</a> | ||||
|             <a href="{% block import_modal_download_template_url %}{% endblock %}?format=csv&template=import&limit=1" style="display: block">{% trans 'Download the import template' %}</a> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="form-group"> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 ibuler
						ibuler