mirror of https://github.com/jumpserver/jumpserver
添加上传
parent
2b14fefb5c
commit
ff77cc28fa
12
connect.py
12
connect.py
|
@ -7,7 +7,6 @@ import re
|
||||||
import ast
|
import ast
|
||||||
import select
|
import select
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
|
||||||
import paramiko
|
import paramiko
|
||||||
import struct
|
import struct
|
||||||
import fcntl
|
import fcntl
|
||||||
|
@ -119,8 +118,9 @@ def log_record(username, host):
|
||||||
except IOError:
|
except IOError:
|
||||||
raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir)
|
raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir)
|
||||||
|
|
||||||
log = Log(user=username, host=host, remote_ip=ip_list, dept_name=dept_name, log_path=log_file_path, start_time=datetime.now(), pid=pid)
|
log = Log(user=username, host=host, remote_ip=ip_list, dept_name=dept_name,
|
||||||
log_file.write('Starttime is %s\n' % datetime.now())
|
log_path=log_file_path, start_time=datetime.datetime.now(), pid=pid)
|
||||||
|
log_file.write('Starttime is %s\n' % datetime.datetime.now())
|
||||||
log.save()
|
log.save()
|
||||||
return log_file, log
|
return log_file, log
|
||||||
|
|
||||||
|
@ -162,11 +162,11 @@ def posix_shell(chan, username, host):
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)
|
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)
|
||||||
log_file.write('Endtime is %s' % datetime.now())
|
log_file.write('Endtime is %s' % datetime.datetime.now())
|
||||||
log_file.close()
|
log_file.close()
|
||||||
log.is_finished = True
|
log.is_finished = True
|
||||||
log.log_finished = False
|
log.log_finished = False
|
||||||
log.end_time = datetime.now()
|
log.end_time = datetime.datetime.now()
|
||||||
log.save()
|
log.save()
|
||||||
print_prompt()
|
print_prompt()
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ def print_user_hostgroup(username):
|
||||||
group_attr = get_user_hostgroup(username)
|
group_attr = get_user_hostgroup(username)
|
||||||
groups = group_attr.keys()
|
groups = group_attr.keys()
|
||||||
for g in groups:
|
for g in groups:
|
||||||
print "[%3s]%s -- %s" % (group_attr[g][0], g, group_attr[g][1])
|
print "[%3s] %s -- %s" % (group_attr[g][0], g, group_attr[g][1])
|
||||||
|
|
||||||
|
|
||||||
def print_user_hostgroup_host(username, gid):
|
def print_user_hostgroup_host(username, gid):
|
||||||
|
|
|
@ -16,7 +16,7 @@ class Perm(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class CmdGroup(models.Model):
|
class CmdGroup(models.Model):
|
||||||
name = models.CharField(max_length=50)
|
name = models.CharField(max_length=50, unique=True)
|
||||||
cmd = models.CharField(max_length=999)
|
cmd = models.CharField(max_length=999)
|
||||||
dept = models.ForeignKey(DEPT)
|
dept = models.ForeignKey(DEPT)
|
||||||
comment = models.CharField(blank=True, null=True, max_length=50)
|
comment = models.CharField(blank=True, null=True, max_length=50)
|
||||||
|
|
|
@ -23,6 +23,7 @@ urlpatterns = patterns('jperm.views',
|
||||||
(r'^cmd_list/$', 'cmd_list'),
|
(r'^cmd_list/$', 'cmd_list'),
|
||||||
(r'^cmd_del/$', 'cmd_del'),
|
(r'^cmd_del/$', 'cmd_del'),
|
||||||
(r'^cmd_edit/$', 'cmd_edit'),
|
(r'^cmd_edit/$', 'cmd_edit'),
|
||||||
|
(r'^cmd_detail/$', 'cmd_detail'),
|
||||||
(r'^apply/$', 'perm_apply'),
|
(r'^apply/$', 'perm_apply'),
|
||||||
(r'^apply_show/(\w+)/$', 'perm_apply_log'),
|
(r'^apply_show/(\w+)/$', 'perm_apply_log'),
|
||||||
(r'^apply_exec/$', 'perm_apply_exec'),
|
(r'^apply_exec/$', 'perm_apply_exec'),
|
||||||
|
|
|
@ -3,19 +3,13 @@
|
||||||
import sys
|
import sys
|
||||||
reload(sys)
|
reload(sys)
|
||||||
sys.setdefaultencoding('utf8')
|
sys.setdefaultencoding('utf8')
|
||||||
import datetime
|
|
||||||
|
|
||||||
|
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
from django.http import HttpResponseRedirect, HttpResponse
|
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from juser.models import User, UserGroup, DEPT
|
|
||||||
from jasset.models import Asset, BisGroup
|
|
||||||
from jperm.models import Perm, SudoPerm, CmdGroup, Apply
|
from jperm.models import Perm, SudoPerm, CmdGroup, Apply
|
||||||
from django.core.paginator import Paginator, EmptyPage, InvalidPage
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from jumpserver.views import LDAP_ENABLE, ldap_conn, CONF, page_list_return, pages
|
|
||||||
from jumpserver.api import *
|
from jumpserver.api import *
|
||||||
|
|
||||||
|
|
||||||
|
@ -544,8 +538,6 @@ def cmd_add(request):
|
||||||
error = u"閮ㄩ棬涓嶈兘涓虹┖"
|
error = u"閮ㄩ棬涓嶈兘涓虹┖"
|
||||||
msg = u'鍛戒护缁勬坊鍔犳垚鍔'
|
msg = u'鍛戒护缁勬坊鍔犳垚鍔'
|
||||||
|
|
||||||
return HttpResponseRedirect('/jperm/cmd_list/')
|
|
||||||
|
|
||||||
return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jperm/sudo_cmd_add.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
|
@ -597,7 +589,7 @@ def cmd_edit(request):
|
||||||
def cmd_list(request):
|
def cmd_list(request):
|
||||||
header_title, path1, path2 = u'sudo鍛戒护鏌ョ湅', u'鏉冮檺绠$悊', u'Sudo鍛戒护娣诲姞'
|
header_title, path1, path2 = u'sudo鍛戒护鏌ョ湅', u'鏉冮檺绠$悊', u'Sudo鍛戒护娣诲姞'
|
||||||
|
|
||||||
if request.session.get('role_id', '0') == '2':
|
if is_super_user(request):
|
||||||
cmd_groups = contact_list = CmdGroup.objects.all()
|
cmd_groups = contact_list = CmdGroup.objects.all()
|
||||||
else:
|
else:
|
||||||
user, dept = get_session_user_dept(request)
|
user, dept = get_session_user_dept(request)
|
||||||
|
@ -626,6 +618,16 @@ def cmd_del(request):
|
||||||
return HttpResponseRedirect('/jperm/cmd_list/')
|
return HttpResponseRedirect('/jperm/cmd_list/')
|
||||||
|
|
||||||
|
|
||||||
|
@require_admin
|
||||||
|
def cmd_detail(request):
|
||||||
|
cmd_id = request.GET.get('id')
|
||||||
|
cmd_group = CmdGroup.objects.filter(id=cmd_id)
|
||||||
|
if cmd_group:
|
||||||
|
cmd_group = cmd_group[0]
|
||||||
|
|
||||||
|
return render_to_response('jperm/sudo_cmd_detail.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def perm_apply(request):
|
def perm_apply(request):
|
||||||
header_title, path1, path2 = u'涓绘満鏉冮檺鐢宠', u'鏉冮檺绠$悊', u'鐢宠涓绘満'
|
header_title, path1, path2 = u'涓绘満鏉冮檺鐢宠', u'鏉冮檺绠$悊', u'鐢宠涓绘満'
|
||||||
|
|
|
@ -5,7 +5,7 @@ import ast
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from django import template
|
from django import template
|
||||||
from juser.models import User, UserGroup, DEPT
|
from jperm.models import CmdGroup
|
||||||
from jumpserver.api import *
|
from jumpserver.api import *
|
||||||
from jasset.models import AssetAlias
|
from jasset.models import AssetAlias
|
||||||
|
|
||||||
|
@ -264,3 +264,19 @@ def time_delta(time_before):
|
||||||
return '%s 鍒嗛挓鍓' % mins
|
return '%s 鍒嗛挓鍓' % mins
|
||||||
else:
|
else:
|
||||||
return '%s 绉掑墠' % delta.seconds
|
return '%s 绉掑墠' % delta.seconds
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter(name='sudo_cmd_list')
|
||||||
|
def sudo_cmd_list(cmd_group_id):
|
||||||
|
cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
|
||||||
|
if cmd_group:
|
||||||
|
cmd_group = cmd_group[0]
|
||||||
|
return cmd_group.cmd.split(',')
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter(name='sudo_cmd_count')
|
||||||
|
def sudo_cmd_count(cmd_group_id):
|
||||||
|
cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
|
||||||
|
if cmd_group:
|
||||||
|
cmd_group = cmd_group[0]
|
||||||
|
return len(cmd_group.cmd.split(','))
|
||||||
|
|
|
@ -144,11 +144,14 @@ def index(request):
|
||||||
active_users = User.objects.filter(is_active=1)
|
active_users = User.objects.filter(is_active=1)
|
||||||
active_hosts = Asset.objects.filter(is_active=1)
|
active_hosts = Asset.objects.filter(is_active=1)
|
||||||
|
|
||||||
|
users_total = users.count() if users.count() else 1
|
||||||
|
hosts_total = hosts.count() if hosts.count() else 1
|
||||||
|
|
||||||
# percent of dashboard
|
# percent of dashboard
|
||||||
percent_user = format(active_users.count() / users.count(), '.0%')
|
percent_user = format(active_users.count() / users_total, '.0%')
|
||||||
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
|
percent_host = format(active_hosts.count() / hosts_total, '.0%')
|
||||||
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
percent_online_user = format(online_user.count() / users_total, '.0%')
|
||||||
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
|
percent_online_host = format(online_host.count() / hosts_total, '.0%')
|
||||||
|
|
||||||
li_date, li_str = getDaysByNum(7)
|
li_date, li_str = getDaysByNum(7)
|
||||||
today = datetime.datetime.now().day
|
today = datetime.datetime.now().day
|
||||||
|
@ -290,4 +293,12 @@ def install(request):
|
||||||
|
|
||||||
|
|
||||||
def upload(request):
|
def upload(request):
|
||||||
pass
|
if request.method == 'POST':
|
||||||
|
host = request.POST.get('host')
|
||||||
|
path = request.POST.get('path')
|
||||||
|
upload_file = request.FILES.getlist('file', None)
|
||||||
|
|
||||||
|
if upload_file:
|
||||||
|
return HttpResponse(upload_file)
|
||||||
|
|
||||||
|
return render_to_response('upload.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
<!-- highcharts -->
|
<!-- highcharts -->
|
||||||
<script src="/static/js/highcharts/highcharts.js"></script>
|
<script src="/static/js/highcharts/highcharts.js"></script>
|
||||||
|
|
||||||
|
<script src="/static/js/dropzone/dropzone.js"></script>
|
||||||
<!-- active menu -->
|
<!-- active menu -->
|
||||||
<script>
|
<script>
|
||||||
var str = document.location.pathname.split("/")[1];
|
var str = document.location.pathname.split("/")[1];
|
||||||
|
|
|
@ -8,3 +8,4 @@
|
||||||
<!-- validator js -->
|
<!-- validator js -->
|
||||||
<script src="/static/js/validator/jquery.validator.js"></script>
|
<script src="/static/js/validator/jquery.validator.js"></script>
|
||||||
<script src="/static/js/validator/zh_CN.js"></script>
|
<script src="/static/js/validator/zh_CN.js"></script>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
{% load mytags %}
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
{% include 'link_css.html' %}
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
body
|
||||||
|
{
|
||||||
|
background: #FFFFFF;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="row">
|
||||||
|
<div class="contact-box">
|
||||||
|
<h2 class="text-center">{{ cmd_group.name }} 鍛戒护璇︽儏</h2>
|
||||||
|
<div class="ibox-content">
|
||||||
|
|
||||||
|
<table class="table table-striped table-bordered table-hover " id="editable" >
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td class="text-center" width="120">ID</td>
|
||||||
|
<td class="text-center">鍚嶇О</td>
|
||||||
|
<td class="text-center">閮ㄩ棬</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="gradeX">
|
||||||
|
<td class="text-center">{{ cmd_group.id }}</td>
|
||||||
|
<td class="text-center">{{ cmd_group.name }}</td>
|
||||||
|
<td class="text-center">{{ cmd_group.dept.name }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="1" class="text-center">鍛戒护锛</td>
|
||||||
|
<td colspan="6" class="text-center">
|
||||||
|
<b>{{ cmd_group.cmd }}</b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -69,7 +69,7 @@
|
||||||
<td class="text-center"><a href="/juser/user_list/?gid={{ group.id }}">{{ group.id | member_count }} </a> </td>
|
<td class="text-center"><a href="/juser/user_list/?gid={{ group.id }}">{{ group.id | member_count }} </a> </td>
|
||||||
<td class="text-center"><a href="/jasset/group_list/?sid={{ group.id }}">{{ group.id | ugrp_perm_agrp_count }} </a> </td>
|
<td class="text-center"><a href="/jasset/group_list/?sid={{ group.id }}">{{ group.id | ugrp_perm_agrp_count }} </a> </td>
|
||||||
<td class="text-center"><a href="/jasset/host_list/?sid={{ group.id }}"> {{ group.id | ugrp_perm_asset_count }} </a> </td>
|
<td class="text-center"><a href="/jasset/host_list/?sid={{ group.id }}"> {{ group.id | ugrp_perm_asset_count }} </a> </td>
|
||||||
<td class="text-center"> {{ group.id | ugrp_perm_asset_count }} </td>
|
<td class="text-center"><a value="/jperm/cmd_detail/?id={{ group.id }}" class="iframe">{{ group.id | sudo_cmd_count }}</a> </td>
|
||||||
<td class="text-center"> {{ group.comment }} </td>
|
<td class="text-center"> {{ group.comment }} </td>
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<a href="../sudo_edit/?id={{ group.id }}" class="btn btn-xs btn-danger">sudo鎺堟潈</a>
|
<a href="../sudo_edit/?id={{ group.id }}" class="btn btn-xs btn-danger">sudo鎺堟潈</a>
|
||||||
|
@ -104,7 +104,20 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
$(".iframe").colorbox({iframe:true, width:"70%", height:"70%"});
|
$(".iframe").on('click', function(){
|
||||||
|
var url= $(this).attr("value");
|
||||||
|
$.layer({
|
||||||
|
type: 2,
|
||||||
|
title: '鍛戒护璇︽儏',
|
||||||
|
maxmin: true,
|
||||||
|
shift: 'top',
|
||||||
|
border: [2, 0.3, '#1AB394'],
|
||||||
|
shade: [0.5, '#000000'],
|
||||||
|
shadeClose: true,
|
||||||
|
area : ['800px' , '600px'],
|
||||||
|
iframe: {src: url}
|
||||||
|
});
|
||||||
|
});
|
||||||
$("#refresh").click(function(){
|
$("#refresh").click(function(){
|
||||||
$.get('/jperm/sudo_refresh/',
|
$.get('/jperm/sudo_refresh/',
|
||||||
{'test':''},
|
{'test':''},
|
||||||
|
|
|
@ -7,3 +7,5 @@
|
||||||
<link href="/static/css/vaildator/jquery.validator.css" rel="stylesheet">
|
<link href="/static/css/vaildator/jquery.validator.css" rel="stylesheet">
|
||||||
<link href="/static/css/magnific/magnific-popup.css" rel="stylesheet">
|
<link href="/static/css/magnific/magnific-popup.css" rel="stylesheet">
|
||||||
<link href="/static/css/plugins/fullcalendar/fullcalendar.css" rel="stylesheet">
|
<link href="/static/css/plugins/fullcalendar/fullcalendar.css" rel="stylesheet">
|
||||||
|
<link href="/static/css/plugins/dropzone/basic.css" rel="stylesheet">
|
||||||
|
<link href="/static/css/plugins/dropzone/dropzone.css" rel="stylesheet">
|
|
@ -0,0 +1,80 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load mytags %}
|
||||||
|
{% load humanize %}
|
||||||
|
{% block content %}
|
||||||
|
{% include 'nav_cat_bar.html' %}
|
||||||
|
|
||||||
|
<div class="wrapper wrapper-content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="ibox float-e-margins">
|
||||||
|
<div class="ibox-title">
|
||||||
|
<h5>Dropzone Area</h5>
|
||||||
|
<div class="ibox-tools">
|
||||||
|
<a class="collapse-link">
|
||||||
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="fa fa-wrench"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-user">
|
||||||
|
<li><a href="#">Config option 1</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="#">Config option 2</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<a class="close-link">
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ibox-content">
|
||||||
|
<form id="my-awesome-dropzone" class="dropzone" action="#">
|
||||||
|
<div class="dropzone-previews"></div>
|
||||||
|
<button type="submit" class="btn btn-primary pull-right">Submit this form!</button>
|
||||||
|
</form>
|
||||||
|
<div>
|
||||||
|
<div class="m text-right"><small>DropzoneJS is an open source library that provides drag'n'drop file uploads with image previews: <a href="https://github.com/enyo/dropzone" target="_blank">https://github.com/enyo/dropzone</a></small> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
|
||||||
|
Dropzone.options.myAwesomeDropzone = {
|
||||||
|
|
||||||
|
autoProcessQueue: false,
|
||||||
|
uploadMultiple: true,
|
||||||
|
parallelUploads: 100,
|
||||||
|
maxFiles: 100,
|
||||||
|
url: '/upload/',
|
||||||
|
|
||||||
|
// Dropzone settings
|
||||||
|
init: function() {
|
||||||
|
var myDropzone = this;
|
||||||
|
this.element.querySelector("button[type=submit]").addEventListener("click", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
myDropzone.processQueue();
|
||||||
|
});
|
||||||
|
this.on("sendingmultiple", function() {
|
||||||
|
});
|
||||||
|
this.on("successmultiple", function(files, response) {
|
||||||
|
alert(files)
|
||||||
|
});
|
||||||
|
this.on("errormultiple", function(files, response) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
Loading鈥
Reference in New Issue