mirror of https://github.com/jumpserver/jumpserver
commit
dbc2779b34
|
@ -77,6 +77,10 @@
|
|||
<td>{% trans 'Admin user' %}:</td>
|
||||
<td><b>{{ asset.admin_user }}</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{% trans 'Domain' %}:</td>
|
||||
<td><b>{{ asset.domain|default:"" }}</b></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{% trans 'Vendor' %}:</td>
|
||||
<td><b>{{ asset.vendor|default:"" }}</b></td>
|
||||
|
|
|
@ -171,7 +171,7 @@ function initResultTerminal() {
|
|||
cursorBlink: false,
|
||||
screenKeys: false,
|
||||
fontFamily: '"Monaco", "Consolas", "monospace"',
|
||||
fontSize: 12,
|
||||
fontSize: 13,
|
||||
rightClickSelectsWord: true,
|
||||
disableStdin: true,
|
||||
theme: {
|
||||
|
@ -182,6 +182,10 @@ function initResultTerminal() {
|
|||
term.write("选择左侧资产, 选择运行的系统用户,批量执行命令\r\n")
|
||||
}
|
||||
|
||||
function wrapperError(msg) {
|
||||
return '\033[31m' + msg + '\033[0m' + '\r\n';
|
||||
}
|
||||
|
||||
function execute() {
|
||||
if (!term) {
|
||||
initResultTerminal()
|
||||
|
@ -192,6 +196,18 @@ function execute() {
|
|||
var hosts = getSelectedAssetsNode().map(function (node) {
|
||||
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 = {
|
||||
hosts: hosts,
|
||||
run_as: run_as,
|
||||
|
@ -247,7 +263,10 @@ function execute() {
|
|||
var editor;
|
||||
$(document).ready(function(){
|
||||
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;
|
||||
systemUserId = data.id;
|
||||
initTree();
|
||||
|
|
|
@ -3,6 +3,18 @@
|
|||
{% load static %}
|
||||
{% 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 %}
|
||||
{% endblock %}
|
||||
|
||||
|
@ -39,7 +51,9 @@
|
|||
</form>
|
||||
{% 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">{% trans 'Hosts' %}</th>
|
||||
<th class="text-center">{% trans 'User' %}</th>
|
||||
|
@ -49,36 +63,37 @@
|
|||
<th class="text-center">{% trans 'Finished' %}</th>
|
||||
<th class="text-center">{% trans 'Success' %}</th>
|
||||
<th class="text-center">{% trans 'Date start' %}</th>
|
||||
<th class="text-center">{% trans 'Date finished' %}</th>
|
||||
{% endblock %}
|
||||
|
||||
{% block table_body %}
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for object in object_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center"><input type="checkbox" class="cbx-term"></td>
|
||||
<td class="text-center hosts">{{ object.get_hosts_names }}</td>
|
||||
<td class="text-center">{{ object.user }}</td>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<td class="text-center hosts" value="{{ object.get_hosts_names }}"></td>
|
||||
<td class="text-center">{{ object.user.name }}</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">{{ object.is_finished | 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_finished }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
||||
|
||||
{% block custom_foot_js %}
|
||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||
<script src="{% static "js/plugins/footable/footable.all.min.js" %}"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('table').DataTable({
|
||||
"searching": false,
|
||||
"paging": false,
|
||||
"bInfo" : false,
|
||||
"order": []
|
||||
});
|
||||
{#$('table').DataTable({#}
|
||||
{# "searching": false,#}
|
||||
{# "paging": false,#}
|
||||
{# "bInfo" : false,#}
|
||||
{# "order": []#}
|
||||
{# });#}
|
||||
{#$('.footable').footable();#}
|
||||
$('.select2').select2({
|
||||
dropdownAutoWidth : true,
|
||||
width: 'auto'
|
||||
|
@ -92,7 +107,7 @@ $(document).ready(function() {
|
|||
autoclose: true
|
||||
});
|
||||
$(".hosts").each(function (i) {
|
||||
var data = $(this).text();
|
||||
var data = $(this).attr('value');
|
||||
var data_list = data.split(",");
|
||||
if (data_list.length === 1 && data_list[0] === "") {
|
||||
data_list.pop();
|
||||
|
@ -101,7 +116,6 @@ $(document).ready(function() {
|
|||
$(this).html(html);
|
||||
});
|
||||
$('[data-toggle="popover"]').popover();
|
||||
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -227,8 +227,9 @@ class UserGrantedNodesWithAssetsAsTreeApi(ListAPIView):
|
|||
|
||||
@staticmethod
|
||||
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_users, many=True
|
||||
system_users_protocol_matched, many=True
|
||||
)
|
||||
asset_serializer = serializers.GrantedAssetSerializer(asset)
|
||||
icon_skin = 'file'
|
||||
|
|
Loading…
Reference in New Issue