mirror of https://github.com/jumpserver/jumpserver
commit
dbc2779b34
|
@ -77,6 +77,10 @@
|
||||||
<td>{% trans 'Admin user' %}:</td>
|
<td>{% trans 'Admin user' %}:</td>
|
||||||
<td><b>{{ asset.admin_user }}</b></td>
|
<td><b>{{ asset.admin_user }}</b></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{% trans 'Domain' %}:</td>
|
||||||
|
<td><b>{{ asset.domain|default:"" }}</b></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{% trans 'Vendor' %}:</td>
|
<td>{% trans 'Vendor' %}:</td>
|
||||||
<td><b>{{ asset.vendor|default:"" }}</b></td>
|
<td><b>{{ asset.vendor|default:"" }}</b></td>
|
||||||
|
|
|
@ -171,7 +171,7 @@ function initResultTerminal() {
|
||||||
cursorBlink: false,
|
cursorBlink: false,
|
||||||
screenKeys: false,
|
screenKeys: false,
|
||||||
fontFamily: '"Monaco", "Consolas", "monospace"',
|
fontFamily: '"Monaco", "Consolas", "monospace"',
|
||||||
fontSize: 12,
|
fontSize: 13,
|
||||||
rightClickSelectsWord: true,
|
rightClickSelectsWord: true,
|
||||||
disableStdin: true,
|
disableStdin: true,
|
||||||
theme: {
|
theme: {
|
||||||
|
@ -182,6 +182,10 @@ function initResultTerminal() {
|
||||||
term.write("选择左侧资产, 选择运行的系统用户,批量执行命令\r\n")
|
term.write("选择左侧资产, 选择运行的系统用户,批量执行命令\r\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function wrapperError(msg) {
|
||||||
|
return '\033[31m' + msg + '\033[0m' + '\r\n';
|
||||||
|
}
|
||||||
|
|
||||||
function execute() {
|
function execute() {
|
||||||
if (!term) {
|
if (!term) {
|
||||||
initResultTerminal()
|
initResultTerminal()
|
||||||
|
@ -192,6 +196,18 @@ function execute() {
|
||||||
var hosts = getSelectedAssetsNode().map(function (node) {
|
var hosts = getSelectedAssetsNode().map(function (node) {
|
||||||
return node.id;
|
return node.id;
|
||||||
});
|
});
|
||||||
|
if (hosts.length === 0) {
|
||||||
|
term.write(wrapperError('没有选中资产'));
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!command) {
|
||||||
|
term.write(wrapperError('没有输入命令'));
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!run_as) {
|
||||||
|
term.write(wrapperError('没有选择运行用户'));
|
||||||
|
return
|
||||||
|
}
|
||||||
var data = {
|
var data = {
|
||||||
hosts: hosts,
|
hosts: hosts,
|
||||||
run_as: run_as,
|
run_as: run_as,
|
||||||
|
@ -247,7 +263,10 @@ function execute() {
|
||||||
var editor;
|
var editor;
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
systemUserId = $('#system-users-select').val();
|
systemUserId = $('#system-users-select').val();
|
||||||
$(".select2").select2().on('select2:select', function(evt) {
|
$(".select2").select2({
|
||||||
|
dropdownAutoWidth : true,
|
||||||
|
width: 'auto'
|
||||||
|
}).on('select2:select', function(evt) {
|
||||||
var data = evt.params.data;
|
var data = evt.params.data;
|
||||||
systemUserId = data.id;
|
systemUserId = data.id;
|
||||||
initTree();
|
initTree();
|
||||||
|
|
|
@ -3,6 +3,18 @@
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load common_tags %}
|
{% load common_tags %}
|
||||||
|
|
||||||
|
{% block custom_head_css_js %}
|
||||||
|
<link href="{% static "css/plugins/footable/footable.core.css" %}" rel="stylesheet">
|
||||||
|
<link href="{% static 'css/plugins/datepicker/datepicker3.css' %}" rel="stylesheet">
|
||||||
|
<link href="{% static 'css/plugins/select2/select2.min.css' %}" rel="stylesheet">
|
||||||
|
<script src="{% static 'js/plugins/select2/select2.full.min.js' %}"></script>
|
||||||
|
<style>
|
||||||
|
#search_btn {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block content_left_head %}
|
{% block content_left_head %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -39,7 +51,9 @@
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block table_head %}
|
{% block table_container %}
|
||||||
|
<table class="footable table table-stripped table-bordered toggle-arrow-tiny" data-page="false" >
|
||||||
|
<thead>
|
||||||
<th class="text-center"></th>
|
<th class="text-center"></th>
|
||||||
<th class="text-center">{% trans 'Hosts' %}</th>
|
<th class="text-center">{% trans 'Hosts' %}</th>
|
||||||
<th class="text-center">{% trans 'User' %}</th>
|
<th class="text-center">{% trans 'User' %}</th>
|
||||||
|
@ -49,36 +63,37 @@
|
||||||
<th class="text-center">{% trans 'Finished' %}</th>
|
<th class="text-center">{% trans 'Finished' %}</th>
|
||||||
<th class="text-center">{% trans 'Success' %}</th>
|
<th class="text-center">{% trans 'Success' %}</th>
|
||||||
<th class="text-center">{% trans 'Date start' %}</th>
|
<th class="text-center">{% trans 'Date start' %}</th>
|
||||||
<th class="text-center">{% trans 'Date finished' %}</th>
|
</thead>
|
||||||
{% endblock %}
|
<tbody>
|
||||||
|
|
||||||
{% block table_body %}
|
|
||||||
{% for object in object_list %}
|
{% for object in object_list %}
|
||||||
<tr class="gradeX">
|
<tr class="gradeX">
|
||||||
<td class="text-center"><input type="checkbox" class="cbx-term"></td>
|
<td>{{ forloop.counter }}</td>
|
||||||
<td class="text-center hosts">{{ object.get_hosts_names }}</td>
|
<td class="text-center hosts" value="{{ object.get_hosts_names }}"></td>
|
||||||
<td class="text-center">{{ object.user }}</td>
|
<td class="text-center">{{ object.user.name }}</td>
|
||||||
<td class="text-center">{{ object.command| truncatechars:16 }}</td>
|
<td class="text-center">{{ object.command| truncatechars:16 }}</td>
|
||||||
<td class="text-center">{{ object.run_as }}</td>
|
<td class="text-center">{{ object.run_as.username }}</td>
|
||||||
<td class="text-center"><a href="{% url "ops:celery-task-log" pk=object.id %}" target="_blank">查看</a></td>
|
<td class="text-center"><a href="{% url "ops:celery-task-log" pk=object.id %}" target="_blank">查看</a></td>
|
||||||
<td class="text-center">{{ object.is_finished | state_show | safe }}</td>
|
<td class="text-center">{{ object.is_finished | state_show | safe }}</td>
|
||||||
<td class="text-center">{{ object.is_success | state_show | safe }}</td>
|
<td class="text-center">{{ object.is_success | state_show | safe }}</td>
|
||||||
<td class="text-center">{{ object.date_start }}</td>
|
<td class="text-center">{{ object.date_start }}</td>
|
||||||
<td class="text-center">{{ object.date_finished }}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||||
|
<script src="{% static "js/plugins/footable/footable.all.min.js" %}"></script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$('table').DataTable({
|
{#$('table').DataTable({#}
|
||||||
"searching": false,
|
{# "searching": false,#}
|
||||||
"paging": false,
|
{# "paging": false,#}
|
||||||
"bInfo" : false,
|
{# "bInfo" : false,#}
|
||||||
"order": []
|
{# "order": []#}
|
||||||
});
|
{# });#}
|
||||||
|
{#$('.footable').footable();#}
|
||||||
$('.select2').select2({
|
$('.select2').select2({
|
||||||
dropdownAutoWidth : true,
|
dropdownAutoWidth : true,
|
||||||
width: 'auto'
|
width: 'auto'
|
||||||
|
@ -92,7 +107,7 @@ $(document).ready(function() {
|
||||||
autoclose: true
|
autoclose: true
|
||||||
});
|
});
|
||||||
$(".hosts").each(function (i) {
|
$(".hosts").each(function (i) {
|
||||||
var data = $(this).text();
|
var data = $(this).attr('value');
|
||||||
var data_list = data.split(",");
|
var data_list = data.split(",");
|
||||||
if (data_list.length === 1 && data_list[0] === "") {
|
if (data_list.length === 1 && data_list[0] === "") {
|
||||||
data_list.pop();
|
data_list.pop();
|
||||||
|
@ -101,7 +116,6 @@ $(document).ready(function() {
|
||||||
$(this).html(html);
|
$(this).html(html);
|
||||||
});
|
});
|
||||||
$('[data-toggle="popover"]').popover();
|
$('[data-toggle="popover"]').popover();
|
||||||
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -227,8 +227,9 @@ class UserGrantedNodesWithAssetsAsTreeApi(ListAPIView):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_asset_to_tree_node(node, asset, system_users):
|
def parse_asset_to_tree_node(node, asset, system_users):
|
||||||
|
system_users_protocol_matched = [s for s in system_users if s.protocol == asset.protocol]
|
||||||
system_user_serializer = serializers.GrantedSystemUserSerializer(
|
system_user_serializer = serializers.GrantedSystemUserSerializer(
|
||||||
system_users, many=True
|
system_users_protocol_matched, many=True
|
||||||
)
|
)
|
||||||
asset_serializer = serializers.GrantedAssetSerializer(asset)
|
asset_serializer = serializers.GrantedAssetSerializer(asset)
|
||||||
icon_skin = 'file'
|
icon_skin = 'file'
|
||||||
|
|
Loading…
Reference in New Issue