mirror of https://github.com/jumpserver/jumpserver
Merge branch 'dev' of github.com:jumpserver/jumpserver into dev
commit
fbc948fd7c
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 2.1.7 on 2019-07-16 07:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('assets', '0035_auto_20190711_2018'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='commandfilter',
|
||||
name='name',
|
||||
field=models.CharField(max_length=64, unique=True, verbose_name='Name'),
|
||||
),
|
||||
]
|
|
@ -17,7 +17,7 @@ __all__ = [
|
|||
|
||||
class CommandFilter(OrgModelMixin):
|
||||
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||
name = models.CharField(max_length=64, verbose_name=_("Name"))
|
||||
name = models.CharField(max_length=64, unique=True, 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)
|
||||
|
|
|
@ -112,7 +112,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
|
|||
protocol = protocols_data[0].split('/')
|
||||
validated_data["protocol"] = protocol[0]
|
||||
validated_data["port"] = int(protocol[1])
|
||||
if validated_data:
|
||||
if protocols_data:
|
||||
validated_data["protocols"] = ' '.join(protocols_data)
|
||||
|
||||
def create(self, validated_data):
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
from django.utils.translation import ugettext as _
|
||||
from rest_framework import serializers
|
||||
|
||||
from common.utils import ssh_pubkey_gen, validate_ssh_private_key
|
||||
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ class CommandFilterSerializer(BulkOrgResourceModelSerializer):
|
|||
|
||||
extra_kwargs = {
|
||||
'rules': {'read_only': True},
|
||||
'system_users': {'read_only': True}
|
||||
'system_users': {'required': False},
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -216,6 +216,8 @@ $(document).ready(function () {
|
|||
var form = $("form");
|
||||
var protocols = {};
|
||||
var data = form.serializeObject();
|
||||
objectAttrsIsBool(data, ['is_active']);
|
||||
objectAttrsIsList(data, ['nodes', 'labels']);
|
||||
$.each(data, function (k, v) {
|
||||
if (k.startsWith("form")){
|
||||
delete data[k];
|
||||
|
@ -233,12 +235,6 @@ $(document).ready(function () {
|
|||
return v.name + '/' + v.port
|
||||
});
|
||||
data["protocols"] = protocols;
|
||||
if (typeof data.labels === "string") {
|
||||
data["labels"] = [data["labels"]];
|
||||
}
|
||||
if (typeof data["nodes"] == "string") {
|
||||
data["nodes"] = [data["nodes"]]
|
||||
}
|
||||
var props = {
|
||||
url: the_url,
|
||||
data: data,
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<a class="btn btn-outline btn-default" href="{% url 'assets:cmd-filter-update' pk=object.id %}"><i class="fa fa-edit"></i>{% trans 'Update' %}</a>
|
||||
</li>
|
||||
<li class="pull-right">
|
||||
<a class="btn btn-outline btn-danger btn-del">
|
||||
<a class="btn btn-outline btn-danger btn-del btn-delete-cmd-filter">
|
||||
<i class="fa fa-trash-o"></i>{% trans 'Delete' %}
|
||||
</a>
|
||||
</li>
|
||||
|
@ -164,5 +164,13 @@ $(document).ready(function () {
|
|||
});
|
||||
updateCMDFilterSystemUsers(system_users)
|
||||
})
|
||||
.on('click', '.btn-delete-cmd-filter', function () {
|
||||
var $this = $(this);
|
||||
var name = "{{object.name }}";
|
||||
var uid = "{{ object.id }}";
|
||||
var the_url = '{% url "api-assets:cmd-filter-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid);
|
||||
var redirect_url = "{% url 'assets:cmd-filter-list' %}";
|
||||
objectDelete($this, name, the_url, redirect_url);
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<a class="btn btn-outline btn-default" href="{% url 'assets:domain-update' pk=object.id %}"><i class="fa fa-edit"></i>{% trans 'Update' %}</a>
|
||||
</li>
|
||||
<li class="pull-right">
|
||||
<a class="btn btn-outline btn-danger btn-del">
|
||||
<a class="btn btn-outline btn-danger btn-del btn-delete-domain">
|
||||
<i class="fa fa-trash-o"></i>{% trans 'Delete' %}
|
||||
</a>
|
||||
</li>
|
||||
|
@ -127,6 +127,15 @@ $(document).ready(function(){
|
|||
setTimeout( function () {
|
||||
$data_table.ajax.reload();
|
||||
}, 3000);
|
||||
});
|
||||
})
|
||||
.on('click', '.btn-delete-domain', function () {
|
||||
var $this = $(this);
|
||||
var name = "{{ object.name }}";
|
||||
var uid = "{{ object.id }}";
|
||||
var the_url = '{% url "api-assets:domain-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid);
|
||||
var redirect_url = "{% url 'assets:domain-list' %}";
|
||||
objectDelete($this, name, the_url, redirect_url);
|
||||
})
|
||||
;
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -1,3 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
VERSION = '1.5.1'
|
||||
VERSION = '1.5.2'
|
||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Jumpserver 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-07-15 14:43+0800\n"
|
||||
"POT-Creation-Date: 2019-07-16 17:04+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: Jumpserver team<ibuler@qq.com>\n"
|
||||
|
@ -555,7 +555,7 @@ msgid "Connect"
|
|||
msgstr "连接"
|
||||
|
||||
#: applications/views/remote_app.py:31 applications/views/remote_app.py:47
|
||||
#: applications/views/remote_app.py:69 applications/views/remote_app.py:87
|
||||
#: applications/views/remote_app.py:70 applications/views/remote_app.py:89
|
||||
#: templates/_nav.html:33
|
||||
msgid "Applications"
|
||||
msgstr "应用管理"
|
||||
|
@ -564,15 +564,15 @@ msgstr "应用管理"
|
|||
msgid "RemoteApp list"
|
||||
msgstr "远程应用列表"
|
||||
|
||||
#: applications/views/remote_app.py:70
|
||||
#: applications/views/remote_app.py:71
|
||||
msgid "Update RemoteApp"
|
||||
msgstr "更新远程应用"
|
||||
|
||||
#: applications/views/remote_app.py:88
|
||||
#: applications/views/remote_app.py:90
|
||||
msgid "RemoteApp detail"
|
||||
msgstr "远程应用详情"
|
||||
|
||||
#: applications/views/remote_app.py:100
|
||||
#: applications/views/remote_app.py:102
|
||||
msgid "My RemoteApp"
|
||||
msgstr "我的远程应用"
|
||||
|
||||
|
@ -695,7 +695,7 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域,
|
|||
msgid "Select assets"
|
||||
msgstr "选择资产"
|
||||
|
||||
#: assets/forms/cmd_filter.py:37 assets/serializers/cmd_filter.py:40
|
||||
#: assets/forms/cmd_filter.py:38 assets/serializers/cmd_filter.py:43
|
||||
msgid "Content should not be contain: {}"
|
||||
msgstr "内容不能包含: {}"
|
||||
|
||||
|
@ -1249,86 +1249,86 @@ msgstr "自动登录模式,必须填写用户名"
|
|||
msgid "Password or private key required"
|
||||
msgstr "密码或密钥密码需要一个"
|
||||
|
||||
#: assets/tasks.py:33
|
||||
#: assets/tasks.py:34
|
||||
msgid "Asset has been disabled, skipped: {}"
|
||||
msgstr "资产或许不支持ansible, 跳过: {}"
|
||||
|
||||
#: assets/tasks.py:37
|
||||
#: assets/tasks.py:38
|
||||
msgid "Asset may not be support ansible, skipped: {}"
|
||||
msgstr "资产或许不支持ansible, 跳过: {}"
|
||||
|
||||
#: assets/tasks.py:50
|
||||
#: assets/tasks.py:51
|
||||
msgid "No assets matched, stop task"
|
||||
msgstr "没有匹配到资产,结束任务"
|
||||
|
||||
#: assets/tasks.py:60
|
||||
#: assets/tasks.py:61
|
||||
msgid "No assets matched related system user protocol, stop task"
|
||||
msgstr "没有匹配到与系统用户协议相关的资产,结束任务"
|
||||
|
||||
#: assets/tasks.py:86
|
||||
#: assets/tasks.py:87
|
||||
msgid "Get asset info failed: {}"
|
||||
msgstr "获取资产信息失败:{}"
|
||||
|
||||
#: assets/tasks.py:136
|
||||
#: assets/tasks.py:137
|
||||
msgid "Update some assets hardware info"
|
||||
msgstr "更新资产硬件信息"
|
||||
|
||||
#: assets/tasks.py:153
|
||||
#: assets/tasks.py:154
|
||||
msgid "Update asset hardware info: {}"
|
||||
msgstr "更新资产硬件信息: {}"
|
||||
|
||||
#: assets/tasks.py:178
|
||||
#: assets/tasks.py:179
|
||||
msgid "Test assets connectivity"
|
||||
msgstr "测试资产可连接性"
|
||||
|
||||
#: assets/tasks.py:232
|
||||
#: assets/tasks.py:233
|
||||
msgid "Test assets connectivity: {}"
|
||||
msgstr "测试资产可连接性: {}"
|
||||
|
||||
#: assets/tasks.py:274
|
||||
#: assets/tasks.py:275
|
||||
msgid "Test admin user connectivity period: {}"
|
||||
msgstr "定期测试管理账号可连接性: {}"
|
||||
|
||||
#: assets/tasks.py:281
|
||||
#: assets/tasks.py:282
|
||||
msgid "Test admin user connectivity: {}"
|
||||
msgstr "测试管理行号可连接性: {}"
|
||||
|
||||
#: assets/tasks.py:349
|
||||
#: assets/tasks.py:350
|
||||
msgid "Test system user connectivity: {}"
|
||||
msgstr "测试系统用户可连接性: {}"
|
||||
|
||||
#: assets/tasks.py:356
|
||||
#: assets/tasks.py:357
|
||||
msgid "Test system user connectivity: {} => {}"
|
||||
msgstr "测试系统用户可连接性: {} => {}"
|
||||
|
||||
#: assets/tasks.py:369
|
||||
#: assets/tasks.py:370
|
||||
msgid "Test system user connectivity period: {}"
|
||||
msgstr "定期测试系统用户可连接性: {}"
|
||||
|
||||
#: assets/tasks.py:470 assets/tasks.py:556
|
||||
#: assets/tasks.py:471 assets/tasks.py:557
|
||||
#: xpack/plugins/change_auth_plan/models.py:522
|
||||
msgid "The asset {} system platform {} does not support run Ansible tasks"
|
||||
msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务"
|
||||
|
||||
#: assets/tasks.py:482
|
||||
#: assets/tasks.py:483
|
||||
msgid ""
|
||||
"Push system user task skip, auto push not enable or protocol is not ssh or "
|
||||
"rdp: {}"
|
||||
msgstr "推送系统用户任务跳过,自动推送没有打开,或协议不是ssh或rdp: {}"
|
||||
|
||||
#: assets/tasks.py:489
|
||||
#: assets/tasks.py:490
|
||||
msgid "For security, do not push user {}"
|
||||
msgstr "为了安全,禁止推送用户 {}"
|
||||
|
||||
#: assets/tasks.py:517 assets/tasks.py:531
|
||||
#: assets/tasks.py:518 assets/tasks.py:532
|
||||
msgid "Push system users to assets: {}"
|
||||
msgstr "推送系统用户到入资产: {}"
|
||||
|
||||
#: assets/tasks.py:523
|
||||
#: assets/tasks.py:524
|
||||
msgid "Push system users to asset: {} => {}"
|
||||
msgstr "推送系统用户到入资产: {} => {}"
|
||||
|
||||
#: assets/tasks.py:603
|
||||
#: assets/tasks.py:604
|
||||
msgid "Test asset user connectivity: {}"
|
||||
msgstr "测试资产用户可连接性: {}"
|
||||
|
||||
|
@ -5307,8 +5307,6 @@ msgstr "密码长度"
|
|||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:45
|
||||
#: xpack/plugins/change_auth_plan/models.py:213
|
||||
#, fuzzy
|
||||
#| msgid "For security, do not change {} user's password"
|
||||
msgid "* For security, do not change {} user's password"
|
||||
msgstr "* 为了安全,禁止更改 {} 用户的密码"
|
||||
|
||||
|
@ -5934,9 +5932,6 @@ msgstr "密码匣子"
|
|||
msgid "vault create"
|
||||
msgstr "创建"
|
||||
|
||||
#~ msgid "* For security, please do not change root user's password"
|
||||
#~ msgstr "* 为了安全,请不要更改root用户的密码"
|
||||
|
||||
#~ msgid "Interface"
|
||||
#~ msgstr "界面"
|
||||
|
||||
|
|
|
@ -174,6 +174,8 @@ class GrantAssetsMixin(LabelFilterMixin):
|
|||
system_user = system_users_map.get(sid)
|
||||
if not system_user:
|
||||
continue
|
||||
if not asset.has_protocol(system_user.protocol):
|
||||
continue
|
||||
system_user.actions = action
|
||||
system_users_granted.append(system_user)
|
||||
asset.system_users_granted = system_users_granted
|
||||
|
|
|
@ -256,6 +256,8 @@ class UserGrantedNodesWithAssetsApi(UserPermissionCacheMixin, NodesWithUngroupMi
|
|||
system_user = _system_users_map.get(system_user_id)
|
||||
if not system_user:
|
||||
continue
|
||||
if not asset.has_protocol(system_user.protocol):
|
||||
continue
|
||||
system_user.actions = action
|
||||
system_user_granted.append(system_user)
|
||||
asset.system_users_granted = system_user_granted
|
||||
|
|
|
@ -206,7 +206,7 @@ $(document).ready(function () {
|
|||
})
|
||||
.on('click', '.btn-delete-perm', function () {
|
||||
var $this = $(this);
|
||||
var name = "{{ asset_permission.name }}";
|
||||
var name = "{{ object.name }}";
|
||||
var uid = "{{ object.id }}";
|
||||
var the_url = '{% url "api-perms:asset-permission-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid);
|
||||
var redirect_url = "{% url 'perms:asset-permission-list' %}";
|
||||
|
|
|
@ -499,7 +499,7 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
|
|||
if pattern:
|
||||
assets_ids = Asset.objects.filter(
|
||||
nodes__key__regex=pattern
|
||||
).values_list("id", flat=True).distinct()
|
||||
).valid().values_list("id", flat=True).distinct()
|
||||
else:
|
||||
assets_ids = []
|
||||
self.tree.add_assets_without_system_users(assets_ids)
|
||||
|
@ -523,8 +523,8 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
|
|||
assets_ids = defaultdict(lambda: defaultdict(int))
|
||||
for perm in self.permissions:
|
||||
actions = [perm.actions]
|
||||
_assets_ids = [a.id for a in perm.assets.all()]
|
||||
system_users_ids = [s.id for s in perm.system_users.all()]
|
||||
_assets_ids = perm.assets.valid().values_list("id", flat=True)
|
||||
system_users_ids = perm.system_users.values_list("id", flat=True)
|
||||
iterable = itertools.product(_assets_ids, system_users_ids, actions)
|
||||
for asset_id, sys_id, action in iterable:
|
||||
assets_ids[asset_id][sys_id] |= action
|
||||
|
|
|
@ -1110,6 +1110,7 @@ function objectAttrsIsBool(obj, attrs) {
|
|||
}
|
||||
|
||||
function cleanDate(d) {
|
||||
if (typeof d === 'number'){return d}
|
||||
for (var i=0; i<2; i++) {
|
||||
if (isNaN(Date.parse(d))) {
|
||||
d = d.split('+')[0].trimRight();
|
||||
|
|
Loading…
Reference in New Issue