Merge pull request #2151 from jumpserver/dev

Dev
pull/2187/head
老广 2018-12-12 15:58:57 +08:00 committed by GitHub
commit dbc2779b34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 30 deletions

View File

@ -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>

View File

@ -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();

View File

@ -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 %}

View File

@ -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'