mirror of https://github.com/jumpserver/jumpserver
Merge branch 'v3' of github.com:jumpserver/jumpserver into v3
commit
88355f55bb
|
@ -6,7 +6,7 @@ from rest_framework.generics import CreateAPIView, ListAPIView
|
||||||
from orgs.mixins.api import OrgBulkModelViewSet
|
from orgs.mixins.api import OrgBulkModelViewSet
|
||||||
|
|
||||||
from common.mixins import RecordViewLogMixin
|
from common.mixins import RecordViewLogMixin
|
||||||
from assets.models import Account
|
from assets.models import Account, Asset
|
||||||
from assets.filters import AccountFilterSet
|
from assets.filters import AccountFilterSet
|
||||||
from assets.tasks import verify_accounts_connectivity
|
from assets.tasks import verify_accounts_connectivity
|
||||||
from assets import serializers
|
from assets import serializers
|
||||||
|
@ -30,10 +30,18 @@ class AccountViewSet(OrgBulkModelViewSet):
|
||||||
'su_from_accounts': 'assets.view_account',
|
'su_from_accounts': 'assets.view_account',
|
||||||
}
|
}
|
||||||
|
|
||||||
@action(methods=['get'], detail=True, url_path='su-from-accounts')
|
@action(methods=['get'], detail=False, url_path='su-from-accounts')
|
||||||
def su_from_accounts(self, request, *args, **kwargs):
|
def su_from_accounts(self, request, *args, **kwargs):
|
||||||
account = get_object_or_404(Account, pk=self.kwargs['pk'])
|
account_id = request.query_params.get('account')
|
||||||
accounts = account.get_su_from_accounts()
|
asset_id = request.query_params.get('asset')
|
||||||
|
if account_id:
|
||||||
|
account = get_object_or_404(Account, pk=account_id)
|
||||||
|
accounts = account.get_su_from_accounts()
|
||||||
|
elif asset_id:
|
||||||
|
asset = get_object_or_404(Asset, pk=asset_id)
|
||||||
|
accounts = asset.accounts.all()
|
||||||
|
else:
|
||||||
|
accounts = []
|
||||||
serializer = serializers.AccountSerializer(accounts, many=True)
|
serializer = serializers.AccountSerializer(accounts, many=True)
|
||||||
return Response(data=serializer.data)
|
return Response(data=serializer.data)
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:9f0b10566b4d35accd3a8766b14d6903243d93c5d7c55b208d930a189e590f2f
|
oid sha256:eaeedc4823f9b7e236b36a169b5587ef5988d3c3e529d6cbede6bae5e2b57ab8
|
||||||
size 106125
|
size 106349
|
||||||
|
|
|
@ -3067,19 +3067,19 @@ msgstr "跳过"
|
||||||
|
|
||||||
#: ops/models/job.py:39
|
#: ops/models/job.py:39
|
||||||
msgid "Chdir"
|
msgid "Chdir"
|
||||||
msgstr ""
|
msgstr "运行目录"
|
||||||
|
|
||||||
#: ops/models/job.py:40
|
#: ops/models/job.py:40
|
||||||
msgid "Timeout (Seconds)"
|
msgid "Timeout (Seconds)"
|
||||||
msgstr ""
|
msgstr "超市时间(秒)"
|
||||||
|
|
||||||
#: ops/models/job.py:45
|
#: ops/models/job.py:45
|
||||||
msgid "Runas"
|
msgid "Runas"
|
||||||
msgstr ""
|
msgstr "运行用户"
|
||||||
|
|
||||||
#: ops/models/job.py:47
|
#: ops/models/job.py:47
|
||||||
msgid "Runas policy"
|
msgid "Runas policy"
|
||||||
msgstr ""
|
msgstr "用户策略"
|
||||||
|
|
||||||
#: ops/models/job.py:48
|
#: ops/models/job.py:48
|
||||||
msgid "Use Parameter Define"
|
msgid "Use Parameter Define"
|
||||||
|
|
|
@ -99,14 +99,11 @@ class JobExecution(JMSOrgBaseModel):
|
||||||
date_finished = models.DateTimeField(null=True, verbose_name=_("Date finished"))
|
date_finished = models.DateTimeField(null=True, verbose_name=_("Date finished"))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def count(self):
|
def material(self):
|
||||||
if self.is_finished and not self.summary.get('error', None):
|
if self.job.type == 'adhoc':
|
||||||
return {
|
return "{}:{}".format(self.job.module, self.job.args)
|
||||||
"ok": len(self.summary['ok']),
|
if self.job.type == 'playbook':
|
||||||
"failed": len(self.summary['failures']) + len(self.summary['dark']),
|
return "{}:{}:{}".format(self.org.name, self.job.creator.name, self.job.playbook.name)
|
||||||
"excludes": len(self.summary['excludes']),
|
|
||||||
"total": self.job.assets.count()
|
|
||||||
}
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def assent_result_detail(self):
|
def assent_result_detail(self):
|
||||||
|
@ -121,7 +118,7 @@ class JobExecution(JMSOrgBaseModel):
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"tasks": [],
|
"tasks": [],
|
||||||
}
|
}
|
||||||
if self.summary["excludes"].get(asset.name, None):
|
if self.summary.get("excludes", None) and self.summary["excludes"].get(asset.name, None):
|
||||||
asset_detail.update({"status": "excludes"})
|
asset_detail.update({"status": "excludes"})
|
||||||
result["detail"].append(asset_detail)
|
result["detail"].append(asset_detail)
|
||||||
break
|
break
|
||||||
|
@ -160,9 +157,10 @@ class JobExecution(JMSOrgBaseModel):
|
||||||
def get_runner(self):
|
def get_runner(self):
|
||||||
inv = self.job.inventory
|
inv = self.job.inventory
|
||||||
inv.write_to_file(self.inventory_path)
|
inv.write_to_file(self.inventory_path)
|
||||||
|
self.summary = self.result = {"excludes": {}}
|
||||||
if len(inv.exclude_hosts) > 0:
|
if len(inv.exclude_hosts) > 0:
|
||||||
self.summary['excludes'] = inv.exclude_hosts
|
self.summary.update({"excludes": inv.exclude_hosts})
|
||||||
self.result['excludes'] = inv.exclude_hosts
|
self.result.update({"excludes": inv.exclude_hosts})
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
if isinstance(self.parameters, str):
|
if isinstance(self.parameters, str):
|
||||||
|
|
|
@ -30,17 +30,14 @@ class JobSerializer(BulkOrgResourceModelSerializer, PeriodTaskSerializerMixin):
|
||||||
class JobExecutionSerializer(BulkOrgResourceModelSerializer):
|
class JobExecutionSerializer(BulkOrgResourceModelSerializer):
|
||||||
creator = ReadableHiddenField(default=serializers.CurrentUserDefault())
|
creator = ReadableHiddenField(default=serializers.CurrentUserDefault())
|
||||||
job_type = serializers.ReadOnlyField(label=_("Job type"))
|
job_type = serializers.ReadOnlyField(label=_("Job type"))
|
||||||
count = serializers.ReadOnlyField(label=_("Count"))
|
material = serializers.ReadOnlyField(label=_("Material"))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = JobExecution
|
model = JobExecution
|
||||||
read_only_fields = ["id", "task_id", "timedelta", "count", "time_cost", 'is_finished', 'date_start',
|
read_only_fields = ["id", "task_id", "timedelta", "time_cost", 'is_finished', 'date_start',
|
||||||
'date_finished',
|
'date_finished',
|
||||||
'date_created',
|
'date_created',
|
||||||
'is_success', 'task_id', 'short_id', 'job_type', 'creator']
|
'is_success', 'task_id', 'short_id', 'job_type', 'summary', 'material']
|
||||||
fields = read_only_fields + [
|
fields = read_only_fields + [
|
||||||
"job", "parameters"
|
"job", "parameters", "creator"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,8 @@ class UserPermTreeRefreshUtil(_UserPermTreeCacheMixin):
|
||||||
logger.info(f'Need to refresh orgs: {to_refresh_orgs}')
|
logger.info(f'Need to refresh orgs: {to_refresh_orgs}')
|
||||||
return to_refresh_orgs
|
return to_refresh_orgs
|
||||||
|
|
||||||
def _mark_user_orgs_refresh_finished(self, org_ids):
|
def _mark_user_orgs_refresh_finished(self, orgs):
|
||||||
|
org_ids = [str(org.id) for org in orgs]
|
||||||
self.client.sadd(self.cache_key_user, *org_ids)
|
self.client.sadd(self.cache_key_user, *org_ids)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue