From 15e995ade6b16c2101c3d2746fe50fb990873806 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 9 Jul 2020 17:03:49 +0800 Subject: [PATCH 01/20] =?UTF-8?q?ci(build):=20=E4=BF=AE=E6=94=B9=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 23 ++++++++++++++++------- utils/build.sh | 14 +++++++++----- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6569db2a3..869955f17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,28 @@ -FROM registry.fit2cloud.com/public/python:v3 +FROM registry.fit2cloud.com/public/python:v3 as stage-build MAINTAINER Jumpserver Team +ARG VERSION +ENV VERSION=$VERSION WORKDIR /opt/jumpserver -RUN useradd jumpserver +ADD . . +RUN cd utils && bash -ixeu build.sh -COPY ./requirements /tmp/requirements + +FROM registry.fit2cloud.com/public/python:v3 +WORKDIR /opt/jumpserver +COPY --from=stage-build /opt/jumpserver/release/jumpserver /opt/jumpserver + +RUN useradd jumpserver RUN yum -y install epel-release && \ echo -e "[mysql]\nname=mysql\nbaseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql57-community-el6/\ngpgcheck=0\nenabled=1" > /etc/yum.repos.d/mysql.repo -RUN cd /tmp/requirements && yum -y install $(cat rpm_requirements.txt) -RUN cd /tmp/requirements && pip install --upgrade pip setuptools && pip install wheel && \ - pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt || pip install -r requirements.txt + +COPY . . +RUN yum -y install $(cat requirements/rpm_requirements.txt) +RUN pip install --upgrade pip setuptools && pip install wheel && \ + pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements/requirements.txt || pip install -r requirements/requirements.txt RUN mkdir -p /root/.ssh/ && echo -e "Host *\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile /dev/null" > /root/.ssh/config -COPY . /opt/jumpserver RUN echo > config.yml VOLUME /opt/jumpserver/data VOLUME /opt/jumpserver/logs diff --git a/utils/build.sh b/utils/build.sh index 1cf6e9de8..4d23aa66b 100755 --- a/utils/build.sh +++ b/utils/build.sh @@ -5,15 +5,19 @@ utils_dir=$(pwd) project_dir=$(dirname "$utils_dir") release_dir=${project_dir}/release -# 安装依赖包 -command -v git || yum -y install git - # 打包 cd "${project_dir}" || exit 3 -rm -rf "${release_dir:?}/*" +rm -rf "${release_dir:?}"/* to_dir="${release_dir}/jumpserver" mkdir -p "${to_dir}" -git archive --format tar HEAD | tar x -C "${to_dir}" + +if [[ -d '.git' ]];then + command -v git || yum -y install git + git archive --format tar HEAD | tar x -C "${to_dir}" +else + cp -R . /tmp/jumpserver + mv -R /tmp/jumpserver/* "${to_dir}" +fi if [[ $(uname) == 'Darwin' ]];then alias sedi="sed -i ''" From c0cd8878dc9519ed2e0e7b655628a9be137a5cd8 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 9 Jul 2020 17:18:40 +0800 Subject: [PATCH 02/20] =?UTF-8?q?ci(fix):=20=E4=BF=AE=E6=94=B9=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/build.sh b/utils/build.sh index 4d23aa66b..acf411a67 100755 --- a/utils/build.sh +++ b/utils/build.sh @@ -16,7 +16,7 @@ if [[ -d '.git' ]];then git archive --format tar HEAD | tar x -C "${to_dir}" else cp -R . /tmp/jumpserver - mv -R /tmp/jumpserver/* "${to_dir}" + mv /tmp/jumpserver/* "${to_dir}" fi if [[ $(uname) == 'Darwin' ]];then From 437df9a5337c7f01aa9e5f91e2da60b7abaf6c1d Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 10 Jul 2020 16:31:12 +0800 Subject: [PATCH 03/20] =?UTF-8?q?fix(assets):=20node=20asset=20=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E5=8F=91=E7=94=9F=E5=8F=98=E5=8C=96=E6=98=AF=EF=BC=8C?= =?UTF-8?q?=E5=85=B3=E8=81=94=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7=E5=BC=95?= =?UTF-8?q?=E8=B5=B7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/signals_handler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/assets/signals_handler.py b/apps/assets/signals_handler.py index ce906dcd2..f3329c286 100644 --- a/apps/assets/signals_handler.py +++ b/apps/assets/signals_handler.py @@ -185,7 +185,9 @@ def on_asset_nodes_add(sender, instance=None, action='', model=None, pk_set=None system_users_assets = defaultdict(set) for system_user in system_users: - system_users_assets[system_user].update(set(assets)) + assets_has_set = system_user.assets.all().filter(id__in=assets).values_list('id', flat=True) + assets_remain = set(assets) - set(assets_has_set) + system_users_assets[system_user].update(assets_remain) for system_user, _assets in system_users_assets.items(): system_user.assets.add(*tuple(_assets)) From 724a8f632421230df0e6671731958cdd2250e721 Mon Sep 17 00:00:00 2001 From: BaiJiangJie <32935519+BaiJiangJie@users.noreply.github.com> Date: Mon, 13 Jul 2020 12:00:44 +0800 Subject: [PATCH 04/20] =?UTF-8?q?fix(assets):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7name=E5=AD=97=E6=AE=B5=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E4=B8=8E=E8=B5=84=E4=BA=A7created=5Fby=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E4=B8=8D=E4=B8=80=E8=87=B4=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=B5=84=E4=BA=A7=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#4302)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(assets): 修复用户name字段长度与资产created_by字段长度不一致导致创建资产失败的问题 * fix(assets): 修复用户name字段长度与资产created_by字段长度不一致导致创建资产失败的问题(修改迁移文件名称 0050_auto_20200702_1602.py -> 0051_auto_20200713_1143.py) --- .../migrations/0050_auto_20200711_1740.py | 18 ++++++++++++++++++ ...0702_1602.py => 0051_auto_20200713_1143.py} | 4 ++-- apps/assets/models/asset.py | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 apps/assets/migrations/0050_auto_20200711_1740.py rename apps/assets/migrations/{0050_auto_20200702_1602.py => 0051_auto_20200713_1143.py} (81%) diff --git a/apps/assets/migrations/0050_auto_20200711_1740.py b/apps/assets/migrations/0050_auto_20200711_1740.py new file mode 100644 index 000000000..231fcfbe4 --- /dev/null +++ b/apps/assets/migrations/0050_auto_20200711_1740.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.10 on 2020-07-11 09:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0049_systemuser_sftp_root'), + ] + + operations = [ + migrations.AlterField( + model_name='asset', + name='created_by', + field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Created by'), + ), + ] diff --git a/apps/assets/migrations/0050_auto_20200702_1602.py b/apps/assets/migrations/0051_auto_20200713_1143.py similarity index 81% rename from apps/assets/migrations/0050_auto_20200702_1602.py rename to apps/assets/migrations/0051_auto_20200713_1143.py index 5471003ae..95ec1ca06 100644 --- a/apps/assets/migrations/0050_auto_20200702_1602.py +++ b/apps/assets/migrations/0051_auto_20200713_1143.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.10 on 2020-07-02 08:02 +# Generated by Django 2.2.10 on 2020-07-13 03:43 from django.db import migrations, models @@ -6,7 +6,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('assets', '0049_systemuser_sftp_root'), + ('assets', '0050_auto_20200711_1740'), ] operations = [ diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 6b5e716e0..82d09944c 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -221,7 +221,7 @@ class Asset(ProtocolsMixin, NodesRelationMixin, OrgModelMixin): hostname_raw = models.CharField(max_length=128, blank=True, null=True, verbose_name=_('Hostname raw')) labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels")) - created_by = models.CharField(max_length=32, null=True, blank=True, verbose_name=_('Created by')) + created_by = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Created by')) date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True, verbose_name=_('Date created')) comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment')) From da858c899885636da4fd25ab8bb6143a7fb2f71f Mon Sep 17 00:00:00 2001 From: xinwen Date: Mon, 13 Jul 2020 17:49:00 +0800 Subject: [PATCH 05/20] =?UTF-8?q?fix(tickets):=20=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E8=B5=84=E4=BA=A7=E5=B7=A5=E5=8D=95URL=20(#4?= =?UTF-8?q?307)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/tickets/urls/api_urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tickets/urls/api_urls.py b/apps/tickets/urls/api_urls.py index a7bd3f6e5..b086aa9d3 100644 --- a/apps/tickets/urls/api_urls.py +++ b/apps/tickets/urls/api_urls.py @@ -7,7 +7,7 @@ from .. import api app_name = 'tickets' router = BulkRouter() -router.register('tickets/request-asset-perm', api.RequestAssetPermTicketViewSet, 'ticket-request-asset-perm') +# router.register('tickets/request-asset-perm', api.RequestAssetPermTicketViewSet, 'ticket-request-asset-perm') router.register('tickets', api.TicketViewSet, 'ticket') router.register('tickets/(?P[0-9a-zA-Z\-]{36})/comments', api.TicketCommentViewSet, 'ticket-comment') From a5df7738f604d8b3e249a5af1df621d4b3392df0 Mon Sep 17 00:00:00 2001 From: xinwen Date: Tue, 14 Jul 2020 17:54:56 +0800 Subject: [PATCH 06/20] =?UTF-8?q?fix(audits):=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E6=A8=A1=E5=9D=97=20`Serializer`=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20`org=5Fid`=20=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/audits/serializers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index 23d562c8d..cc954640d 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -17,7 +17,7 @@ class FTPLogSerializer(serializers.ModelSerializer): class Meta: model = models.FTPLog fields = ( - 'id', 'user', 'remote_addr', 'asset', 'system_user', + 'id', 'user', 'remote_addr', 'asset', 'system_user', 'org_id', 'operate', 'filename', 'is_success', 'date_start', 'operate_display' ) @@ -40,7 +40,7 @@ class OperateLogSerializer(serializers.ModelSerializer): model = models.OperateLog fields = ( 'id', 'user', 'action', 'resource_type', 'resource', - 'remote_addr', 'datetime' + 'remote_addr', 'datetime', 'org_id' ) @@ -66,7 +66,7 @@ class CommandExecutionSerializer(serializers.ModelSerializer): fields_mini = ['id'] fields_small = fields_mini + [ 'run_as', 'command', 'user', 'is_finished', - 'date_start', 'result', 'is_success' + 'date_start', 'result', 'is_success', 'org_id' ] fields = fields_small + ['hosts', 'run_as_display', 'user_display'] extra_kwargs = { From 1bb366ad944c7e44529131f25d4aa1cab2d841f9 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Jul 2020 15:44:56 +0800 Subject: [PATCH 07/20] =?UTF-8?q?fix(authbook):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=9B=E5=BB=BAAuthBook=E5=AF=B9=E8=B1=A1=E9=94=81=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=B9=B6=E5=8F=91=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=A0=B5=E5=A1=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/authbook.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index 052b83a64..b5882eb45 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -59,8 +59,12 @@ class AuthBook(BaseUser): """ username = kwargs['username'] asset = kwargs['asset'] - key_lock = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) - with cache.lock(key_lock): + lock_key = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) + lock = cache.lock(lock_key, expire=60) + + acquired = lock.acquire(timeout=60) + if acquired: + # 将获取锁的超时时间和锁本身过期时间设置为一致,保证并发创建时不会丢失,最长等待60s后执行 with transaction.atomic(): cls.objects.filter( username=username, asset=asset, is_latest=True @@ -71,7 +75,9 @@ class AuthBook(BaseUser): 'is_latest': True }) obj = cls.objects.create(**kwargs) - return obj + if lock.locked(): + lock.release() + return obj @property def connectivity(self): From abcb589658114734ac386059a5d4c4e13cbc02f2 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Jul 2020 18:54:55 +0800 Subject: [PATCH 08/20] =?UTF-8?q?fix(asset=5Fuser):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=9B=E5=BB=BAAuthBook=E5=AF=B9=E8=B1=A1=E9=94=81=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E4=BD=BF=E7=94=A8select=5Ffor=5Fupdate?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2redis=5Flock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/authbook.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index b5882eb45..895268b2a 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -59,24 +59,17 @@ class AuthBook(BaseUser): """ username = kwargs['username'] asset = kwargs['asset'] - lock_key = 'KEY_LOCK_CREATE_AUTH_BOOK_{}_{}'.format(username, asset.id) - lock = cache.lock(lock_key, expire=60) - - acquired = lock.acquire(timeout=60) - if acquired: - # 将获取锁的超时时间和锁本身过期时间设置为一致,保证并发创建时不会丢失,最长等待60s后执行 - with transaction.atomic(): - cls.objects.filter( - username=username, asset=asset, is_latest=True - ).update(is_latest=False) - max_version = cls.get_max_version(username, asset) - kwargs.update({ - 'version': max_version + 1, - 'is_latest': True - }) - obj = cls.objects.create(**kwargs) - if lock.locked(): - lock.release() + with transaction.atomic(): + # 使用select_for_update限制并发创建相同的username、asset数据 + cls.objects.select_for_update().filter( + username=username, asset=asset, is_latest=True + ).update(is_latest=False) + max_version = cls.get_max_version(username, asset) + kwargs.update({ + 'version': max_version + 1, + 'is_latest': True + }) + obj = cls.objects.create(**kwargs) return obj @property From 9550ea62fbdbed9f6696381a17c2e76ae1dd5610 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Jul 2020 18:55:10 +0800 Subject: [PATCH 09/20] =?UTF-8?q?fix(asset=5Fuser):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=9B=E5=BB=BAAuthBook=E5=AF=B9=E8=B1=A1=E9=94=81=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E4=BD=BF=E7=94=A8select=5Ffor=5Fupdate?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2redis=5Flock2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/authbook.py | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index 895268b2a..87e96c3fe 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -3,7 +3,6 @@ from django.db import models, transaction from django.db.models import Max -from django.core.cache import cache from django.utils.translation import ugettext_lazy as _ from orgs.mixins.models import OrgManager From ddcd4ebbfc692c4e3baab2a4b17182dee4ba4a56 Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Jul 2020 19:02:23 +0800 Subject: [PATCH 10/20] =?UTF-8?q?fix(asset=5Fuser):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=9B=E5=BB=BAAuthBook=E5=AF=B9=E8=B1=A1=E9=94=81=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E4=BD=BF=E7=94=A8select=5Ffor=5Fupdate?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2redis=5Flock3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/authbook.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index 87e96c3fe..7d0a3f472 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -59,10 +59,9 @@ class AuthBook(BaseUser): username = kwargs['username'] asset = kwargs['asset'] with transaction.atomic(): - # 使用select_for_update限制并发创建相同的username、asset数据 - cls.objects.select_for_update().filter( - username=username, asset=asset, is_latest=True - ).update(is_latest=False) + # 使用select_for_update限制并发创建相同的username、asset条目 + instances = cls.objects.select_for_update().filter(username=username, asset=asset) + instances.filter(is_latest=True).update(is_latest=False) max_version = cls.get_max_version(username, asset) kwargs.update({ 'version': max_version + 1, From c7a02586c109f0a5d3d54a96ccf7f786cc1ba51e Mon Sep 17 00:00:00 2001 From: Bai Date: Tue, 14 Jul 2020 19:28:26 +0800 Subject: [PATCH 11/20] =?UTF-8?q?chore(jms):=20=E4=BF=AE=E6=94=B9celery?= =?UTF-8?q?=E9=98=9F=E5=88=97=E6=95=B0=E9=87=8F:=202=20->=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jms b/jms index 48110133e..8081af0bb 100755 --- a/jms +++ b/jms @@ -217,7 +217,7 @@ def get_start_celery_ansible_kwargs(): def get_start_celery_default_kwargs(): print("\n- Start Celery as Distributed Task Queue: Celery") - return get_start_worker_kwargs('celery', 2) + return get_start_worker_kwargs('celery', 4) def get_start_worker_kwargs(queue, num): From 061592fa6b2a839cfa4bfe5d9bacb5cf22fa6e4f Mon Sep 17 00:00:00 2001 From: xinwen Date: Tue, 14 Jul 2020 19:11:08 +0800 Subject: [PATCH 12/20] =?UTF-8?q?fix(terminal):=20=E7=A7=BB=E9=99=A4`Comma?= =?UTF-8?q?ndQueryMixin.get=5Ffilter=5Ffields`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/api/command.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/terminal/api/command.py b/apps/terminal/api/command.py index 749da4fcb..f98fa0e7c 100644 --- a/apps/terminal/api/command.py +++ b/apps/terminal/api/command.py @@ -65,11 +65,6 @@ class CommandQueryMixin: def filter_queryset(self, queryset): return queryset - def get_filter_fields(self, request): - fields = self.filter_fields - fields.extend(["date_from", "date_to"]) - return fields - def get_date_range(self): now = timezone.now() days_ago = now - timezone.timedelta(days=self.default_days_ago) From eef942c155cb4f21d27a782b438494e7a40bf3b6 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 15 Jul 2020 16:07:47 +0800 Subject: [PATCH 13/20] =?UTF-8?q?fix(gather=5Fasset=5Fusers):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=94=B6=E9=9B=86=E8=B5=84=E4=BA=A7=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=AD=E7=94=A8=E6=88=B7=E5=90=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B8=8D=E5=AE=8C=E6=95=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/tasks/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/assets/tasks/const.py b/apps/assets/tasks/const.py index ce9ad9074..51f92bd51 100644 --- a/apps/assets/tasks/const.py +++ b/apps/assets/tasks/const.py @@ -64,7 +64,7 @@ GATHER_ASSET_USERS_TASKS = [ "action": { "module": "shell", "args": "users=$(getent passwd | grep -v 'nologin' | " - "grep -v 'shudown' | awk -F: '{ print $1 }');for i in $users;do last -F $i -1 | " + "grep -v 'shudown' | awk -F: '{ print $1 }');for i in $users;do last -w -F $i -1 | " "head -1 | grep -v '^$' | awk '{ print $1\"@\"$3\"@\"$5,$6,$7,$8 }';done" } } From 0f70f5eccf78b81fe1b5270c8a1727773412c3e3 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 15 Jul 2020 14:35:48 +0800 Subject: [PATCH 14/20] =?UTF-8?q?fix(orgs):=20=E5=88=A0=E9=99=A4=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E5=A4=B1=E8=B4=A5=E6=97=B6=E8=BF=94=E5=9B=9E=E5=AF=B9?= =?UTF-8?q?=E5=BA=94=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 55060 -> 55196 bytes apps/locale/zh/LC_MESSAGES/django.po | 163 ++++++++++++++------------- apps/orgs/api.py | 7 +- 3 files changed, 90 insertions(+), 80 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 9663de119536fd3c56b22f8d7a9e2ea08b703bd9..b90b18ccea08b3ae7f07d47a5c854e9bb250622c 100644 GIT binary patch delta 16217 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 F{|B#(6k-4X delta 16059 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\n" "Language-Team: JumpServer team\n" @@ -85,7 +85,7 @@ msgstr "数据库" #: users/templates/users/user_group_list.html:16 #: users/templates/users/user_profile.html:138 #: xpack/plugins/change_auth_plan/models.py:77 xpack/plugins/cloud/models.py:53 -#: xpack/plugins/cloud/models.py:139 xpack/plugins/gathered_user/models.py:26 +#: xpack/plugins/cloud/models.py:140 xpack/plugins/gathered_user/models.py:26 msgid "Comment" msgstr "备注" @@ -100,7 +100,7 @@ msgid "DatabaseApp" msgstr "数据库应用" #: applications/models/remote_app.py:23 assets/models/asset.py:352 -#: assets/models/authbook.py:27 assets/models/gathered_user.py:14 +#: assets/models/authbook.py:26 assets/models/gathered_user.py:14 #: assets/serializers/admin_user.py:32 assets/serializers/asset_user.py:47 #: assets/serializers/asset_user.py:84 assets/serializers/system_user.py:44 #: assets/serializers/system_user.py:176 audits/models.py:38 @@ -111,7 +111,7 @@ msgstr "数据库应用" #: users/templates/users/user_asset_permission.html:70 #: users/templates/users/user_granted_remote_app.html:36 #: xpack/plugins/change_auth_plan/models.py:283 -#: xpack/plugins/cloud/models.py:269 +#: xpack/plugins/cloud/models.py:266 msgid "Asset" msgstr "资产" @@ -135,7 +135,7 @@ msgstr "参数" #: perms/models/base.py:54 users/models/user.py:508 #: users/serializers/group.py:35 users/templates/users/user_detail.html:97 #: xpack/plugins/change_auth_plan/models.py:81 xpack/plugins/cloud/models.py:56 -#: xpack/plugins/cloud/models.py:145 xpack/plugins/gathered_user/models.py:30 +#: xpack/plugins/cloud/models.py:146 xpack/plugins/gathered_user/models.py:30 msgid "Created by" msgstr "创建者" @@ -148,7 +148,7 @@ msgstr "创建者" #: common/mixins/models.py:50 ops/models/adhoc.py:38 ops/models/command.py:27 #: orgs/models.py:17 perms/models/base.py:55 users/models/group.py:18 #: users/templates/users/user_group_detail.html:58 -#: xpack/plugins/cloud/models.py:59 xpack/plugins/cloud/models.py:148 +#: xpack/plugins/cloud/models.py:59 xpack/plugins/cloud/models.py:149 msgid "Date created" msgstr "创建日期" @@ -247,7 +247,7 @@ msgstr "激活" #: assets/models/asset.py:199 assets/models/cluster.py:19 #: assets/models/user.py:65 templates/_nav.html:44 -#: xpack/plugins/cloud/models.py:133 +#: xpack/plugins/cloud/models.py:133 xpack/plugins/cloud/serializers.py:82 msgid "Admin user" msgstr "管理用户" @@ -319,19 +319,19 @@ msgstr "主机名原始" msgid "Labels" msgstr "标签管理" -#: assets/models/authbook.py:18 +#: assets/models/authbook.py:17 msgid "Bulk delete deny" msgstr "拒绝批量删除" -#: assets/models/authbook.py:28 +#: assets/models/authbook.py:27 msgid "Latest version" msgstr "最新版本" -#: assets/models/authbook.py:29 +#: assets/models/authbook.py:28 msgid "Version" msgstr "版本" -#: assets/models/authbook.py:38 +#: assets/models/authbook.py:37 msgid "AuthBook" msgstr "" @@ -590,7 +590,7 @@ msgstr "键" #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:158 -#: xpack/plugins/cloud/models.py:129 +#: xpack/plugins/cloud/models.py:129 xpack/plugins/cloud/serializers.py:83 msgid "Node" msgstr "节点" @@ -612,7 +612,7 @@ msgid "Assets" msgstr "资产管理" #: assets/models/user.py:111 templates/_nav.html:17 -#: users/views/profile/password.py:40 users/views/profile/pubkey.py:36 +#: users/views/profile/password.py:42 users/views/profile/pubkey.py:36 msgid "Users" msgstr "用户管理" @@ -976,7 +976,7 @@ msgstr "启用" msgid "-" msgstr "" -#: audits/models.py:96 xpack/plugins/cloud/models.py:204 +#: audits/models.py:96 xpack/plugins/cloud/models.py:201 msgid "Failed" msgstr "失败" @@ -1006,13 +1006,13 @@ msgid "MFA" msgstr "多因子认证" #: audits/models.py:105 xpack/plugins/change_auth_plan/models.py:304 -#: xpack/plugins/cloud/models.py:217 +#: xpack/plugins/cloud/models.py:214 msgid "Reason" msgstr "原因" #: audits/models.py:106 tickets/serializers/request_asset_perm.py:53 -#: tickets/serializers/ticket.py:25 xpack/plugins/cloud/models.py:214 -#: xpack/plugins/cloud/models.py:272 +#: tickets/serializers/ticket.py:25 xpack/plugins/cloud/models.py:211 +#: xpack/plugins/cloud/models.py:269 msgid "Status" msgstr "状态" @@ -1025,7 +1025,7 @@ msgid "Is success" msgstr "是否成功" #: audits/serializers.py:73 ops/models/command.py:24 -#: xpack/plugins/cloud/models.py:212 +#: xpack/plugins/cloud/models.py:209 msgid "Result" msgstr "结果" @@ -1144,8 +1144,8 @@ msgid "" "after {} minutes)" msgstr "账号已被锁定(请联系管理员解锁 或 {}分钟后重试)" -#: authentication/errors.py:50 users/views/profile/otp.py:63 -#: users/views/profile/otp.py:102 users/views/profile/otp.py:121 +#: authentication/errors.py:50 users/views/profile/otp.py:107 +#: users/views/profile/otp.py:146 users/views/profile/otp.py:166 msgid "MFA code invalid, or ntp sync server time" msgstr "MFA验证码不正确,或者服务器端时间不对" @@ -1440,10 +1440,6 @@ msgstr "字段必须唯一" msgid "

Flow service unavailable, check it

" msgstr "" -#: jumpserver/views/index.py:26 templates/_nav.html:7 -msgid "Dashboard" -msgstr "仪表盘" - #: jumpserver/views/other.py:26 msgid "" "
Luna is a separately deployed program, you need to deploy Luna, koko, " @@ -1626,6 +1622,14 @@ msgstr "更新任务内容: {}" msgid "Disk used more than 80%: {} => {}" msgstr "磁盘使用率超过 80%: {} => {}" +#: orgs/api.py:57 +msgid "Organization contains undeleted resources" +msgstr "组织内包含未删除的资源" + +#: orgs/api.py:61 +msgid "The current organization cannot be deleted" +msgstr "当能删除当前所在组织" + #: orgs/mixins/models.py:56 orgs/mixins/serializers.py:26 orgs/models.py:31 msgid "Organization" msgstr "组织" @@ -2019,6 +2023,10 @@ msgstr "" "\"%(user_pubkey_update)s\"> 链接 更新\n" " " +#: templates/_nav.html:7 +msgid "Dashboard" +msgstr "仪表盘" + #: templates/_nav.html:20 msgid "User list" msgstr "用户列表" @@ -2433,11 +2441,11 @@ msgstr "结束日期" msgid "Args" msgstr "参数" -#: tickets/api/request_asset_perm.py:40 +#: tickets/api/request_asset_perm.py:41 msgid "Ticket closed" msgstr "工单已关闭" -#: tickets/api/request_asset_perm.py:43 +#: tickets/api/request_asset_perm.py:44 #, python-format msgid "Ticket has %s" msgstr "工单已%s" @@ -2446,27 +2454,27 @@ msgstr "工单已%s" msgid "Superuser" msgstr "超级管理员" -#: tickets/api/request_asset_perm.py:102 +#: tickets/api/request_asset_perm.py:99 msgid "Confirm assets first" msgstr "请先确认资产" -#: tickets/api/request_asset_perm.py:105 +#: tickets/api/request_asset_perm.py:102 msgid "Confirmed assets changed" msgstr "确认的资产变更了" -#: tickets/api/request_asset_perm.py:109 +#: tickets/api/request_asset_perm.py:106 msgid "Confirm system-user first" msgstr "请先确认系统用户" -#: tickets/api/request_asset_perm.py:113 +#: tickets/api/request_asset_perm.py:110 msgid "Confirmed system-user changed" msgstr "确认的系统用户变更了" -#: tickets/api/request_asset_perm.py:116 xpack/plugins/cloud/models.py:205 +#: tickets/api/request_asset_perm.py:113 xpack/plugins/cloud/models.py:202 msgid "Succeed" msgstr "成功" -#: tickets/api/request_asset_perm.py:124 +#: tickets/api/request_asset_perm.py:121 msgid "{} request assets, approved by {}" msgstr "{} 申请资产,通过人 {}" @@ -2720,7 +2728,7 @@ msgstr "复制用户公钥到这里" msgid "Join user groups" msgstr "添加到用户组" -#: users/forms/user.py:103 users/views/profile/password.py:57 +#: users/forms/user.py:103 users/views/profile/password.py:59 #: users/views/profile/reset.py:123 msgid "* Your password does not meet the requirements" msgstr "* 您的密码不符合要求" @@ -2837,7 +2845,7 @@ msgstr "安全令牌验证" #: users/templates/users/_base_otp.html:14 users/templates/users/_user.html:13 #: users/templates/users/user_profile_update.html:55 -#: xpack/plugins/cloud/models.py:119 +#: xpack/plugins/cloud/models.py:119 xpack/plugins/cloud/serializers.py:81 msgid "Account" msgstr "账户" @@ -3552,27 +3560,27 @@ msgstr "" "
\n" " " -#: users/views/profile/otp.py:145 +#: users/views/profile/otp.py:190 msgid "MFA enable success" msgstr "多因子认证启用成功" -#: users/views/profile/otp.py:146 +#: users/views/profile/otp.py:191 msgid "MFA enable success, return login page" msgstr "多因子认证启用成功,返回到登录页面" -#: users/views/profile/otp.py:148 +#: users/views/profile/otp.py:193 msgid "MFA disable success" msgstr "多因子认证禁用成功" -#: users/views/profile/otp.py:149 +#: users/views/profile/otp.py:194 msgid "MFA disable success, return login page" msgstr "多因子认证禁用成功,返回登录页面" -#: users/views/profile/password.py:41 +#: users/views/profile/password.py:43 msgid "Password update" msgstr "密码更新" -#: users/views/profile/password.py:72 +#: users/views/profile/password.py:74 msgid "Password invalid" msgstr "用户名或密码无效" @@ -3732,55 +3740,55 @@ msgstr "地域" msgid "Instances" msgstr "实例" -#: xpack/plugins/cloud/models.py:136 xpack/plugins/cloud/serializers.py:80 -msgid "Covered always" -msgstr "总是被覆盖" +#: xpack/plugins/cloud/models.py:137 xpack/plugins/cloud/serializers.py:85 +msgid "Always update" +msgstr "总是更新" -#: xpack/plugins/cloud/models.py:142 +#: xpack/plugins/cloud/models.py:143 msgid "Date last sync" msgstr "最后同步日期" -#: xpack/plugins/cloud/models.py:153 xpack/plugins/cloud/models.py:210 +#: xpack/plugins/cloud/models.py:154 xpack/plugins/cloud/models.py:207 msgid "Sync instance task" msgstr "同步实例任务" -#: xpack/plugins/cloud/models.py:220 xpack/plugins/cloud/models.py:275 +#: xpack/plugins/cloud/models.py:217 xpack/plugins/cloud/models.py:272 msgid "Date sync" msgstr "同步日期" -#: xpack/plugins/cloud/models.py:248 +#: xpack/plugins/cloud/models.py:245 msgid "Unsync" msgstr "未同步" -#: xpack/plugins/cloud/models.py:249 xpack/plugins/cloud/models.py:250 +#: xpack/plugins/cloud/models.py:246 xpack/plugins/cloud/models.py:247 msgid "Synced" msgstr "已同步" -#: xpack/plugins/cloud/models.py:251 +#: xpack/plugins/cloud/models.py:248 msgid "Released" msgstr "已释放" -#: xpack/plugins/cloud/models.py:256 +#: xpack/plugins/cloud/models.py:253 msgid "Sync task" msgstr "同步任务" -#: xpack/plugins/cloud/models.py:260 +#: xpack/plugins/cloud/models.py:257 msgid "Sync instance task history" msgstr "同步实例任务历史" -#: xpack/plugins/cloud/models.py:263 +#: xpack/plugins/cloud/models.py:260 msgid "Instance" msgstr "实例" -#: xpack/plugins/cloud/models.py:266 +#: xpack/plugins/cloud/models.py:263 msgid "Region" msgstr "地域" -#: xpack/plugins/cloud/providers/aliyun.py:19 +#: xpack/plugins/cloud/providers/aliyun.py:22 msgid "Alibaba Cloud" msgstr "阿里云" -#: xpack/plugins/cloud/providers/aws.py:15 +#: xpack/plugins/cloud/providers/aws.py:18 msgid "AWS (International)" msgstr "AWS (国际)" @@ -3788,63 +3796,63 @@ msgstr "AWS (国际)" msgid "AWS (China)" msgstr "AWS (中国)" -#: xpack/plugins/cloud/providers/huaweicloud.py:17 +#: xpack/plugins/cloud/providers/huaweicloud.py:20 msgid "Huawei Cloud" msgstr "华为云" -#: xpack/plugins/cloud/providers/huaweicloud.py:20 +#: xpack/plugins/cloud/providers/huaweicloud.py:23 msgid "AF-Johannesburg" msgstr "非洲-约翰内斯堡" -#: xpack/plugins/cloud/providers/huaweicloud.py:21 +#: xpack/plugins/cloud/providers/huaweicloud.py:24 msgid "AP-Bangkok" msgstr "亚太-曼谷" -#: xpack/plugins/cloud/providers/huaweicloud.py:22 +#: xpack/plugins/cloud/providers/huaweicloud.py:25 msgid "AP-Hong Kong" msgstr "亚太-香港" -#: xpack/plugins/cloud/providers/huaweicloud.py:23 +#: xpack/plugins/cloud/providers/huaweicloud.py:26 msgid "AP-Singapore" msgstr "亚太-新加坡" -#: xpack/plugins/cloud/providers/huaweicloud.py:24 +#: xpack/plugins/cloud/providers/huaweicloud.py:27 msgid "CN East-Shanghai1" msgstr "华东-上海1" -#: xpack/plugins/cloud/providers/huaweicloud.py:25 +#: xpack/plugins/cloud/providers/huaweicloud.py:28 msgid "CN East-Shanghai2" msgstr "华东-上海2" -#: xpack/plugins/cloud/providers/huaweicloud.py:26 +#: xpack/plugins/cloud/providers/huaweicloud.py:29 msgid "CN North-Beijing1" msgstr "华北-北京1" -#: xpack/plugins/cloud/providers/huaweicloud.py:27 +#: xpack/plugins/cloud/providers/huaweicloud.py:30 msgid "CN North-Beijing4" msgstr "华北-北京4" -#: xpack/plugins/cloud/providers/huaweicloud.py:28 +#: xpack/plugins/cloud/providers/huaweicloud.py:31 msgid "CN Northeast-Dalian" msgstr "华北-大连" -#: xpack/plugins/cloud/providers/huaweicloud.py:29 +#: xpack/plugins/cloud/providers/huaweicloud.py:32 msgid "CN South-Guangzhou" msgstr "华南-广州" -#: xpack/plugins/cloud/providers/huaweicloud.py:30 +#: xpack/plugins/cloud/providers/huaweicloud.py:33 msgid "CN Southwest-Guiyang1" msgstr "西南-贵阳1" -#: xpack/plugins/cloud/providers/huaweicloud.py:31 +#: xpack/plugins/cloud/providers/huaweicloud.py:34 msgid "EU-Paris" msgstr "欧洲-巴黎" -#: xpack/plugins/cloud/providers/huaweicloud.py:32 +#: xpack/plugins/cloud/providers/huaweicloud.py:35 msgid "LA-Santiago" msgstr "拉美-圣地亚哥" -#: xpack/plugins/cloud/providers/qcloud.py:17 +#: xpack/plugins/cloud/providers/qcloud.py:20 msgid "Tencent Cloud" msgstr "腾讯云" @@ -3856,11 +3864,7 @@ msgstr "执行次数" msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers.py:78 -msgid "Account name" -msgstr "账户名称" - -#: xpack/plugins/cloud/serializers.py:79 +#: xpack/plugins/cloud/serializers.py:84 #: xpack/plugins/gathered_user/serializers.py:20 msgid "Periodic display" msgstr "定时执行" @@ -3949,12 +3953,15 @@ msgstr "企业版" msgid "Ultimate edition" msgstr "旗舰版" +#~ msgid "Covered always" +#~ msgstr "总是被覆盖" + +#~ msgid "Account name" +#~ msgstr "账户名称" + #~ msgid "Auditors cannot be join in the user group" #~ msgstr "审计员不能被加入到用户组" -#~ msgid "Always update" -#~ msgstr "总是更新" - #~ msgid "Target URL" #~ msgstr "目标URL" diff --git a/apps/orgs/api.py b/apps/orgs/api.py index 448c1dab0..d8ba32635 100644 --- a/apps/orgs/api.py +++ b/apps/orgs/api.py @@ -2,6 +2,7 @@ # from django.shortcuts import get_object_or_404 +from django.utils.translation import ugettext as _ from rest_framework import status, generics from rest_framework.views import Response from rest_framework_bulk import BulkModelViewSet @@ -53,10 +54,12 @@ class OrgViewSet(BulkModelViewSet): for model in models: data = self.get_data_from_model(model) if data: - return Response(status=status.HTTP_400_BAD_REQUEST) + msg = _('Organization contains undeleted resources') + return Response(data={'error': msg}, status=status.HTTP_403_FORBIDDEN) else: if str(current_org) == str(self.org): - return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED) + msg = _('The current organization cannot be deleted') + return Response(data={'error': msg}, status=status.HTTP_403_FORBIDDEN) self.org.delete() return Response({'msg': True}, status=status.HTTP_200_OK) From c0f3a1f64a24cbdf7bcc5d79a30618efb471cabc Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 15 Jul 2020 11:33:47 +0800 Subject: [PATCH 15/20] =?UTF-8?q?fix(all):=20=E4=BF=AE=E5=A4=8D=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E8=B5=84=E6=BA=90=E6=97=B6=EF=BC=8Ccreated=5Fby?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=95=BF=E5=BA=A6=E9=99=90=E5=88=B6=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=88=9B=E5=BB=BA=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/settings/signals_handler.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/settings/signals_handler.py b/apps/settings/signals_handler.py index 026d60a78..94c4569bd 100644 --- a/apps/settings/signals_handler.py +++ b/apps/settings/signals_handler.py @@ -43,4 +43,7 @@ def on_create_set_created_by(sender, instance=None, **kwargs): return if hasattr(instance, 'created_by') and not instance.created_by: if current_request and current_request.user.is_authenticated: - instance.created_by = current_request.user.name + user_name = current_request.user.name + if isinstance(user_name, str): + user_name = user_name[:30] + instance.created_by = user_name From 4e933fc1ca8cfa14bb5a6155ca9a42aeb2f0028e Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 15 Jul 2020 17:15:34 +0800 Subject: [PATCH 16/20] =?UTF-8?q?feat(session=20+=20db):=20=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=90=9C=E7=B4=A2=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 55196 -> 55236 bytes apps/locale/zh/LC_MESSAGES/django.po | 9 +++++---- apps/terminal/api/session.py | 2 +- .../migrations/0024_auto_20200715_1713.py | 18 ++++++++++++++++++ apps/terminal/models.py | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 apps/terminal/migrations/0024_auto_20200715_1713.py diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index b90b18ccea08b3ae7f07d47a5c854e9bb250622c..f6e01360c3f187fa16722889b70ab79f800366b6 100644 GIT binary patch delta 15928 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\n" "Language-Team: JumpServer team\n" @@ -2429,6 +2429,10 @@ msgstr "线程数" msgid "Boot Time" msgstr "运行时间" +#: terminal/models.py:191 +msgid "Login from" +msgstr "登录来源" + #: terminal/models.py:195 msgid "Replay" msgstr "回放" @@ -5104,9 +5108,6 @@ msgstr "旗舰版" #~ msgid "There is no command about this session" #~ msgstr "该会话没有命令记录" -#~ msgid "Login from" -#~ msgstr "登录来源" - #~ msgid "Replay session" #~ msgstr "回放会话" diff --git a/apps/terminal/api/session.py b/apps/terminal/api/session.py index f340147c3..bf0a69789 100644 --- a/apps/terminal/api/session.py +++ b/apps/terminal/api/session.py @@ -44,7 +44,7 @@ class SessionViewSet(OrgBulkModelViewSet): permission_classes = (IsOrgAdminOrAppUser, ) filter_fields = [ "user", "asset", "system_user", "remote_addr", - "protocol", "terminal", "is_finished", + "protocol", "terminal", "is_finished", 'login_from', ] date_range_filter_fields = [ ('date_start', ('date_from', 'date_to')) diff --git a/apps/terminal/migrations/0024_auto_20200715_1713.py b/apps/terminal/migrations/0024_auto_20200715_1713.py new file mode 100644 index 000000000..b99ad8d79 --- /dev/null +++ b/apps/terminal/migrations/0024_auto_20200715_1713.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.10 on 2020-07-15 09:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('terminal', '0023_command_risk_level'), + ] + + operations = [ + migrations.AlterField( + model_name='session', + name='login_from', + field=models.CharField(choices=[('ST', 'SSH Terminal'), ('WT', 'Web Terminal')], default='ST', max_length=2, verbose_name='Login from'), + ), + ] diff --git a/apps/terminal/models.py b/apps/terminal/models.py index a2dcbf8e0..f3914cc1c 100644 --- a/apps/terminal/models.py +++ b/apps/terminal/models.py @@ -188,7 +188,7 @@ class Session(OrgModelMixin): asset_id = models.CharField(blank=True, default='', max_length=36, db_index=True) system_user = models.CharField(max_length=128, verbose_name=_("System user"), db_index=True) system_user_id = models.CharField(blank=True, default='', max_length=36, db_index=True) - login_from = models.CharField(max_length=2, choices=LOGIN_FROM_CHOICES, default="ST") + login_from = models.CharField(max_length=2, choices=LOGIN_FROM_CHOICES, default="ST", verbose_name=_("Login from")) remote_addr = models.CharField(max_length=128, verbose_name=_("Remote addr"), blank=True, null=True) is_success = models.BooleanField(default=True, db_index=True) is_finished = models.BooleanField(default=False, db_index=True) From 1f30d459ae5a624b1e6f45d946a839e8bdbf29b1 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 15 Jul 2020 16:55:18 +0800 Subject: [PATCH 17/20] =?UTF-8?q?fix(command):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E8=AE=B0=E5=BD=95=E6=B2=A1=E6=9C=89=E6=A0=B9?= =?UTF-8?q?=E6=8D=AEsesion=E8=BF=9B=E8=A1=8C=E8=BF=87=E6=BB=A4=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/api/command.py | 7 ++++--- apps/terminal/backends/command/base.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/terminal/api/command.py b/apps/terminal/api/command.py index f98fa0e7c..d18c70858 100644 --- a/apps/terminal/api/command.py +++ b/apps/terminal/api/command.py @@ -55,14 +55,15 @@ class CommandQueryMixin: q = self.request.query_params multi_command_storage = get_multi_command_storage() queryset = multi_command_storage.filter( - date_from=date_from, date_to=date_to, input=q.get("input"), - user=q.get("user"), asset=q.get("asset"), - system_user=q.get("system_user"), + date_from=date_from, date_to=date_to, + user=q.get("user"), asset=q.get("asset"), system_user=q.get("system_user"), + input=q.get("input"), session=q.get("session_id"), risk_level=self.get_query_risk_level(), org_id=self.get_org_id(), ) return queryset def filter_queryset(self, queryset): + # 解决es存储命令时,父类根据filter_fields过滤出现异常的问题,返回的queryset类型list return queryset def get_date_range(self): diff --git a/apps/terminal/backends/command/base.py b/apps/terminal/backends/command/base.py index d95697ed0..4bb85e127 100644 --- a/apps/terminal/backends/command/base.py +++ b/apps/terminal/backends/command/base.py @@ -16,7 +16,7 @@ class CommandBase(object): @abc.abstractmethod def filter(self, date_from=None, date_to=None, user=None, asset=None, system_user=None, - input=None, session=None): + input=None, session=None, risk_level=None, org_id=None): pass @abc.abstractmethod From 9488c8bd974ba6de4fae3f1c5bd2b96a0ee1eb67 Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 15 Jul 2020 20:04:46 +0800 Subject: [PATCH 18/20] =?UTF-8?q?fix(cmd=5Ffilter):=20=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8=E5=94=AF=E4=B8=80=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E4=B8=BA=20name=20+=20org=5Fid=20(#4325)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0052_auto_20200715_1535.py | 22 +++++++++++++++++++ apps/assets/models/cmd_filter.py | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 apps/assets/migrations/0052_auto_20200715_1535.py diff --git a/apps/assets/migrations/0052_auto_20200715_1535.py b/apps/assets/migrations/0052_auto_20200715_1535.py new file mode 100644 index 000000000..5903d635e --- /dev/null +++ b/apps/assets/migrations/0052_auto_20200715_1535.py @@ -0,0 +1,22 @@ +# Generated by Django 2.2.10 on 2020-07-15 07:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0051_auto_20200713_1143'), + ] + + operations = [ + migrations.AlterField( + model_name='commandfilter', + name='name', + field=models.CharField(max_length=64, verbose_name='Name'), + ), + migrations.AlterUniqueTogether( + name='commandfilter', + unique_together={('org_id', 'name')}, + ), + ] diff --git a/apps/assets/models/cmd_filter.py b/apps/assets/models/cmd_filter.py index 91febd40b..d7707115d 100644 --- a/apps/assets/models/cmd_filter.py +++ b/apps/assets/models/cmd_filter.py @@ -18,7 +18,7 @@ __all__ = [ class CommandFilter(OrgModelMixin): id = models.UUIDField(default=uuid.uuid4, primary_key=True) - name = models.CharField(max_length=64, unique=True, verbose_name=_("Name")) + name = models.CharField(max_length=64, verbose_name=_("Name")) is_active = models.BooleanField(default=True, verbose_name=_('Is active')) comment = models.TextField(blank=True, default='', verbose_name=_("Comment")) date_created = models.DateTimeField(auto_now_add=True) @@ -29,6 +29,7 @@ class CommandFilter(OrgModelMixin): return self.name class Meta: + unique_together = [('org_id', 'name')] verbose_name = _("Command filter") From 0014bd0cb9653793788d1b7cc7213b294979d4bb Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 15 Jul 2020 20:13:21 +0800 Subject: [PATCH 19/20] =?UTF-8?q?fix(audits):=20=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=AD=E7=9A=84=E5=8A=A8=E4=BD=9C=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=9D=A1=E4=BB=B6=EF=BC=8C=E5=88=A0=E9=99=A4=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AD=97=E6=AE=B5=E6=94=B9=E6=88=90=E5=88=A0=E9=99=A4?= =?UTF-8?q?=20(#4334)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 55236 -> 55230 bytes apps/locale/zh/LC_MESSAGES/django.po | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index f6e01360c3f187fa16722889b70ab79f800366b6..0337649da0092020c18e8181d5235a60bebd6803 100644 GIT binary patch delta 4435 zcmXZfe^l4i9mnxcp(ai;1Ux7rM2d~WH$5pXIChw;94fkV!j)^Dtu~!*GuG0B7Rk4n zXJI;ZtvaIHG&nd@5sSc|C@K}o{KcFccgWUip0;vwPA7F|dffBHef{;g@Ati*_xVghmAu6XFUkAwykpbAgMM4X1Bu?+KZ8ET?>oP_5w7n2&JXc$gJ zT{i<&=ezbtsQSOK6{vB`<4(Mc+R0kfg>QPmF1r_1;HW)r&)9C%br*3gevVpr%I=VV zz&?T*iBUSLOc(3 z{SxOZk@@0LwL9Ll+dQBVv$)_O>Zp29g)X5AUB$cbru*-FCyH(-PPZA@pLi7BiKB5S zPC#8h6^Ao_G?PXxi3OO3gPOvCY&+K8hg0Y;Kppi`=T|yj?RbOZ&8UU%biT#5VjlT+ z9LW696&k5{-2;-|4Nq+~{jZ{)@_J0cw{SSNVm5YT zTu<$F8k%TGb0|C#HEE z;3f&(+q+uAfNZ>%IOg~<)I>kVf%vrZ74{`mo%N3E>~7RE(rQmR{}F2Z7cHE>?!_$< zT0q{O@D>!|B;qnm!&gwR%@!Pw2OVF=3B-we!?*`g{bi0cX|| z--LSoY8|)RPTPeVe*v|TOQ?GPMa`4gO04&P42^UwKoy*Yy6_q2mpgs~RiMss6RJ>~ z?LpPKjyj3tL!nN(9b@lD^%rAY6HRqT8R}_&(s2c9!k17B`n#WsD*Z+K2ZNaEoAu7a9u9yy)HyO z3-j=9T#j1EX4LqtsCw}xcO188P%G<34gA>t$Nm39E%5eZVO$z&T$atZg{VKhrlJ-+ z8&!9nEf2<{Wi+(16?PS>;ClN9)P&pJ--_B!TuA;N$7^goY9WVk zfZqQO8Y*xa^;GxZXzX=9?Y+>SW5=P6ZnEP?Q5*Q7FHChl7Y;M9s4rbs`%u zo%y3}G_;~4sC(6k#dsNYLG1l7L6Mz;3FJ#0m)bJaC-w=)OHd1~#D4f&)WmPtt=RYe zx6sfLA447OdDO&LPz$?(18~3xA)kaJiAOm82CDyI$2064JKsKQ<95vle*bGoXre9d z*pB-B--9{$cbm`=7MP1#KrxQMxv1~QQoI+dF$>>DZRD);7g6=@I3C939q0U~k|-ll zh#T<%Jcs&VB%O$&$1xu>aV6@tt3@5{1=NvV!EC&R`q|Cy^rswkqR-%~xC$5J$Ulb@ zUmtg)4u{dvVozcT@u&C*#!iM4T8x@-Iera)gSvG!I2d=LZpA*-3AN#a_@VO|r^5Ig zOeG&Lppi^tx}A$ERBkI#1*VJmYuJ?a14JDqm3s5^M zcl;~I)uHhc(AV&DJ&$$tqSlyp>~k*I;W zsFRssi|iC!M7{(yQ8Nz3Q>YKq$EZ60MAf;1Gw=qgUdg%eSMqnxasFdSyhuVj+lqDA zf%^4Z^w&_h8WnGHya!e21P;56_Zv0wXXnGjU)Zatg+<-L6ztm=>ZB)h^PSa7A9BY` jRQv?0;51ow4-IlBsNBxdu zWuC(6)UDRhtZ5nsDry<{6GNqjGEqD`dfXwZ)jVzGP6upYGQ3d~PdvO5qRh#rq6ip)@hRQ#RDflZaz#7N9 z9UsGi#-m;hzFQay{26f|Gp0LaAM-@0`PuMf|JnFt4yb-@bHJ-jb z}PvZ1jX(_7G}bJKlh&F#|85PGZoGuuv%`5zln|045Vx zpzg17z8YCC7S(#-EnDviyKw|J97Y{gH>%J@RG}+47~^(^@gdlcILl^ZJn?88gg0Xf z7NPE+hUu&y&Enz>5(_X52RDWZV{N{jfInos73p+o!JEmq zVSm<-E^{#iuX#f1uJF`mpccxt6YUgCAwM1Un$B~+2DP(Q9{&^SDX+s+Y`}DE!I5|# zV|r?@aiN9Mc89__sEHF%`RUHz@Awy(MSd}AhkwR2+=ObZ$@zAB7S&ics@~_ecQ@y+ z8{+na-*zZ!!dT43LdW-`7Wz5%$3@OBwlAXUtaH58?m;~xEwKaeFf6fiBbz zdmMl13E!eR?YB3WW^-*Z>a8fV4?4dP^T}7E7H+W3*w+ARd{QDtJw&|!3 z$tcusemAP2$5Dl|-4 z9Ir*~Y?IxIYUlvogsnIM|Kt3a<}jXzx~~uu_5PQ5U@B%ZFvIZz)WVgv26f{ak8ec1 zep?*3*$#UaHU9!?BNtKi{)bv8c_07u{*U8gI2NM{&PLt%wDZdxzlJKX)$v|bp;p_C zs&fr>62ta~I$3s{orD@M#lFA)(>zd)dfFdzyco6Mi>St4@pu#JgVKTeWAh2B;eiK2 z;S8INdbV=yczYXa{+$One|0j8gdUc;sH2+iiAz0kIqJP%>->7mBHrThqd14S6Z0_t zU=-!xT+~8KQ1e%y8rq6lxA9;sT)a<0J3Zuq4to|=;DY0er~;Qz`KvbRP>6@2PH;48 zBe$X!`jN+H+ec7!7REf`84oDdjW3~o+YKIXLKQxYYV<7X1NBc-BO?xn`|?ol^<>nu zP=VRF4Asac)ckFzda=D8IAPDAIy;Y=_?i8$$FFM%3-w3M%S6o^W5?UcsQ-FRLp3}X zHNV1E24m4uF4Wm_yAoA!oqZE^BHKOQg4$V|{TMa>ipLX=gz>@n1o@jBueNolMvh>D z-v4$kRNyq~sqV(n*z0`e2Vp$dPDCBu6vuN=8~B;yCo!J*S?6PzMEpEzomHq4S&ze6 zKdR?K9UVpeRvkDQFQINIYz+&P*t;-}e3|2!wjA||eb{jos?lov4*n6f@N0G(_Pzhj zThJ$P%)w7>;<3tepxibEM_wx{rJ;xDii3;!BU=vmZ)%kX;q1L~*SfCF$RCg1_o3AN(w__6cZ?O}c{ z4j~^a=Hh!?+-K*Z3RT)_RKZ$I#I=q$*v+U0-tqWB=i5*}Nr&^@_M*pokrRwXSGmxR zQcna&p*k-_{Z{v(8d_w3YhOkk?W>L(Q73rNahL6}U)gJ@4PAedzdL&WQ@Bv#F}nb@ zqe{mwIIcyVz($P6I@GhW!+wEkbW}&!NCB!&3F^Bt%kkr=I#t;B_rJ!8HA*nB-qxcE z?#F!m5cN=f<9z1d!gwyK;6&7dlTjx#6K})$sE2n8s$MJJfu}I0oew(|J}6nJLOH03 zd8qLsTVn6RC&`zg7HYy2>_mN-K10>{7pl%>ychd*hI(aKK>XuQ&VLLS&yw&9!D zj{58O)ag*T78P%FybsmbNgR3|?>B1UFVBR9zqVIUjU{vi)3I-3sFN=0;ybHO@A1Ga rRQxciU Date: Wed, 15 Jul 2020 20:10:47 +0800 Subject: [PATCH 20/20] =?UTF-8?q?fix(users):=20=E7=BB=84=E7=BB=87=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E5=88=9B=E5=BB=BA=E7=94=A8=E6=88=B7=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E8=A7=92=E8=89=B2=E5=8F=AA=E8=83=BD=E9=80=89=E6=8B=A9?= =?UTF-8?q?:=20=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/users/serializers/user.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 351f33337..bebc5042b 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -87,7 +87,11 @@ class UserSerializer(CommonBulkSerializerMixin, serializers.ModelSerializer): if not role: return choices = role._choices - choices.pop('App', None) + choices.pop(User.ROLE_APP, None) + request = self.context.get('request') + if request and hasattr(request, 'user') and not request.user.is_superuser: + choices.pop(User.ROLE_ADMIN, None) + choices.pop(User.ROLE_AUDITOR, None) role._choices = choices def validate_role(self, value):