mirror of https://github.com/jumpserver/jumpserver
Bugfix (#2513)
* [Update] 用户页面添加跳转 * [Update] 网关测试支持nat, 修复创建node等id不能指定的问题, 修复settings频繁redis, 没有has_replay录像不可以播放pull/2525/head
parent
324cf2469f
commit
311538dcf8
|
@ -1,5 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
|
||||
__version__ = "1.4.8"
|
||||
|
|
|
@ -51,9 +51,10 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView):
|
|||
model = Gateway
|
||||
object = None
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = self.get_object(Gateway.objects.all())
|
||||
ok, e = self.object.test_connective()
|
||||
local_port = self.request.data.get('port') or self.object.port
|
||||
ok, e = self.object.test_connective(local_port=local_port)
|
||||
if ok:
|
||||
return Response("ok")
|
||||
else:
|
||||
|
|
|
@ -97,24 +97,12 @@ class AssetBulkUpdateForm(OrgModelForm):
|
|||
}
|
||||
)
|
||||
)
|
||||
port = forms.IntegerField(
|
||||
label=_('Port'), required=False, min_value=1, max_value=65535,
|
||||
)
|
||||
admin_user = forms.ModelChoiceField(
|
||||
required=False, queryset=AdminUser.objects,
|
||||
label=_("Admin user"),
|
||||
widget=forms.Select(
|
||||
attrs={
|
||||
'class': 'select2',
|
||||
'data-placeholder': _('Admin user')
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Asset
|
||||
fields = [
|
||||
'assets', 'port', 'admin_user', 'labels', 'nodes', 'platform'
|
||||
'assets', 'port', 'admin_user', 'labels', 'platform',
|
||||
'protocol', 'domain',
|
||||
]
|
||||
widgets = {
|
||||
'labels': forms.SelectMultiple(
|
||||
|
@ -125,6 +113,13 @@ class AssetBulkUpdateForm(OrgModelForm):
|
|||
),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# 重写其他字段为不再required
|
||||
for name, field in self.fields.items():
|
||||
if name != 'assets':
|
||||
field.required = False
|
||||
|
||||
def save(self, commit=True):
|
||||
changed_fields = []
|
||||
for field in self._meta.fields:
|
||||
|
|
|
@ -66,6 +66,9 @@ class GatewayForm(PasswordAndKeyAuthForm, OrgModelForm):
|
|||
'name', 'ip', 'port', 'username', 'protocol', 'domain', 'password',
|
||||
'private_key_file', 'is_active', 'comment',
|
||||
]
|
||||
help_texts = {
|
||||
'protocol': _("SSH gateway support proxy SSH,RDP,VNC")
|
||||
}
|
||||
widgets = {
|
||||
'name': forms.TextInput(attrs={'placeholder': _('Name')}),
|
||||
'username': forms.TextInput(attrs={'placeholder': _('Username')}),
|
||||
|
|
|
@ -60,7 +60,9 @@ class Gateway(AssetUser):
|
|||
unique_together = [('name', 'org_id')]
|
||||
verbose_name = _("Gateway")
|
||||
|
||||
def test_connective(self):
|
||||
def test_connective(self, local_port=None):
|
||||
if local_port is None:
|
||||
local_port = self.port
|
||||
client = paramiko.SSHClient()
|
||||
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
proxy = paramiko.SSHClient()
|
||||
|
@ -76,12 +78,11 @@ class Gateway(AssetUser):
|
|||
paramiko.SSHException) as e:
|
||||
return False, str(e)
|
||||
|
||||
sock = proxy.get_transport().open_channel(
|
||||
'direct-tcpip', ('127.0.0.1', self.port), ('127.0.0.1', 0)
|
||||
)
|
||||
|
||||
try:
|
||||
client.connect("127.0.0.1", port=self.port,
|
||||
sock = proxy.get_transport().open_channel(
|
||||
'direct-tcpip', ('127.0.0.1', local_port), ('127.0.0.1', 0)
|
||||
)
|
||||
client.connect("127.0.0.1", port=local_port,
|
||||
username=self.username,
|
||||
password=self.password,
|
||||
key_filename=self.private_key_file,
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from rest_framework import serializers
|
||||
from rest_framework_bulk.serializers import BulkListSerializer
|
||||
|
||||
from common.mixins import BulkSerializerMixin
|
||||
from ..models import Asset, Node
|
||||
from .asset import AssetGrantedSerializer
|
||||
|
||||
|
||||
__all__ = [
|
||||
|
@ -22,7 +19,7 @@ class NodeSerializer(serializers.ModelSerializer):
|
|||
'id', 'key', 'value', 'assets_amount', 'org_id',
|
||||
]
|
||||
read_only_fields = [
|
||||
'id', 'key', 'assets_amount', 'org_id',
|
||||
'key', 'assets_amount', 'org_id',
|
||||
]
|
||||
|
||||
def validate_value(self, data):
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
{% extends '_modal.html' %}
|
||||
{% load i18n %}
|
||||
{% block modal_id %}gateway_test{% endblock %}
|
||||
{% block modal_title%}{% trans "Test gateway test connection" %}{% endblock %}
|
||||
{% block modal_body %}
|
||||
{% load bootstrap3 %}
|
||||
<form method="post" class="form-horizontal" action="" id="test_gateway_form" style="padding-top: 10px">
|
||||
<div class="form-group">
|
||||
<input id="gateway_id" name="gateway_id" hidden>
|
||||
<label for="port" class="col-sm-2 control-label">{% trans 'SSH Port' %}</label>
|
||||
<div class="col-sm-9" id="select2-container">
|
||||
<input id="ssh_test_port" name="port" class="form-control">
|
||||
<span class="help-block">{% trans 'If use nat, set the ssh real port' %}</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
{% block modal_confirm_id %}btn_gateway_test{% endblock %}
|
|
@ -15,10 +15,16 @@
|
|||
<div class="panel-options">
|
||||
<ul class="nav nav-tabs">
|
||||
<li>
|
||||
<a href="{% url 'assets:domain-detail' pk=object.id %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
|
||||
<a href="{% url 'assets:domain-detail' pk=object.id %}"
|
||||
class="text-center"><i
|
||||
class="fa fa-laptop"></i> {% trans 'Detail' %}
|
||||
</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a href="{% url 'assets:domain-detail' pk=object.id %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Gateway' %} </a>
|
||||
<a href="{% url 'assets:domain-detail' pk=object.id %}"
|
||||
class="text-center"><i
|
||||
class="fa fa-laptop"></i> {% trans 'Gateway' %}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -33,7 +39,8 @@
|
|||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<a class="dropdown-toggle"
|
||||
data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
|
@ -45,13 +52,17 @@
|
|||
</div>
|
||||
<div class="ibox-content">
|
||||
<div class="uc pull-left m-r-5">
|
||||
<a href="{% url 'assets:domain-gateway-create' pk=object.id %}" class="btn btn-sm btn-primary"> {% trans "Create gateway" %} </a>
|
||||
<a href="{% url 'assets:domain-gateway-create' pk=object.id %}"
|
||||
class="btn btn-sm btn-primary"> {% trans "Create gateway" %} </a>
|
||||
</div>
|
||||
<table class="table table-striped table-bordered table-hover " id="domain_list_table" >
|
||||
<table class="table table-striped table-bordered table-hover "
|
||||
id="domain_list_table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center">
|
||||
<input type="checkbox" id="check_all" class="ipt_check_all" >
|
||||
<input type="checkbox"
|
||||
id="check_all"
|
||||
class="ipt_check_all">
|
||||
</th>
|
||||
<th class="text-center">{% trans 'Name' %}</th>
|
||||
<th class="text-center">{% trans 'IP' %}</th>
|
||||
|
@ -73,6 +84,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% include 'assets/_gateway_test_modal.html' %}
|
||||
{% endblock %}
|
||||
{% block content_bottom_left %}{% endblock %}
|
||||
{% block custom_foot_js %}
|
||||
|
@ -84,7 +96,7 @@ function initTable() {
|
|||
{targets: 7, createdCell: function (td, cellData, rowData) {
|
||||
var update_btn = '<a href="{% url "assets:domain-gateway-update" pk=DEFAULT_PK %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||
var del_btn = '<a class="btn btn-xs btn-danger m-l-xs btn-delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||
var test_btn = '<a class="btn btn-xs btn-warning m-l-xs btn-test" data-uid="{{ DEFAULT_PK }}">{% trans "Test connection" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||
var test_btn = '<a class="btn btn-xs btn-warning m-l-xs btn-test" data-uid="{{ DEFAULT_PK }}" data-port="PORT">{% trans "Test connection" %}</a>'.replace('{{ DEFAULT_PK }}', cellData).replace("PORT", rowData.port);
|
||||
if(rowData.protocol === 'rdp'){
|
||||
test_btn = '<a class="btn btn-xs btn-warning m-l-xs btn-test" disabled data-uid="{{ DEFAULT_PK }}">{% trans "Test connection" %}</a>'.replace('{{ DEFAULT_PK }}', cellData);
|
||||
}
|
||||
|
@ -114,15 +126,21 @@ $(document).ready(function(){
|
|||
$data_table.ajax.reload();
|
||||
}, 3000);
|
||||
}).on('click', '.btn-test', function () {
|
||||
var $this = $(this);
|
||||
var uid = $this.data('uid');
|
||||
$("#ssh_test_port").val($(this).data('port'));
|
||||
$("#gateway_id").val($(this).data('uid'));
|
||||
$("#gateway_test").modal('show');
|
||||
|
||||
}).on('click', '#btn_gateway_test', function () {
|
||||
var data = $("#test_gateway_form").serializeObject();
|
||||
var uid = data.gateway_id;
|
||||
var the_url = '{% url "api-assets:test-gateway-connective" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid);
|
||||
APIUpdateAttr({
|
||||
url: the_url,
|
||||
method: "GET",
|
||||
method: "POST",
|
||||
body: JSON.stringify({'port': parseInt(data.port)}),
|
||||
success_message: "{% trans 'Can be connected' %}",
|
||||
fail_message: "{% trans 'The connection fails' %}"
|
||||
})
|
||||
})
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
<th class="text-center">{% trans 'IP' %}</th>
|
||||
<th class="text-center">{% trans 'Active' %}</th>
|
||||
<th class="text-center">{% trans 'System users' %}</th>
|
||||
<th class="text-center">{% trans 'Action' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -94,13 +95,18 @@ function initTable() {
|
|||
users.push(data.name);
|
||||
});
|
||||
$(td).html(users.join(', '))
|
||||
}},
|
||||
{targets: 5, createdCell: function (td, cellData) {
|
||||
var conn_btn = '<a href="{% url "luna-view" %}?login_to=' + cellData +'" class="btn btn-xs btn-primary">{% trans "Connect" %}</a>'.replace("{{ DEFAULT_PK }}", cellData);
|
||||
$(td).html(conn_btn)
|
||||
}}
|
||||
],
|
||||
ajax_url: url,
|
||||
columns: [
|
||||
{data: "id"}, {data: "hostname" }, {data: "ip" },
|
||||
{data: "is_active", orderable: false },
|
||||
{data: "system_users_granted", orderable: false}
|
||||
{data: "system_users_granted", orderable: false},
|
||||
{data: "id", orderable: false}
|
||||
]
|
||||
};
|
||||
asset_table = jumpserver.initServerSideDataTable(options);
|
||||
|
|
|
@ -22,6 +22,10 @@ from .conf import load_user_config
|
|||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
PROJECT_DIR = os.path.dirname(BASE_DIR)
|
||||
sys.path.append(PROJECT_DIR)
|
||||
from apps import __version__
|
||||
|
||||
VERSION = __version__
|
||||
CONFIG = load_user_config()
|
||||
LOG_DIR = os.path.join(PROJECT_DIR, 'logs')
|
||||
JUMPSERVER_LOG_FILE = os.path.join(LOG_DIR, 'jumpserver.log')
|
||||
|
@ -456,8 +460,8 @@ CELERY_ACCEPT_CONTENT = ['json', 'pickle']
|
|||
CELERY_RESULT_EXPIRES = 3600
|
||||
# CELERY_WORKER_LOG_FORMAT = '%(asctime)s [%(module)s %(levelname)s] %(message)s'
|
||||
# CELERY_WORKER_LOG_FORMAT = '%(message)s'
|
||||
CELERY_WORKER_TASK_LOG_FORMAT = '%(task_id)s %(task_name)s %(message)s'
|
||||
# CELERY_WORKER_TASK_LOG_FORMAT = '%(message)s'
|
||||
# CELERY_WORKER_TASK_LOG_FORMAT = '%(task_id)s %(task_name)s %(message)s'
|
||||
CELERY_WORKER_TASK_LOG_FORMAT = '%(message)s'
|
||||
# CELERY_WORKER_LOG_FORMAT = '%(asctime)s [%(module)s %(levelname)s] %(message)s'
|
||||
CELERY_WORKER_LOG_FORMAT = '%(message)s'
|
||||
CELERY_TASK_EAGER_PROPAGATES = True
|
||||
|
|
|
@ -60,7 +60,7 @@ urlpatterns = [
|
|||
path('', IndexView.as_view(), name='index'),
|
||||
path('', include(api_v2_patterns)),
|
||||
path('', include(api_v1_patterns)),
|
||||
path('luna/', LunaView.as_view(), name='luna-error'),
|
||||
path('luna/', LunaView.as_view(), name='luna-view'),
|
||||
path('i18n/<str:lang>/', I18NView.as_view(), name='i18n-switch'),
|
||||
path('settings/', include('settings.urls.view_urls', namespace='settings')),
|
||||
# path('api/v2/', include(api_v2_patterns)),
|
||||
|
|
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-03-18 10:49+0800\n"
|
||||
"POT-Creation-Date: 2019-03-19 14:59+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"
|
||||
|
@ -36,8 +36,7 @@ msgstr "测试节点下资产是否可连接: {}"
|
|||
msgid "Nodes"
|
||||
msgstr "节点管理"
|
||||
|
||||
#: assets/forms/asset.py:30 assets/forms/asset.py:66 assets/forms/asset.py:105
|
||||
#: assets/forms/asset.py:109 assets/models/asset.py:84
|
||||
#: assets/forms/asset.py:30 assets/forms/asset.py:66 assets/models/asset.py:84
|
||||
#: assets/models/cluster.py:19 assets/models/user.py:91
|
||||
#: assets/templates/assets/asset_detail.html:80 templates/_nav.html:24
|
||||
#: xpack/plugins/cloud/models.py:124
|
||||
|
@ -46,7 +45,7 @@ msgstr "节点管理"
|
|||
msgid "Admin user"
|
||||
msgstr "管理用户"
|
||||
|
||||
#: assets/forms/asset.py:33 assets/forms/asset.py:69 assets/forms/asset.py:121
|
||||
#: assets/forms/asset.py:33 assets/forms/asset.py:69 assets/forms/asset.py:109
|
||||
#: assets/templates/assets/asset_create.html:36
|
||||
#: assets/templates/assets/asset_create.html:38
|
||||
#: assets/templates/assets/asset_list.html:81
|
||||
|
@ -60,13 +59,13 @@ msgstr "标签"
|
|||
#: assets/forms/asset.py:37 assets/forms/asset.py:73 assets/models/asset.py:79
|
||||
#: assets/models/domain.py:26 assets/models/domain.py:52
|
||||
#: assets/templates/assets/asset_detail.html:84
|
||||
#: assets/templates/assets/user_asset_list.html:163
|
||||
#: assets/templates/assets/user_asset_list.html:169
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:17
|
||||
msgid "Domain"
|
||||
msgstr "网域"
|
||||
|
||||
#: assets/forms/asset.py:41 assets/forms/asset.py:63 assets/forms/asset.py:77
|
||||
#: assets/forms/asset.py:124 assets/models/node.py:31
|
||||
#: assets/forms/asset.py:112 assets/models/node.py:31
|
||||
#: assets/templates/assets/asset_create.html:30
|
||||
#: assets/templates/assets/asset_update.html:35 perms/forms.py:45
|
||||
#: perms/forms.py:52 perms/models.py:84
|
||||
|
@ -102,16 +101,6 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域,
|
|||
msgid "Select assets"
|
||||
msgstr "选择资产"
|
||||
|
||||
#: assets/forms/asset.py:101 assets/models/asset.py:77
|
||||
#: assets/models/domain.py:50 assets/templates/assets/admin_user_assets.html:50
|
||||
#: assets/templates/assets/asset_detail.html:72
|
||||
#: assets/templates/assets/domain_gateway_list.html:58
|
||||
#: assets/templates/assets/system_user_asset.html:52
|
||||
#: assets/templates/assets/user_asset_list.html:158
|
||||
#: settings/templates/settings/replay_storage_create.html:59
|
||||
msgid "Port"
|
||||
msgstr "端口"
|
||||
|
||||
#: assets/forms/domain.py:15 assets/forms/label.py:13
|
||||
#: assets/models/asset.py:279 assets/models/authbook.py:27
|
||||
#: assets/templates/assets/admin_user_list.html:28
|
||||
|
@ -140,7 +129,11 @@ msgstr "资产"
|
|||
msgid "Password should not contain special characters"
|
||||
msgstr "不能包含特殊字符"
|
||||
|
||||
#: assets/forms/domain.py:70 assets/forms/user.py:84 assets/forms/user.py:146
|
||||
#: assets/forms/domain.py:70
|
||||
msgid "SSH gateway support proxy SSH,RDP,VNC"
|
||||
msgstr "SSH网关,支持代理SSH,RDP和VNC"
|
||||
|
||||
#: assets/forms/domain.py:73 assets/forms/user.py:84 assets/forms/user.py:146
|
||||
#: assets/models/base.py:26 assets/models/cluster.py:18
|
||||
#: assets/models/cmd_filter.py:20 assets/models/domain.py:20
|
||||
#: assets/models/group.py:20 assets/models/label.py:18
|
||||
|
@ -149,7 +142,7 @@ msgstr "不能包含特殊字符"
|
|||
#: assets/templates/assets/cmd_filter_detail.html:61
|
||||
#: assets/templates/assets/cmd_filter_list.html:24
|
||||
#: assets/templates/assets/domain_detail.html:56
|
||||
#: assets/templates/assets/domain_gateway_list.html:56
|
||||
#: assets/templates/assets/domain_gateway_list.html:67
|
||||
#: assets/templates/assets/domain_list.html:25
|
||||
#: assets/templates/assets/label_list.html:14
|
||||
#: assets/templates/assets/system_user_detail.html:58
|
||||
|
@ -183,13 +176,13 @@ msgstr "不能包含特殊字符"
|
|||
msgid "Name"
|
||||
msgstr "名称"
|
||||
|
||||
#: assets/forms/domain.py:71 assets/forms/user.py:85 assets/forms/user.py:147
|
||||
#: assets/forms/domain.py:74 assets/forms/user.py:85 assets/forms/user.py:147
|
||||
#: assets/models/base.py:27
|
||||
#: assets/templates/assets/_asset_user_auth_modal.html:15
|
||||
#: assets/templates/assets/admin_user_detail.html:60
|
||||
#: assets/templates/assets/admin_user_list.html:27
|
||||
#: assets/templates/assets/asset_asset_user_list.html:48
|
||||
#: assets/templates/assets/domain_gateway_list.html:60
|
||||
#: assets/templates/assets/domain_gateway_list.html:71
|
||||
#: assets/templates/assets/system_user_detail.html:62
|
||||
#: assets/templates/assets/system_user_list.html:30 audits/models.py:93
|
||||
#: audits/templates/audits/login_log_list.html:49 authentication/forms.py:11
|
||||
|
@ -273,10 +266,10 @@ msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig"
|
|||
#: assets/templates/assets/admin_user_assets.html:49
|
||||
#: assets/templates/assets/asset_detail.html:64
|
||||
#: assets/templates/assets/asset_list.html:93
|
||||
#: assets/templates/assets/domain_gateway_list.html:57
|
||||
#: assets/templates/assets/domain_gateway_list.html:68
|
||||
#: assets/templates/assets/system_user_asset.html:51
|
||||
#: assets/templates/assets/user_asset_list.html:45
|
||||
#: assets/templates/assets/user_asset_list.html:157
|
||||
#: assets/templates/assets/user_asset_list.html:163
|
||||
#: audits/templates/audits/login_log_list.html:52
|
||||
#: perms/templates/perms/asset_permission_asset.html:55 settings/forms.py:133
|
||||
#: users/templates/users/user_granted_asset.html:45
|
||||
|
@ -291,7 +284,7 @@ msgstr "IP"
|
|||
#: assets/templates/assets/asset_list.html:92
|
||||
#: assets/templates/assets/system_user_asset.html:50
|
||||
#: assets/templates/assets/user_asset_list.html:44
|
||||
#: assets/templates/assets/user_asset_list.html:156
|
||||
#: assets/templates/assets/user_asset_list.html:162
|
||||
#: perms/templates/perms/asset_permission_asset.html:54
|
||||
#: perms/templates/perms/asset_permission_list.html:77 settings/forms.py:132
|
||||
#: users/templates/users/user_granted_asset.html:44
|
||||
|
@ -301,23 +294,33 @@ msgstr "主机名"
|
|||
|
||||
#: assets/models/asset.py:76 assets/models/domain.py:51
|
||||
#: assets/models/user.py:136 assets/templates/assets/asset_detail.html:76
|
||||
#: assets/templates/assets/domain_gateway_list.html:59
|
||||
#: assets/templates/assets/domain_gateway_list.html:70
|
||||
#: assets/templates/assets/system_user_detail.html:70
|
||||
#: assets/templates/assets/system_user_list.html:31
|
||||
#: assets/templates/assets/user_asset_list.html:159
|
||||
#: assets/templates/assets/user_asset_list.html:165
|
||||
#: terminal/templates/terminal/session_list.html:75
|
||||
msgid "Protocol"
|
||||
msgstr "协议"
|
||||
|
||||
#: assets/models/asset.py:77 assets/models/domain.py:50
|
||||
#: assets/templates/assets/admin_user_assets.html:50
|
||||
#: assets/templates/assets/asset_detail.html:72
|
||||
#: assets/templates/assets/domain_gateway_list.html:69
|
||||
#: assets/templates/assets/system_user_asset.html:52
|
||||
#: assets/templates/assets/user_asset_list.html:164
|
||||
#: settings/templates/settings/replay_storage_create.html:59
|
||||
msgid "Port"
|
||||
msgstr "端口"
|
||||
|
||||
#: assets/models/asset.py:78 assets/templates/assets/asset_detail.html:108
|
||||
#: assets/templates/assets/user_asset_list.html:160
|
||||
#: assets/templates/assets/user_asset_list.html:166
|
||||
msgid "Platform"
|
||||
msgstr "系统平台"
|
||||
|
||||
#: assets/models/asset.py:81 assets/models/cmd_filter.py:21
|
||||
#: assets/models/domain.py:54 assets/models/label.py:22
|
||||
#: assets/templates/assets/asset_detail.html:116
|
||||
#: assets/templates/assets/user_asset_list.html:164
|
||||
#: assets/templates/assets/user_asset_list.html:170
|
||||
msgid "Is active"
|
||||
msgstr "激活"
|
||||
|
||||
|
@ -371,7 +374,7 @@ msgid "Disk info"
|
|||
msgstr "硬盘信息"
|
||||
|
||||
#: assets/models/asset.py:103 assets/templates/assets/asset_detail.html:112
|
||||
#: assets/templates/assets/user_asset_list.html:161
|
||||
#: assets/templates/assets/user_asset_list.html:167
|
||||
msgid "OS"
|
||||
msgstr "操作系统"
|
||||
|
||||
|
@ -437,11 +440,11 @@ msgstr "创建日期"
|
|||
#: assets/templates/assets/cmd_filter_list.html:27
|
||||
#: assets/templates/assets/cmd_filter_rule_list.html:62
|
||||
#: assets/templates/assets/domain_detail.html:76
|
||||
#: assets/templates/assets/domain_gateway_list.html:61
|
||||
#: assets/templates/assets/domain_gateway_list.html:72
|
||||
#: assets/templates/assets/domain_list.html:28
|
||||
#: assets/templates/assets/system_user_detail.html:104
|
||||
#: assets/templates/assets/system_user_list.html:37
|
||||
#: assets/templates/assets/user_asset_list.html:165 ops/models/adhoc.py:43
|
||||
#: assets/templates/assets/user_asset_list.html:171 ops/models/adhoc.py:43
|
||||
#: orgs/models.py:17 perms/models.py:38 perms/models.py:91
|
||||
#: perms/templates/perms/asset_permission_detail.html:102 settings/models.py:34
|
||||
#: terminal/models.py:32 terminal/templates/terminal/terminal_detail.html:63
|
||||
|
@ -625,11 +628,12 @@ msgstr "每行一个命令"
|
|||
#: assets/templates/assets/asset_list.html:96
|
||||
#: assets/templates/assets/cmd_filter_list.html:28
|
||||
#: assets/templates/assets/cmd_filter_rule_list.html:63
|
||||
#: assets/templates/assets/domain_gateway_list.html:62
|
||||
#: assets/templates/assets/domain_gateway_list.html:73
|
||||
#: assets/templates/assets/domain_list.html:29
|
||||
#: assets/templates/assets/label_list.html:17
|
||||
#: assets/templates/assets/system_user_asset.html:54
|
||||
#: assets/templates/assets/system_user_list.html:38 audits/models.py:37
|
||||
#: assets/templates/assets/system_user_list.html:38
|
||||
#: assets/templates/assets/user_asset_list.html:48 audits/models.py:37
|
||||
#: audits/templates/audits/operate_log_list.html:41
|
||||
#: audits/templates/audits/operate_log_list.html:67
|
||||
#: ops/templates/ops/adhoc_history.html:59 ops/templates/ops/task_adhoc.html:64
|
||||
|
@ -653,7 +657,7 @@ msgstr "命令过滤规则"
|
|||
|
||||
#: assets/models/domain.py:61 assets/templates/assets/domain_detail.html:21
|
||||
#: assets/templates/assets/domain_detail.html:64
|
||||
#: assets/templates/assets/domain_gateway_list.html:21
|
||||
#: assets/templates/assets/domain_gateway_list.html:26
|
||||
#: assets/templates/assets/domain_list.html:27
|
||||
msgid "Gateway"
|
||||
msgstr "网关"
|
||||
|
@ -760,7 +764,7 @@ msgstr "Shell"
|
|||
msgid "Login mode"
|
||||
msgstr "登录模式"
|
||||
|
||||
#: assets/models/user.py:247 assets/templates/assets/user_asset_list.html:162
|
||||
#: assets/models/user.py:247 assets/templates/assets/user_asset_list.html:168
|
||||
#: audits/models.py:19 audits/templates/audits/ftp_log_list.html:49
|
||||
#: audits/templates/audits/ftp_log_list.html:72 perms/forms.py:48
|
||||
#: perms/models.py:32 perms/models.py:86
|
||||
|
@ -923,6 +927,18 @@ msgstr "更新资产用户认证信息"
|
|||
msgid "Please input password"
|
||||
msgstr "请输入密码"
|
||||
|
||||
#: assets/templates/assets/_gateway_test_modal.html:4
|
||||
msgid "Test gateway test connection"
|
||||
msgstr "测试连接网关"
|
||||
|
||||
#: assets/templates/assets/_gateway_test_modal.html:10 terminal/models.py:24
|
||||
msgid "SSH Port"
|
||||
msgstr "SSH端口"
|
||||
|
||||
#: assets/templates/assets/_gateway_test_modal.html:13
|
||||
msgid "If use nat, set the ssh real port"
|
||||
msgstr "如果使用了nat端口映射,请设置为ssh真实监听的端口"
|
||||
|
||||
#: assets/templates/assets/_system_user.html:37
|
||||
#: assets/templates/assets/asset_create.html:16
|
||||
#: assets/templates/assets/asset_update.html:21
|
||||
|
@ -1034,7 +1050,7 @@ msgstr "关闭"
|
|||
#: assets/templates/assets/cmd_filter_detail.html:19
|
||||
#: assets/templates/assets/cmd_filter_rule_list.html:19
|
||||
#: assets/templates/assets/domain_detail.html:18
|
||||
#: assets/templates/assets/domain_gateway_list.html:18
|
||||
#: assets/templates/assets/domain_gateway_list.html:20
|
||||
#: assets/templates/assets/system_user_asset.html:18
|
||||
#: assets/templates/assets/system_user_detail.html:18
|
||||
#: ops/templates/ops/adhoc_history.html:130
|
||||
|
@ -1111,7 +1127,7 @@ msgstr "更新失败"
|
|||
#: assets/templates/assets/cmd_filter_rule_list.html:86
|
||||
#: assets/templates/assets/domain_detail.html:24
|
||||
#: assets/templates/assets/domain_detail.html:103
|
||||
#: assets/templates/assets/domain_gateway_list.html:85
|
||||
#: assets/templates/assets/domain_gateway_list.html:97
|
||||
#: assets/templates/assets/domain_list.html:53
|
||||
#: assets/templates/assets/label_list.html:38
|
||||
#: assets/templates/assets/system_user_detail.html:26
|
||||
|
@ -1143,7 +1159,7 @@ msgstr "更新"
|
|||
#: assets/templates/assets/cmd_filter_rule_list.html:87
|
||||
#: assets/templates/assets/domain_detail.html:28
|
||||
#: assets/templates/assets/domain_detail.html:104
|
||||
#: assets/templates/assets/domain_gateway_list.html:86
|
||||
#: assets/templates/assets/domain_gateway_list.html:98
|
||||
#: assets/templates/assets/domain_list.html:54
|
||||
#: assets/templates/assets/label_list.html:39
|
||||
#: assets/templates/assets/system_user_detail.html:30
|
||||
|
@ -1518,27 +1534,27 @@ msgstr "确认删除"
|
|||
msgid "Are you sure delete"
|
||||
msgstr "您确定删除吗?"
|
||||
|
||||
#: assets/templates/assets/domain_gateway_list.html:31
|
||||
#: assets/templates/assets/domain_gateway_list.html:37
|
||||
msgid "Gateway list"
|
||||
msgstr "网关列表"
|
||||
|
||||
#: assets/templates/assets/domain_gateway_list.html:48
|
||||
#: assets/templates/assets/domain_gateway_list.html:56
|
||||
#: assets/views/domain.py:127
|
||||
msgid "Create gateway"
|
||||
msgstr "创建网关"
|
||||
|
||||
#: assets/templates/assets/domain_gateway_list.html:87
|
||||
#: assets/templates/assets/domain_gateway_list.html:89
|
||||
#: assets/templates/assets/domain_gateway_list.html:99
|
||||
#: assets/templates/assets/domain_gateway_list.html:101
|
||||
#: settings/templates/settings/email_setting.html:61
|
||||
#: settings/templates/settings/ldap_setting.html:61
|
||||
msgid "Test connection"
|
||||
msgstr "测试连接"
|
||||
|
||||
#: assets/templates/assets/domain_gateway_list.html:123
|
||||
#: assets/templates/assets/domain_gateway_list.html:141
|
||||
msgid "Can be connected"
|
||||
msgstr "可连接"
|
||||
|
||||
#: assets/templates/assets/domain_gateway_list.html:124
|
||||
#: assets/templates/assets/domain_gateway_list.html:142
|
||||
msgid "The connection fails"
|
||||
msgstr "连接失败"
|
||||
|
||||
|
@ -1651,6 +1667,10 @@ msgstr "删除系统用户"
|
|||
msgid "System Users Deleting failed."
|
||||
msgstr "系统用户删除失败"
|
||||
|
||||
#: assets/templates/assets/user_asset_list.html:100
|
||||
msgid "Connect"
|
||||
msgstr "连接"
|
||||
|
||||
#: assets/views/admin_user.py:30
|
||||
msgid "Admin user list"
|
||||
msgstr "管理用户列表"
|
||||
|
@ -3431,10 +3451,6 @@ msgstr ""
|
|||
msgid "Remote Address"
|
||||
msgstr "远端地址"
|
||||
|
||||
#: terminal/models.py:24
|
||||
msgid "SSH Port"
|
||||
msgstr "SSH端口"
|
||||
|
||||
#: terminal/models.py:25
|
||||
msgid "HTTP Port"
|
||||
msgstr "HTTP端口"
|
||||
|
@ -4624,7 +4640,7 @@ msgstr "选择管理员"
|
|||
#: xpack/plugins/cloud/views.py:41 xpack/plugins/cloud/views.py:57
|
||||
#: xpack/plugins/cloud/views.py:71 xpack/plugins/cloud/views.py:84
|
||||
#: xpack/plugins/cloud/views.py:100 xpack/plugins/cloud/views.py:121
|
||||
#: xpack/plugins/cloud/views.py:136 xpack/plugins/cloud/views.py:179
|
||||
#: xpack/plugins/cloud/views.py:136 xpack/plugins/cloud/views.py:187
|
||||
msgid "Cloud center"
|
||||
msgstr "云管中心"
|
||||
|
||||
|
@ -4755,7 +4771,7 @@ msgstr "同步历史列表"
|
|||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:28
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:31
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:29
|
||||
#: xpack/plugins/cloud/views.py:180
|
||||
#: xpack/plugins/cloud/views.py:188
|
||||
msgid "Sync instance list"
|
||||
msgstr "同步实例列表"
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ class CommandExecution(models.Model):
|
|||
|
||||
@property
|
||||
def inventory(self):
|
||||
return JMSInventory(self.hosts.all(), run_as=self.run_as)
|
||||
return JMSInventory(self.hosts.all(), run_as=self.run_as.username)
|
||||
|
||||
@property
|
||||
def result(self):
|
||||
|
|
|
@ -75,7 +75,7 @@ class CommandExecutionSerializer(serializers.ModelSerializer):
|
|||
'is_finished', 'date_created', 'date_finished'
|
||||
]
|
||||
read_only_fields = [
|
||||
'id', 'result', 'is_finished', 'log_url', 'date_created',
|
||||
'result', 'is_finished', 'log_url', 'date_created',
|
||||
'date_finished'
|
||||
]
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ class OrgSerializer(ModelSerializer):
|
|||
model = Organization
|
||||
list_serializer_class = BulkListSerializer
|
||||
fields = '__all__'
|
||||
read_only_fields = ['id', 'created_by', 'date_created']
|
||||
read_only_fields = ['created_by', 'date_created']
|
||||
|
||||
|
||||
class OrgReadSerializer(ModelSerializer):
|
||||
|
|
|
@ -4,7 +4,7 @@ import json
|
|||
|
||||
from django.dispatch import receiver
|
||||
from django.db.models.signals import post_save, pre_save
|
||||
from django.conf import LazySettings, empty
|
||||
from django.conf import LazySettings, empty, global_settings
|
||||
from django.db.utils import ProgrammingError, OperationalError
|
||||
from django.core.cache import cache
|
||||
|
||||
|
@ -25,11 +25,18 @@ def refresh_settings_on_changed(sender, instance=None, **kwargs):
|
|||
@receiver(django_ready, dispatch_uid="my_unique_identifier")
|
||||
def monkey_patch_settings(sender, **kwargs):
|
||||
cache_key_prefix = '_SETTING_'
|
||||
uncached_settings = [
|
||||
'CACHES', 'DEBUG', 'SECRET_KEY', 'INSTALLED_APPS',
|
||||
'ROOT_URLCONF', 'TEMPLATES', 'DATABASES', '_wrapped',
|
||||
'CELERY_LOG_DIR'
|
||||
custom_need_cache_settings = [
|
||||
'AUTHENTICATION_BACKENDS'
|
||||
]
|
||||
custom_no_cache_settings = [
|
||||
'BASE_DIR', 'VERSION', 'AUTH_OPENID'
|
||||
]
|
||||
django_settings = dir(global_settings)
|
||||
uncached_settings = [i for i in django_settings if i.isupper()]
|
||||
uncached_settings = [i for i in uncached_settings if not i.startswith('EMAIL')]
|
||||
uncached_settings = [i for i in uncached_settings if not i.startswith('SESSION_REDIS')]
|
||||
uncached_settings = [i for i in uncached_settings if i not in custom_need_cache_settings]
|
||||
uncached_settings.extend(custom_no_cache_settings)
|
||||
|
||||
def monkey_patch_getattr(self, name):
|
||||
if name not in uncached_settings:
|
||||
|
|
|
@ -188,6 +188,14 @@ class Session(OrgModelMixin):
|
|||
local_path = rel_path
|
||||
return local_path
|
||||
|
||||
def can_replay(self):
|
||||
if self.has_replay:
|
||||
return True
|
||||
version = settings.VERSION.split('.')
|
||||
if [int(i) for i in version] > [1, 4, 8]:
|
||||
return False
|
||||
return True
|
||||
|
||||
def save_to_storage(self, f):
|
||||
local_path = self.get_local_path()
|
||||
try:
|
||||
|
|
|
@ -21,7 +21,7 @@ class TerminalSerializer(serializers.ModelSerializer):
|
|||
'replay_storage', 'user', 'is_accepted', 'is_deleted',
|
||||
'date_created', 'comment'
|
||||
]
|
||||
read_only_fields = ['id', 'remote_addr', 'user', 'date_created']
|
||||
read_only_fields = ['remote_addr', 'user', 'date_created']
|
||||
|
||||
def is_valid(self, raise_exception=False):
|
||||
valid = super().is_valid(raise_exception=raise_exception)
|
||||
|
|
|
@ -101,9 +101,8 @@
|
|||
<td class="text-center">{{ session.date_start|time_util_with_seconds:session.date_end }}</td>
|
||||
<td>
|
||||
{% if session.is_finished %}
|
||||
<a onclick="window.open('/luna/replay/{{ session.id }}','luna', 'height=600, width=800, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, location=no, status=no')" class="btn btn-xs btn-warning btn-replay" >{% trans "Replay" %}</a>
|
||||
<a {% if not session.can_replay %} disabled="" {% endif %} onclick="window.open('/luna/replay/{{ session.id }}','luna', 'height=600, width=800, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, location=no, status=no')" class="btn btn-xs btn-warning btn-replay" >{% trans "Replay" %}</a>
|
||||
{% else %}
|
||||
<!--<a onclick="window.open('/luna/monitor/{{ session.id }}','luna', 'height=600, width=800, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, location=no, status=no')" class="btn btn-xs btn-warning btn-monitor" >{% trans "Monitor" %}</a>-->
|
||||
{% if session.protocol == 'ssh' %}
|
||||
<a class="btn btn-xs btn-danger btn-term" value="{{ session.id }}" terminal="{{ session.terminal.id }}" >{% trans "Terminate" %}</a>
|
||||
{% else %}
|
||||
|
|
|
@ -54,7 +54,7 @@ class UserGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer):
|
|||
model = UserGroup
|
||||
list_serializer_class = BulkListSerializer
|
||||
fields = '__all__'
|
||||
read_only_fields = ['id', 'created_by']
|
||||
read_only_fields = ['created_by']
|
||||
|
||||
@staticmethod
|
||||
def get_users(obj):
|
||||
|
|
|
@ -15,7 +15,7 @@ class ServiceAccountSerializer(serializers.ModelSerializer):
|
|||
class Meta:
|
||||
model = User
|
||||
fields = ['id', 'name', 'access_key']
|
||||
read_only_fields = ['id', 'access_key']
|
||||
read_only_fields = ['access_key']
|
||||
|
||||
def get_username(self):
|
||||
return self.initial_data.get('name')
|
||||
|
|
Loading…
Reference in New Issue