mirror of https://github.com/jumpserver/jumpserver
完成上传下载
parent
0e6fd89f0b
commit
77da01d1ee
|
@ -694,6 +694,10 @@ class Nav(object):
|
||||||
logger.debug('Upload tmp dir: %s' % tmp_dir)
|
logger.debug('Upload tmp dir: %s' % tmp_dir)
|
||||||
os.chdir(tmp_dir)
|
os.chdir(tmp_dir)
|
||||||
bash('rz')
|
bash('rz')
|
||||||
|
check_notempty = os.listdir(tmp_dir)
|
||||||
|
if not check_notempty:
|
||||||
|
print color_print("上传文件为空")
|
||||||
|
continue
|
||||||
runner = MyRunner(res)
|
runner = MyRunner(res)
|
||||||
runner.run('copy', module_args='src=%s dest=%s directory_mode'
|
runner.run('copy', module_args='src=%s dest=%s directory_mode'
|
||||||
% (tmp_dir, tmp_dir), pattern=pattern)
|
% (tmp_dir, tmp_dir), pattern=pattern)
|
||||||
|
@ -742,7 +746,7 @@ class Nav(object):
|
||||||
ret = runner.get_result()
|
ret = runner.get_result()
|
||||||
os.chdir('/tmp')
|
os.chdir('/tmp')
|
||||||
tmp_dir_name = os.path.basename(tmp_dir)
|
tmp_dir_name = os.path.basename(tmp_dir)
|
||||||
bash('tar czf %s.tar.gz %s && sz %s.tar.gz' % (tmp_dir, tmp_dir_name, tmp_dir))
|
bash('tar czf %s.tar.gz %s ' % (tmp_dir, tmp_dir_name))
|
||||||
|
|
||||||
if ret.get('failed'):
|
if ret.get('failed'):
|
||||||
print ret
|
print ret
|
||||||
|
|
|
@ -293,8 +293,7 @@ def upload(request):
|
||||||
asset_ids = request.POST.getlist('asset_ids', '')
|
asset_ids = request.POST.getlist('asset_ids', '')
|
||||||
upload_files = request.FILES.getlist('file[]', None)
|
upload_files = request.FILES.getlist('file[]', None)
|
||||||
date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||||
upload_dir = "/tmp/%s/%s" % (user.username, date_now)
|
upload_dir = get_tmp_dir()
|
||||||
mkdir(upload_dir, mode=0777)
|
|
||||||
filenames = {}
|
filenames = {}
|
||||||
for asset_id in asset_ids:
|
for asset_id in asset_ids:
|
||||||
asset_select.append(get_object(Asset, id=asset_id))
|
asset_select.append(get_object(Asset, id=asset_id))
|
||||||
|
@ -328,6 +327,36 @@ def upload(request):
|
||||||
|
|
||||||
@login_required(login_url='/login')
|
@login_required(login_url='/login')
|
||||||
def download(request):
|
def download(request):
|
||||||
|
user = request.user
|
||||||
|
assets = get_group_user_perm(user).get('asset').keys()
|
||||||
|
|
||||||
|
asset_select = []
|
||||||
|
if request.method == 'POST':
|
||||||
|
asset_ids = request.POST.getlist('asset_ids', '')
|
||||||
|
file_path = request.POST.get('file_path')
|
||||||
|
date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||||
|
upload_dir = get_tmp_dir()
|
||||||
|
for asset_id in asset_ids:
|
||||||
|
asset_select.append(get_object(Asset, id=asset_id))
|
||||||
|
|
||||||
|
if not set(asset_select).issubset(set(assets)):
|
||||||
|
illegal_asset = set(asset_select).issubset(set(assets))
|
||||||
|
return HttpResponse('没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset]))
|
||||||
|
res = gen_resource({'user': user, 'asset': asset_select})
|
||||||
|
runner = MyRunner(res)
|
||||||
|
runner.run('fetch', module_args='src=%s dest=%s' % (file_path, upload_dir), pattern='*')
|
||||||
|
logger.debug(runner.get_result())
|
||||||
|
os.chdir('/tmp')
|
||||||
|
tmp_dir_name = os.path.basename(upload_dir)
|
||||||
|
tar_file = '%s.tar.gz' % upload_dir
|
||||||
|
bash('tar czf %s %s && sz %s.tar.gz' % (tar_file, tmp_dir_name, upload_dir))
|
||||||
|
f = open(tar_file)
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
response = HttpResponse(data, content_type='application/octet-stream')
|
||||||
|
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(tar_file)
|
||||||
|
return response
|
||||||
|
|
||||||
return render_to_response('download.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('download.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% load mytags %}
|
{% load mytags %}
|
||||||
|
{% block self_head_css_js %}
|
||||||
|
<link href="/static/css/plugins/datepicker/datepicker3.css" rel="stylesheet">
|
||||||
|
<link href="/static/css/plugins/chosen/chosen.css" rel="stylesheet">
|
||||||
|
<script src="/static/js/plugins/chosen/chosen.jquery.js"></script>
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% include 'nav_cat_bar.html' %}
|
{% include 'nav_cat_bar.html' %}
|
||||||
|
|
||||||
|
@ -22,18 +27,56 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<h2>下载文件可联系管理员在服务器安装lrzsz,使用sz命令下载。 </h2>
|
<form id="downForm" class="form-horizontal" method="post">
|
||||||
<div>
|
{% if error %}
|
||||||
{% for document in documents %}
|
<div class="alert alert-warning text-center">{{ error }}</div>
|
||||||
<a href="/download/{{ document }}">{{ document }}</a>
|
{% endif %}
|
||||||
{% endfor %}
|
{% if msg %}
|
||||||
</div>
|
<div class="alert alert-success text-center">{{ msg }}</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="file_path" class="col-sm-2 control-label">文件路径<span class="red-fonts">*</span></label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input id="file_path" name="file_path" placeholder="File Path" type="text" class="form-control">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hr-line-dashed"></div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="user" class="col-sm-2 control-label">选择主机<span class="red-fonts">*</span></label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<select name="asset_ids" id="asset_ids" data-placeholder="请输入" class="chosen-select form-control m-b" multiple tabindex="2">
|
||||||
|
{% for asset in assets %}
|
||||||
|
<option value="{{ asset.id }}">{{ asset.hostname }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-4 col-sm-offset-2">
|
||||||
|
<button class="btn btn-white" type="reset">取消</button>
|
||||||
|
<button id="submit_button" class="btn btn-primary" type="submit">下载</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block self_footer_js %}
|
||||||
|
<script>
|
||||||
|
var config = {
|
||||||
|
'.chosen-select' : {},
|
||||||
|
'.chosen-select-deselect' : {allow_single_deselect:true},
|
||||||
|
'.chosen-select-no-single' : {disable_search_threshold:10},
|
||||||
|
'.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
|
||||||
|
'.chosen-select-width' : {width:"95%"}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var selector in config) {
|
||||||
|
$(selector).chosen(config[selector]);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in New Issue