mirror of https://github.com/jumpserver/jumpserver
perf: update pam
parent
4db4a6dce7
commit
114a6bf87c
|
@ -42,7 +42,6 @@ class CheckAccountExecutionViewSet(AutomationExecutionViewSet):
|
||||||
class AccountRiskViewSet(OrgBulkModelViewSet):
|
class AccountRiskViewSet(OrgBulkModelViewSet):
|
||||||
model = AccountRisk
|
model = AccountRisk
|
||||||
search_fields = ('username',)
|
search_fields = ('username',)
|
||||||
filterset_class = AccountRiskFilterSet
|
|
||||||
serializer_classes = {
|
serializer_classes = {
|
||||||
'default': serializers.AccountRiskSerializer,
|
'default': serializers.AccountRiskSerializer,
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,12 +48,21 @@ class GatheredAccountViewSet(OrgBulkModelViewSet):
|
||||||
filterset_class = GatheredAccountFilterSet
|
filterset_class = GatheredAccountFilterSet
|
||||||
serializer_classes = {
|
serializer_classes = {
|
||||||
'default': serializers.GatheredAccountSerializer,
|
'default': serializers.GatheredAccountSerializer,
|
||||||
|
'status': serializers.GatheredAccountActionSerializer,
|
||||||
}
|
}
|
||||||
rbac_perms = {
|
rbac_perms = {
|
||||||
'sync_accounts': 'assets.add_gatheredaccount',
|
'sync_accounts': 'assets.add_gatheredaccount',
|
||||||
'discover': 'assets.add_gatheredaccount',
|
'discover': 'assets.add_gatheredaccount',
|
||||||
|
'status': 'assets.change_gatheredaccount',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@action(methods=['put'], detail=True, url_path='status')
|
||||||
|
def status(self, request, *args, **kwargs):
|
||||||
|
instance = self.get_object()
|
||||||
|
instance.status = request.data.get('status')
|
||||||
|
instance.save()
|
||||||
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
|
||||||
@action(methods=['get'], detail=False, url_path='discover')
|
@action(methods=['get'], detail=False, url_path='discover')
|
||||||
def discover(self, request, *args, **kwargs):
|
def discover(self, request, *args, **kwargs):
|
||||||
asset_id = request.query_params.get('asset_id')
|
asset_id = request.query_params.get('asset_id')
|
||||||
|
|
|
@ -90,7 +90,6 @@ class GatherAccountsManager(AccountBasePlaybookManager):
|
||||||
continue
|
continue
|
||||||
GatheredAccount.sync_accounts(gathered_accounts)
|
GatheredAccount.sync_accounts(gathered_accounts)
|
||||||
|
|
||||||
|
|
||||||
def run(self, *args, **kwargs):
|
def run(self, *args, **kwargs):
|
||||||
super().run(*args, **kwargs)
|
super().run(*args, **kwargs)
|
||||||
users, change_info = self.generate_send_users_and_change_info()
|
users, change_info = self.generate_send_users_and_change_info()
|
||||||
|
|
|
@ -168,7 +168,7 @@ class Migration(migrations.Migration):
|
||||||
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
|
||||||
('org_id',
|
('org_id',
|
||||||
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
|
||||||
('present', models.BooleanField(default=True, verbose_name='Present')),
|
('present', models.BooleanField(default=True, verbose_name='Remote present')),
|
||||||
('date_last_login', models.DateTimeField(null=True, verbose_name='Date login')),
|
('date_last_login', models.DateTimeField(null=True, verbose_name='Date login')),
|
||||||
('username', models.CharField(blank=True, db_index=True, max_length=32, verbose_name='Username')),
|
('username', models.CharField(blank=True, db_index=True, max_length=32, verbose_name='Username')),
|
||||||
('address_last_login', models.CharField(default='', max_length=39, verbose_name='Address login')),
|
('address_last_login', models.CharField(default='', max_length=39, verbose_name='Address login')),
|
||||||
|
|
|
@ -28,14 +28,10 @@ class Migration(migrations.Migration):
|
||||||
model_name="gatheredaccount",
|
model_name="gatheredaccount",
|
||||||
name="action",
|
name="action",
|
||||||
field=models.CharField(
|
field=models.CharField(
|
||||||
choices=[
|
choices=[("confirmed", "Confirmed"), ("ignored", "Ignored")],
|
||||||
("pending", "Pending"),
|
default="",
|
||||||
("confirm", "Confirm"),
|
|
||||||
("ignore", "Ignore"),
|
|
||||||
],
|
|
||||||
default="pending",
|
|
||||||
max_length=32,
|
max_length=32,
|
||||||
verbose_name="Action",
|
verbose_name="Status",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
# Generated by Django 4.1.13 on 2024-10-28 08:19
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
("accounts", "0010_alter_accountrisk_options_and_more"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name="gatheredaccount",
|
|
||||||
name="action",
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name="gatheredaccount",
|
|
||||||
name="status",
|
|
||||||
field=models.CharField(
|
|
||||||
blank=True,
|
|
||||||
choices=[("confirmed", "Confirmed"), ("ignored", "Ignored")],
|
|
||||||
default="",
|
|
||||||
max_length=32,
|
|
||||||
verbose_name="Action",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -13,12 +13,12 @@ __all__ = ['GatherAccountsAutomation', 'GatheredAccount']
|
||||||
|
|
||||||
|
|
||||||
class GatheredAccount(JMSOrgBaseModel):
|
class GatheredAccount(JMSOrgBaseModel):
|
||||||
present = models.BooleanField(default=True, verbose_name=_("Present")) # 资产上是否还存在
|
present = models.BooleanField(default=True, verbose_name=_("Remote present")) # 资产上是否还存在
|
||||||
date_last_login = models.DateTimeField(null=True, verbose_name=_("Date login"))
|
date_last_login = models.DateTimeField(null=True, verbose_name=_("Date login"))
|
||||||
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_("Asset"))
|
asset = models.ForeignKey('assets.Asset', on_delete=models.CASCADE, verbose_name=_("Asset"))
|
||||||
username = models.CharField(max_length=32, blank=True, db_index=True, verbose_name=_('Username'))
|
username = models.CharField(max_length=32, blank=True, db_index=True, verbose_name=_('Username'))
|
||||||
address_last_login = models.CharField(max_length=39, default='', verbose_name=_("Address login"))
|
address_last_login = models.CharField(max_length=39, default='', verbose_name=_("Address login"))
|
||||||
status = models.CharField(max_length=32, default='', blank=True, choices=ConfirmOrIgnore.choices, verbose_name=_("Action"))
|
status = models.CharField(max_length=32, default='', blank=True, choices=ConfirmOrIgnore.choices, verbose_name=_("Status"))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def address(self):
|
def address(self):
|
||||||
|
@ -66,7 +66,7 @@ class GatheredAccount(JMSOrgBaseModel):
|
||||||
cls.create_accounts(gathered_account, accounts)
|
cls.create_accounts(gathered_account, accounts)
|
||||||
|
|
||||||
gathered_account.status = ConfirmOrIgnore.confirmed
|
gathered_account.status = ConfirmOrIgnore.confirmed
|
||||||
gathered_account.save(update_fields=['action'])
|
gathered_account.save(update_fields=['status'])
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Gather asset accounts")
|
verbose_name = _("Gather asset accounts")
|
||||||
|
|
|
@ -5,6 +5,11 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer
|
||||||
from .account import AccountAssetSerializer as _AccountAssetSerializer
|
from .account import AccountAssetSerializer as _AccountAssetSerializer
|
||||||
from .base import BaseAccountSerializer
|
from .base import BaseAccountSerializer
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'GatheredAccountSerializer',
|
||||||
|
'GatheredAccountActionSerializer',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class AccountAssetSerializer(_AccountAssetSerializer):
|
class AccountAssetSerializer(_AccountAssetSerializer):
|
||||||
class Meta(_AccountAssetSerializer.Meta):
|
class Meta(_AccountAssetSerializer.Meta):
|
||||||
|
@ -21,9 +26,15 @@ class GatheredAccountSerializer(BulkOrgResourceModelSerializer):
|
||||||
'date_updated', 'address_last_login',
|
'date_updated', 'address_last_login',
|
||||||
'date_last_login', 'status'
|
'date_last_login', 'status'
|
||||||
]
|
]
|
||||||
|
read_only_fields = fields
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setup_eager_loading(cls, queryset):
|
def setup_eager_loading(cls, queryset):
|
||||||
""" Perform necessary eager loading of data. """
|
""" Perform necessary eager loading of data. """
|
||||||
queryset = queryset.prefetch_related('asset', 'asset__platform')
|
queryset = queryset.prefetch_related('asset', 'asset__platform')
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class GatheredAccountActionSerializer(GatheredAccountSerializer):
|
||||||
|
class Meta(GatheredAccountSerializer.Meta):
|
||||||
|
read_only_fields = list(set(GatheredAccountSerializer.Meta.read_only_fields) - {'status'})
|
||||||
|
|
|
@ -1,18 +1,26 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
from accounts.const import AutomationTypes
|
from rest_framework.serializers import ModelSerializer
|
||||||
from accounts.models import AccountCheckAutomation
|
|
||||||
from common.utils import get_logger
|
|
||||||
|
|
||||||
|
from accounts.const import AutomationTypes
|
||||||
|
from accounts.models import AccountCheckAutomation, AccountRisk
|
||||||
|
from common.utils import get_logger
|
||||||
from .base import BaseAutomationSerializer
|
from .base import BaseAutomationSerializer
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
logger = get_logger(__file__)
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'CheckAccountsAutomationSerializer',
|
'CheckAccountsAutomationSerializer',
|
||||||
|
'AccountRiskSerializer'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class AccountRiskSerializer(ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = AccountRisk
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class CheckAccountsAutomationSerializer(BaseAutomationSerializer):
|
class CheckAccountsAutomationSerializer(BaseAutomationSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = AccountCheckAutomation
|
model = AccountCheckAutomation
|
||||||
|
|
|
@ -37,6 +37,25 @@ def local_monday():
|
||||||
return zero_hour_time - timedelta(zero_hour_time.weekday())
|
return zero_hour_time - timedelta(zero_hour_time.weekday())
|
||||||
|
|
||||||
|
|
||||||
|
def is_date_difference_than(d1, d2, threshold='1d'):
|
||||||
|
if d1 is None or d2 is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
kwargs = {}
|
||||||
|
if 'd' in threshold:
|
||||||
|
kwargs['days'] = int(threshold[:-1])
|
||||||
|
elif 'h' in threshold:
|
||||||
|
kwargs['hours'] = int(threshold[:-1])
|
||||||
|
elif 'm' in threshold:
|
||||||
|
kwargs['minutes'] = int(threshold[:-1])
|
||||||
|
else:
|
||||||
|
raise ValueError('Invalid threshold format')
|
||||||
|
|
||||||
|
delta = dj_timezone.timedelta(**kwargs)
|
||||||
|
|
||||||
|
return abs((time1 - time2).days) > threshold_in_days
|
||||||
|
|
||||||
|
|
||||||
_rest_dt_field = DateTimeField()
|
_rest_dt_field = DateTimeField()
|
||||||
dt_parser = _rest_dt_field.to_internal_value
|
dt_parser = _rest_dt_field.to_internal_value
|
||||||
dt_formatter = _rest_dt_field.to_representation
|
dt_formatter = _rest_dt_field.to_representation
|
||||||
|
|
Loading…
Reference in New Issue